summaryrefslogtreecommitdiffstats
path: root/examples/demo
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:24:15 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:24:15 -0500
commitbd0f3345a938b35ce6a12f6150373b0955b8dd12 (patch)
tree7a520322212d48ebcb9fbe1087e7fca28b76185c /examples/demo
downloadqt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.tar.gz
qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.zip
Add Qt3 development HEAD version
Diffstat (limited to 'examples/demo')
-rw-r--r--examples/demo/categoryinterface.h32
-rw-r--r--examples/demo/demo.doc15
-rw-r--r--examples/demo/demo.pro105
-rw-r--r--examples/demo/demo_pch.h13
-rw-r--r--examples/demo/display.cpp230
-rw-r--r--examples/demo/display.h93
-rw-r--r--examples/demo/dnd/dnd.cpp120
-rw-r--r--examples/demo/dnd/dnd.h40
-rw-r--r--examples/demo/dnd/dndbase.ui355
-rw-r--r--examples/demo/dnd/iconview.cpp42
-rw-r--r--examples/demo/dnd/iconview.h31
-rw-r--r--examples/demo/dnd/listview.cpp72
-rw-r--r--examples/demo/dnd/listview.h35
-rw-r--r--examples/demo/dnd/styledbutton.cpp308
-rw-r--r--examples/demo/dnd/styledbutton.h106
-rw-r--r--examples/demo/frame.cpp152
-rw-r--r--examples/demo/frame.h45
-rw-r--r--examples/demo/graph.cpp445
-rw-r--r--examples/demo/graph.h31
-rw-r--r--examples/demo/i18n/en.po848
-rw-r--r--examples/demo/i18n/en.qmbin0 -> 15533 bytes
-rw-r--r--examples/demo/i18n/i18n.cpp253
-rw-r--r--examples/demo/i18n/i18n.h44
-rw-r--r--examples/demo/i18n/ja.po847
-rw-r--r--examples/demo/i18n/ja.qmbin0 -> 14241 bytes
-rw-r--r--examples/demo/i18n/ko.po847
-rw-r--r--examples/demo/i18n/ko.qmbin0 -> 14379 bytes
-rw-r--r--examples/demo/i18n/no.po847
-rw-r--r--examples/demo/i18n/no.qmbin0 -> 15821 bytes
-rw-r--r--examples/demo/i18n/wrapper.h21
-rw-r--r--examples/demo/icons.h1938
-rw-r--r--examples/demo/main.cpp377
-rw-r--r--examples/demo/opengl/fbm.c207
-rw-r--r--examples/demo/opengl/fbm.h39
-rw-r--r--examples/demo/opengl/gear.xpm304
-rw-r--r--examples/demo/opengl/glbox.cpp142
-rw-r--r--examples/demo/opengl/glbox.h43
-rw-r--r--examples/demo/opengl/glcontrolwidget.cpp195
-rw-r--r--examples/demo/opengl/glcontrolwidget.h56
-rw-r--r--examples/demo/opengl/glgear.cpp271
-rw-r--r--examples/demo/opengl/glgear.h26
-rw-r--r--examples/demo/opengl/glinfo.h26
-rw-r--r--examples/demo/opengl/glinfo_x11.cpp257
-rw-r--r--examples/demo/opengl/glinfotext.h23
-rw-r--r--examples/demo/opengl/gllandscape.cpp880
-rw-r--r--examples/demo/opengl/gllandscape.h98
-rw-r--r--examples/demo/opengl/gllandscapeviewer.ui623
-rw-r--r--examples/demo/opengl/gllandscapeviewer.ui.h37
-rw-r--r--examples/demo/opengl/gllogo.bmpbin0 -> 17462 bytes
-rw-r--r--examples/demo/opengl/gltexobj.cpp210
-rw-r--r--examples/demo/opengl/gltexobj.h44
-rw-r--r--examples/demo/opengl/glworkspace.cpp212
-rw-r--r--examples/demo/opengl/glworkspace.h37
-rw-r--r--examples/demo/opengl/nurbs.xpm305
-rw-r--r--examples/demo/opengl/printpreview.ui277
-rw-r--r--examples/demo/opengl/printpreview.ui.h70
-rw-r--r--examples/demo/opengl/qtlogo.bmpbin0 -> 17462 bytes
-rw-r--r--examples/demo/opengl/qtlogo.pngbin0 -> 5206 bytes
-rw-r--r--examples/demo/opengl/snapshot.xpm238
-rw-r--r--examples/demo/opengl/texture.xpm130
-rw-r--r--examples/demo/opengl/wirebox.xpm155
-rw-r--r--examples/demo/qasteroids/bg.pngbin0 -> 4011 bytes
-rw-r--r--examples/demo/qasteroids/ledmeter.cpp117
-rw-r--r--examples/demo/qasteroids/ledmeter.h53
-rw-r--r--examples/demo/qasteroids/sounds/Explosion.wavbin0 -> 18427 bytes
-rw-r--r--examples/demo/qasteroids/sprites.h129
-rw-r--r--examples/demo/qasteroids/sprites/.pbm0
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits.ini9
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits.pov31
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0000.pngbin0 -> 215 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0001.pngbin0 -> 236 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0002.pngbin0 -> 244 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0003.pngbin0 -> 277 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0004.pngbin0 -> 259 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0005.pngbin0 -> 251 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0006.pngbin0 -> 214 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0007.pngbin0 -> 177 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0008.pngbin0 -> 175 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0009.pngbin0 -> 221 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0010.pngbin0 -> 243 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0011.pngbin0 -> 272 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0012.pngbin0 -> 265 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0013.pngbin0 -> 253 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0014.pngbin0 -> 214 bytes
-rw-r--r--examples/demo/qasteroids/sprites/bits/bits0015.pngbin0 -> 196 bytes
-rw-r--r--examples/demo/qasteroids/sprites/exhaust/exhaust.pngbin0 -> 121 bytes
-rw-r--r--examples/demo/qasteroids/sprites/missile/missile.pngbin0 -> 117 bytes
-rw-r--r--examples/demo/qasteroids/sprites/powerups/brake.pngbin0 -> 179 bytes
-rw-r--r--examples/demo/qasteroids/sprites/powerups/energy.pngbin0 -> 169 bytes
-rw-r--r--examples/demo/qasteroids/sprites/powerups/shield.pngbin0 -> 196 bytes
-rw-r--r--examples/demo/qasteroids/sprites/powerups/shoot.pngbin0 -> 250 bytes
-rw-r--r--examples/demo/qasteroids/sprites/powerups/teleport.pngbin0 -> 196 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock1.ini9
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock1.pov26
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10000.pngbin0 -> 2635 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10001.pngbin0 -> 2599 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10002.pngbin0 -> 2629 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10003.pngbin0 -> 2594 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10004.pngbin0 -> 2560 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10005.pngbin0 -> 2530 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10006.pngbin0 -> 2532 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10007.pngbin0 -> 2530 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10008.pngbin0 -> 2447 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10009.pngbin0 -> 2355 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10010.pngbin0 -> 2333 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10011.pngbin0 -> 2297 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10012.pngbin0 -> 2320 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10013.pngbin0 -> 2360 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10014.pngbin0 -> 2404 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10015.pngbin0 -> 2460 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10016.pngbin0 -> 2552 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10017.pngbin0 -> 2587 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10018.pngbin0 -> 2601 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10019.pngbin0 -> 2661 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10020.pngbin0 -> 2654 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10021.pngbin0 -> 2656 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10022.pngbin0 -> 2623 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10023.pngbin0 -> 2566 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10024.pngbin0 -> 2547 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10025.pngbin0 -> 2544 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10026.pngbin0 -> 2544 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10027.pngbin0 -> 2620 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10028.pngbin0 -> 2646 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10029.pngbin0 -> 2613 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10030.pngbin0 -> 2688 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock1/rock10031.pngbin0 -> 2664 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock2.ini9
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock2.pov26
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20000.pngbin0 -> 1338 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20001.pngbin0 -> 1376 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20002.pngbin0 -> 1391 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20003.pngbin0 -> 1389 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20004.pngbin0 -> 1372 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20005.pngbin0 -> 1401 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20006.pngbin0 -> 1361 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20007.pngbin0 -> 1369 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20008.pngbin0 -> 1368 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20009.pngbin0 -> 1313 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20010.pngbin0 -> 1340 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20011.pngbin0 -> 1324 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20012.pngbin0 -> 1350 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20013.pngbin0 -> 1337 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20014.pngbin0 -> 1341 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20015.pngbin0 -> 1375 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20016.pngbin0 -> 1371 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20017.pngbin0 -> 1354 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20018.pngbin0 -> 1333 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20019.pngbin0 -> 1362 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20020.pngbin0 -> 1379 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20021.pngbin0 -> 1402 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20022.pngbin0 -> 1420 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20023.pngbin0 -> 1403 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20024.pngbin0 -> 1450 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20025.pngbin0 -> 1376 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20026.pngbin0 -> 1376 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20027.pngbin0 -> 1332 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20028.pngbin0 -> 1353 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20029.pngbin0 -> 1376 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20030.pngbin0 -> 1307 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock2/rock20031.pngbin0 -> 1326 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock3.ini9
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock3.pov26
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30000.pngbin0 -> 738 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30001.pngbin0 -> 730 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30002.pngbin0 -> 770 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30003.pngbin0 -> 766 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30004.pngbin0 -> 770 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30005.pngbin0 -> 757 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30006.pngbin0 -> 761 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30007.pngbin0 -> 750 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30008.pngbin0 -> 748 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30009.pngbin0 -> 753 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30010.pngbin0 -> 727 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30011.pngbin0 -> 737 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30012.pngbin0 -> 724 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30013.pngbin0 -> 751 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30014.pngbin0 -> 720 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30015.pngbin0 -> 742 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30016.pngbin0 -> 723 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30017.pngbin0 -> 722 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30018.pngbin0 -> 716 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30019.pngbin0 -> 735 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30020.pngbin0 -> 735 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30021.pngbin0 -> 731 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30022.pngbin0 -> 735 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30023.pngbin0 -> 732 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30024.pngbin0 -> 727 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30025.pngbin0 -> 721 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30026.pngbin0 -> 716 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30027.pngbin0 -> 721 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30028.pngbin0 -> 739 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30029.pngbin0 -> 740 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30030.pngbin0 -> 727 bytes
-rw-r--r--examples/demo/qasteroids/sprites/rock3/rock30031.pngbin0 -> 715 bytes
-rw-r--r--examples/demo/qasteroids/sprites/shield/shield0000.pngbin0 -> 1744 bytes
-rw-r--r--examples/demo/qasteroids/sprites/shield/shield0001.pngbin0 -> 1771 bytes
-rw-r--r--examples/demo/qasteroids/sprites/shield/shield0002.pngbin0 -> 1891 bytes
-rw-r--r--examples/demo/qasteroids/sprites/shield/shield0003.pngbin0 -> 1938 bytes
-rw-r--r--examples/demo/qasteroids/sprites/shield/shield0004.pngbin0 -> 1789 bytes
-rw-r--r--examples/demo/qasteroids/sprites/shield/shield0005.pngbin0 -> 1948 bytes
-rw-r--r--examples/demo/qasteroids/sprites/shield/shield0006.pngbin0 -> 1954 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship.ini9
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship.pov128
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0000.pngbin0 -> 1819 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0001.pngbin0 -> 1949 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0002.pngbin0 -> 1962 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0003.pngbin0 -> 1974 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0004.pngbin0 -> 2058 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0005.pngbin0 -> 2103 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0006.pngbin0 -> 2055 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0007.pngbin0 -> 1961 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0008.pngbin0 -> 1861 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0009.pngbin0 -> 1976 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0010.pngbin0 -> 2023 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0011.pngbin0 -> 2086 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0012.pngbin0 -> 2024 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0013.pngbin0 -> 1997 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0014.pngbin0 -> 1951 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0015.pngbin0 -> 1883 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0016.pngbin0 -> 1827 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0017.pngbin0 -> 1932 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0018.pngbin0 -> 1998 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0019.pngbin0 -> 2025 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0020.pngbin0 -> 2083 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0021.pngbin0 -> 2090 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0022.pngbin0 -> 2026 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0023.pngbin0 -> 1937 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0024.pngbin0 -> 1811 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0025.pngbin0 -> 1958 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0026.pngbin0 -> 2033 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0027.pngbin0 -> 2066 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0028.pngbin0 -> 2069 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0029.pngbin0 -> 2077 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0030.pngbin0 -> 2054 bytes
-rw-r--r--examples/demo/qasteroids/sprites/ship/ship0031.pngbin0 -> 1948 bytes
-rw-r--r--examples/demo/qasteroids/toplevel.cpp494
-rw-r--r--examples/demo/qasteroids/toplevel.h79
-rw-r--r--examples/demo/qasteroids/view.cpp908
-rw-r--r--examples/demo/qasteroids/view.h138
-rw-r--r--examples/demo/qthumbwheel.cpp301
-rw-r--r--examples/demo/qthumbwheel.h119
-rw-r--r--examples/demo/sql/book.sql42
-rw-r--r--examples/demo/sql/connect.ui244
-rw-r--r--examples/demo/sql/connect.ui.h20
-rw-r--r--examples/demo/sql/sqlex.ui309
-rw-r--r--examples/demo/sql/sqlex.ui.h126
-rw-r--r--examples/demo/textdrawing/bidi.txt6
-rw-r--r--examples/demo/textdrawing/editcopy.pngbin0 -> 485 bytes
-rw-r--r--examples/demo/textdrawing/editcut.pngbin0 -> 537 bytes
-rw-r--r--examples/demo/textdrawing/editdelete.pngbin0 -> 833 bytes
-rw-r--r--examples/demo/textdrawing/editlower.pngbin0 -> 609 bytes
-rw-r--r--examples/demo/textdrawing/editpaste.pngbin0 -> 907 bytes
-rw-r--r--examples/demo/textdrawing/editraise.pngbin0 -> 614 bytes
-rw-r--r--examples/demo/textdrawing/example.html340
-rw-r--r--examples/demo/textdrawing/filenew.pngbin0 -> 386 bytes
-rw-r--r--examples/demo/textdrawing/fileopen.pngbin0 -> 1323 bytes
-rw-r--r--examples/demo/textdrawing/filesave.pngbin0 -> 514 bytes
-rw-r--r--examples/demo/textdrawing/help.pngbin0 -> 1561 bytes
-rw-r--r--examples/demo/textdrawing/helpwindow.cpp337
-rw-r--r--examples/demo/textdrawing/helpwindow.h64
-rw-r--r--examples/demo/textdrawing/home.pngbin0 -> 1081 bytes
-rw-r--r--examples/demo/textdrawing/next.pngbin0 -> 541 bytes
-rw-r--r--examples/demo/textdrawing/previous.pngbin0 -> 542 bytes
-rw-r--r--examples/demo/textdrawing/print.pngbin0 -> 742 bytes
-rw-r--r--examples/demo/textdrawing/redo.pngbin0 -> 816 bytes
-rw-r--r--examples/demo/textdrawing/textbold.pngbin0 -> 494 bytes
-rw-r--r--examples/demo/textdrawing/textcenter.pngbin0 -> 429 bytes
-rw-r--r--examples/demo/textdrawing/textedit.cpp477
-rw-r--r--examples/demo/textdrawing/textedit.h85
-rw-r--r--examples/demo/textdrawing/textitalic.pngbin0 -> 442 bytes
-rw-r--r--examples/demo/textdrawing/textjustify.pngbin0 -> 408 bytes
-rw-r--r--examples/demo/textdrawing/textleft.pngbin0 -> 409 bytes
-rw-r--r--examples/demo/textdrawing/textright.pngbin0 -> 408 bytes
-rw-r--r--examples/demo/textdrawing/textunderline.pngbin0 -> 471 bytes
-rw-r--r--examples/demo/textdrawing/undo.pngbin0 -> 800 bytes
-rw-r--r--examples/demo/translations/demo_ar.qmbin0 -> 9915 bytes
-rw-r--r--examples/demo/translations/demo_ar.ts1492
-rw-r--r--examples/demo/translations/demo_de.qmbin0 -> 623 bytes
-rw-r--r--examples/demo/translations/demo_de.ts1183
-rw-r--r--examples/demo/translations/demo_fr.qmbin0 -> 337 bytes
-rw-r--r--examples/demo/translations/demo_fr.ts1183
-rw-r--r--examples/demo/translations/demo_he.qmbin0 -> 13115 bytes
-rw-r--r--examples/demo/translations/demo_he.ts1189
-rw-r--r--examples/demo/widgets/widgetsbase.ui1269
-rw-r--r--examples/demo/widgets/widgetsbase.ui.h66
-rw-r--r--examples/demo/widgets/widgetsbase_pro.ui1158
-rw-r--r--examples/demo/widgets/widgetsbase_pro.ui.h64
287 files changed, 25471 insertions, 0 deletions
diff --git a/examples/demo/categoryinterface.h b/examples/demo/categoryinterface.h
new file mode 100644
index 0000000..422881f
--- /dev/null
+++ b/examples/demo/categoryinterface.h
@@ -0,0 +1,32 @@
+#ifndef CATEGORYINTERFACE_H
+#define CATEGORYINTERFACE_H
+
+#include <qstring.h>
+#include <qiconset.h>
+#include <qobject.h>
+
+class QWidgetStack;
+
+class CategoryInterface : public QObject
+{
+ Q_OBJECT
+
+public:
+ CategoryInterface( QWidgetStack *s ) : stack( s ) {}
+ virtual ~CategoryInterface() {}
+ virtual QString name() const = 0;
+ virtual QIconSet icon() const = 0;
+ virtual int numCategories() const = 0;
+ virtual QString categoryName( int i ) const = 0;
+ virtual QIconSet categoryIcon( int i ) const = 0;
+ virtual int categoryOffset() const = 0;
+
+public slots:
+ virtual void setCurrentCategory( int i ) = 0;
+
+protected:
+ QWidgetStack *stack;
+
+};
+
+#endif
diff --git a/examples/demo/demo.doc b/examples/demo/demo.doc
new file mode 100644
index 0000000..10f7135
--- /dev/null
+++ b/examples/demo/demo.doc
@@ -0,0 +1,15 @@
+/*! \page demo-example.html
+
+ \ingroup examples
+ \title Qt Demo
+
+ This program shows off some of Qt's widgets and functionality. It
+ isn't intended as a code example, but rather as a single application
+ that you can run to see many of Qt's features.
+
+ See $QTDIR/examples/demo for the source code.
+
+*/
+
+
+
diff --git a/examples/demo/demo.pro b/examples/demo/demo.pro
new file mode 100644
index 0000000..3413fcd
--- /dev/null
+++ b/examples/demo/demo.pro
@@ -0,0 +1,105 @@
+TEMPLATE = app
+TARGET = demo
+
+CONFIG += qt warn_off release
+unix:LIBS += -lm
+DEFINES += QT_INTERNAL_ICONVIEW
+DEFINES += QT_INTERNAL_WORKSPACE
+DEFINES += QT_INTERNAL_CANVAS
+INCLUDEPATH += .
+DEPENDPATH = ../../include
+
+REQUIRES = full-config nocrosscompiler
+
+HEADERS = frame.h \
+ categoryinterface.h \
+ qthumbwheel.h \
+ display.h \
+ textdrawing/textedit.h \
+ textdrawing/helpwindow.h \
+ dnd/dnd.h \
+ dnd/styledbutton.h \
+ dnd/iconview.h \
+ dnd/listview.h \
+ i18n/i18n.h \
+ i18n/wrapper.h \
+ ../aclock/aclock.h
+SOURCES = frame.cpp \
+ qthumbwheel.cpp \
+ display.cpp \
+ textdrawing/textedit.cpp \
+ textdrawing/helpwindow.cpp \
+ dnd/dnd.cpp \
+ dnd/styledbutton.cpp \
+ dnd/iconview.cpp \
+ dnd/listview.cpp \
+ i18n/i18n.cpp \
+ ../aclock/aclock.cpp \
+ main.cpp
+
+FORMS = dnd/dndbase.ui
+
+include( ../../src/qt_professional.pri )
+
+canvas {
+ HEADERS +=graph.h \
+ qasteroids/toplevel.h \
+ qasteroids/view.h \
+ qasteroids/ledmeter.h
+ SOURCES +=graph.cpp \
+ qasteroids/toplevel.cpp \
+ qasteroids/view.cpp \
+ qasteroids/ledmeter.cpp
+}
+
+opengl {
+ HEADERS +=opengl/glworkspace.h \
+ opengl/glcontrolwidget.h \
+ opengl/gltexobj.h \
+ opengl/glbox.h \
+ opengl/glgear.h \
+ opengl/gllandscape.h \
+ opengl/fbm.h \
+ opengl/glinfo.h \
+ opengl/glinfotext.h
+ SOURCES +=opengl/glworkspace.cpp \
+ opengl/glcontrolwidget.cpp \
+ opengl/gltexobj.cpp \
+ opengl/glbox.cpp \
+ opengl/glgear.cpp \
+ opengl/gllandscape.cpp \
+ opengl/fbm.c
+ win32 {
+ SOURCES +=opengl/glinfo_win.cpp
+ } mac {
+ SOURCES +=opengl/glinfo_mac.cpp
+ LIBS +=-framework Carbon
+ } else:unix {
+ SOURCES +=opengl/glinfo_x11.cpp
+ }
+
+ FORMS +=opengl/printpreview.ui \
+ opengl/gllandscapeviewer.ui
+
+ CONFIG -= dlopen_opengl
+}
+
+sql {
+ FORMS +=sql/connect.ui \
+ sql/sqlex.ui
+}
+
+table {
+ FORMS +=widgets/widgetsbase.ui
+}
+
+!table {
+ FORMS +=widgets/widgetsbase_pro.ui
+}
+
+TRANSLATIONS = translations/demo_ar.ts \
+ translations/demo_de.ts \
+ translations/demo_fr.ts \
+ translations/demo_he.ts
+
+PRECOMPILED_HEADER = demo_pch.h
diff --git a/examples/demo/demo_pch.h b/examples/demo/demo_pch.h
new file mode 100644
index 0000000..b80e646
--- /dev/null
+++ b/examples/demo/demo_pch.h
@@ -0,0 +1,13 @@
+/*
+ * This is a precompiled header file for use in Xcode / Mac GCC /
+ * GCC >= 3.4 / VC to greatly speed the building of the Demo example.
+ * It may also be of use to people developing their own project, but
+ * it is probably better to define your own header. Use of this
+ * header is currently UNSUPPORTED.
+ */
+
+#if defined __cplusplus
+
+#include "../../src/kernel/qt_pch.h"
+
+#endif
diff --git a/examples/demo/display.cpp b/examples/demo/display.cpp
new file mode 100644
index 0000000..eceef05
--- /dev/null
+++ b/examples/demo/display.cpp
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "display.h"
+
+#include <qpainter.h>
+#include <qlayout.h>
+#include <qtimer.h>
+#include <qpushbutton.h>
+#include <qframe.h>
+#include <qdial.h>
+#include <qlcdnumber.h>
+#include <qprogressbar.h>
+#include <qspinbox.h>
+
+#include <math.h>
+
+Screen::Screen( QWidget *parent, const char *name )
+ : QFrame( parent, name )
+{
+ setLineWidth( FrameWidth );
+ setFrameStyle( Panel | Sunken );
+ setBackgroundMode( PaletteBase );
+ setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
+ setPaletteBackgroundColor( black );
+ setPaletteForegroundColor( blue );
+
+ yval = new int[width()];
+ memset( yval, 0, sizeof(int)*width() );
+ pos0 = 0;
+ t0 = 0;
+ step = 0;
+}
+
+Screen::~Screen()
+{
+ delete yval;
+}
+
+void Screen::resizeEvent( QResizeEvent *e )
+{
+ delete yval;
+ int w = e->size().width();
+ yval = new int[w];
+ memset( yval, 0, sizeof(int)*w);
+}
+
+void Screen::animate()
+{
+ if ( step == 0 )
+ return;
+
+ int t = t0;
+ int p = pos0;
+ if ( step < 0 ) {
+ t += width() + step;
+ } else {
+ t -= step;
+ p -= step;
+ if ( p < 0 )
+ p += width();
+ }
+
+ for ( int i = 0; i < QABS( step ); i++ ) {
+ int y = (int)((height()-FrameWidth)/2 * sin( 3.1415*(double)t/180.0 ));
+ yval[ p ] = y;
+ ++t;
+ t %= 360;
+ ++p;
+ p %= width();
+ }
+ t0 -= step;
+ if ( t0 < 0 )
+ t0 += 360;
+ pos0 = (pos0 - step) % width();
+ if ( pos0 < 0 )
+ pos0 += width();
+
+ scroll( step, 0, QRect( FrameWidth, FrameWidth, width()-2*FrameWidth, height()-2*FrameWidth ));
+}
+
+void Screen::setStep( int s )
+{
+ step = s;
+}
+
+void Screen::drawContents( QPainter *p )
+{
+ QRect r = p->hasClipping() ?
+ p->clipRegion().boundingRect() : contentsRect();
+
+ int vp = ( r.left() - FrameWidth + pos0 ) % width();
+ int y0 = FrameWidth + height()/2;
+
+ for ( int x = r.left(); x <= r.right(); x++ ) {
+ p->drawLine( x, y0 + yval[ vp ], x, r.bottom());
+ ++vp;
+ vp %= width();
+ }
+}
+
+/***********************************************************************/
+
+Curve::Curve( QWidget *parent, const char *name )
+ : QFrame( parent, name )
+{
+ setLineWidth( FrameWidth );
+ setFrameStyle( Panel | Sunken );
+ setBackgroundMode( PaletteBase );
+ setPaletteBackgroundColor(black);
+ setPaletteForegroundColor(red);
+ setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
+
+ shift = 0;
+ n = 1;
+}
+
+void Curve::drawContents( QPainter *p )
+{
+ p->moveTo( width()/2, height()/2 + (int)(90.0*sin( double(shift)*3.1415/180.0)));
+
+ for ( double a = 0.0; a < 360.0; a += 1.0 ) {
+ double rad = 3.1415 / 180.0 * a;
+ double x = width()/2 + 90.0 * sin(rad);
+ double y = height()/2 + 90.0 * sin(n * rad + double(shift)*3.1415/180.0);
+ p->lineTo( int(x), int(y) );
+ }
+}
+
+void Curve::animate()
+{
+ shift = (shift + 1) % 360;
+ update( FrameWidth, FrameWidth, width() - 2*FrameWidth, height() - 2*FrameWidth );
+}
+
+void Curve::setFactor( int f )
+{
+ n = f;
+}
+
+/***********************************************************************/
+
+DisplayWidget::DisplayWidget( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ timer = 0;
+
+ QVBoxLayout *vbox = new QVBoxLayout( this, 10 );
+
+ QHBoxLayout *hbox = new QHBoxLayout( vbox );
+ screen = new Screen( this );
+ dial = new QDial( this );
+ dial->setNotchesVisible( TRUE );
+ dial->setRange( -10, 10 );
+ dial->setValue( 1 );
+ screen->setStep( dial->value() );
+ connect( dial, SIGNAL( valueChanged( int )),
+ screen, SLOT( setStep( int )));
+ lcd = new QLCDNumber( 2, this );
+ lcd->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+ lcdval = 0;
+
+ hbox->addWidget( screen );
+
+ QVBoxLayout *vb2 = new QVBoxLayout( hbox );
+
+ curve = new Curve( this );
+ spin = new QSpinBox( 1, 10, 1, this );
+ connect( spin, SIGNAL( valueChanged( int )), curve, SLOT( setFactor( int )));
+ spin->setValue( 2 );
+ vb2->addWidget( curve );
+ vb2->addWidget( spin );
+
+ QHBoxLayout *hbox2 = new QHBoxLayout( vb2 );
+
+ hbox2->addWidget( dial );
+ hbox2->addWidget( lcd );
+
+ bar = new QProgressBar( 10, this );
+ tbar = 0;
+
+ vbox->addWidget( bar );
+}
+
+void DisplayWidget::run()
+{
+ if ( !timer ) {
+ timer = new QTimer( this );
+ connect( timer, SIGNAL( timeout() ), SLOT( tick() ) );
+ }
+
+ timer->start( 5 );
+}
+
+void DisplayWidget::stop()
+{
+ timer->stop();
+}
+
+void DisplayWidget::tick()
+{
+ // sine
+ screen->animate();
+ // Lissajous
+ curve->animate();
+ // lcd display
+ lcd->display( ++lcdval % 100 );
+ // progress bar
+ bar->setProgress( 5 + (int)(5*sin( 3.1415 * (double)tbar / 180.0 )));
+ ++tbar;
+ tbar %= 360;
+}
+
+void DisplayWidget::showEvent( QShowEvent * )
+{
+ run();
+ screen->repaint();
+}
+
+void DisplayWidget::hideEvent( QHideEvent * )
+{
+ stop();
+}
+
diff --git a/examples/demo/display.h b/examples/demo/display.h
new file mode 100644
index 0000000..761a327
--- /dev/null
+++ b/examples/demo/display.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef DISPLAY_H
+#define DISPLAY_H
+
+#ifndef QT_H
+#include <qwidget.h>
+#include <qframe.h>
+#endif // QT_H
+
+class QTimer;
+class QDial;
+class QLCDNumber;
+class QProgressBar;
+class QSpinBox;
+class Screen;
+class Curve;
+
+class DisplayWidget : public QWidget {
+ Q_OBJECT
+public:
+ DisplayWidget( QWidget *parent=0, const char *name=0 );
+
+ void run();
+ void stop();
+
+protected:
+ virtual void showEvent( QShowEvent * );
+ virtual void hideEvent( QHideEvent * );
+
+private slots:
+ void tick();
+
+private:
+ Screen *screen;
+ QDial *dial;
+ Curve *curve;
+ QSpinBox *spin;
+ QLCDNumber *lcd;
+ int lcdval;
+ QProgressBar *bar;
+ int tbar;
+ QTimer *timer;
+};
+
+class Screen : public QFrame {
+ Q_OBJECT
+public:
+ enum { FrameWidth = 3 };
+ Screen( QWidget *parent=0, const char *name=0 );
+ ~Screen();
+
+ void animate();
+
+public slots:
+ void setStep( int s );
+
+protected:
+ virtual void drawContents( QPainter * );
+ virtual void resizeEvent( QResizeEvent * );
+
+private:
+ int *yval;
+ int pos0; // buffer pointer for x == 0
+ int t0; // time parameter at x == 0
+ int step;
+};
+
+class Curve : public QFrame {
+ Q_OBJECT
+ enum { FrameWidth = 3 };
+public:
+ Curve( QWidget *parent=0, const char *name=0 );
+
+ void animate();
+public slots:
+ void setFactor( int );
+
+protected:
+ virtual void drawContents( QPainter * );
+
+private:
+ int shift, n;
+};
+
+#endif // PLOT_H
diff --git a/examples/demo/dnd/dnd.cpp b/examples/demo/dnd/dnd.cpp
new file mode 100644
index 0000000..eb3684d
--- /dev/null
+++ b/examples/demo/dnd/dnd.cpp
@@ -0,0 +1,120 @@
+#include <qiconview.h>
+#include <qdragobject.h>
+#include <qlayout.h>
+#include <qmultilineedit.h>
+
+#include "dnd.h"
+#include "styledbutton.h"
+#include "listview.h"
+#include "iconview.h"
+
+DnDDemo::DnDDemo( QWidget* parent, const char* name )
+ : DnDDemoBase( parent, name )
+{
+ buttonPixmap1->setEditor( StyledButton::PixmapEditor );
+ buttonPixmap2->setEditor( StyledButton::PixmapEditor );
+ buttonPixmap3->setEditor( StyledButton::PixmapEditor );
+ buttonPixmap4->setEditor( StyledButton::PixmapEditor );
+
+ multiLine1->setTextFormat( RichText );
+ multiLine1->setText( "<p><b>Faust</b> - <i>Goethe</i></p>"
+ "Habe nun, ach! Philosophie,<br>"
+ "Juristerei und Medizin,<br>"
+ "Und leider auch Theologie<br>"
+ "Durchaus studiert, mit heißem Bemühn.<br>"
+ "Da steh ich nun, ich armer Tor!<br>"
+ "Und bin so klug als wie zuvor;<br>"
+ "Heiße Magister, heiße Doktor gar<br>"
+ "Und ziehe schon an die zehen Jahr<br>"
+ "Herauf, herab und quer und krumm<br>"
+ "Meine Schüler an der Nase herum-<br>"
+ "Und sehe, daß wir nichts wissen können!<br>"
+ "Das will mir schier das Herz verbrennen.<br>"
+ "Zwar bin ich gescheiter als all die Laffen,<br>"
+ "Doktoren, Magister, Schreiber und Pfaffen;<br>"
+ "Mich plagen keine Skrupel noch Zweifel,<br>"
+ "Fürchte mich weder vor Hölle noch Teufel-<br>"
+ "Dafür ist mir auch alle Freud entrissen,<br>"
+ "Bilde mir nicht ein, was Rechts zu wissen,<br>"
+ "Bilde mir nicht ein, ich könnte was lehren,<br>"
+ "Die Menschen zu bessern und zu bekehren.<br>"
+ "Auch hab ich weder Gut noch Geld,<br>"
+ "Noch Ehr und Herrlichkeit der Welt;<br>"
+ "Es möchte kein Hund so länger leben!<br>"
+ "Drum hab ich mich der Magie ergeben,<br>"
+ "Ob mir durch Geistes Kraft und Mund<br>"
+ "Nicht manch Geheimnis würde kund;<br>"
+ "Daß ich nicht mehr mit saurem Schweiß<br>"
+ "Zu sagen brauche, was ich nicht weiß;<br>"
+ "Daß ich erkenne, was die Welt<br>"
+ "Im Innersten zusammenhält,<br>"
+ "Schau alle Wirkenskraft und Samen,<br>"
+ "Und tu nicht mehr in Worten kramen. <br>" );
+
+ multiLine2->setTextFormat( RichText );
+ multiLine2->setText( "<p><b>To Milton</b> - <i>Oscar Wilde</i></p>"
+ "Milton! I think thy spirit hath passed away<br>"
+ "From these white cliffs and high-embattled towers;<br>"
+ "This gorgeous fiery-coloured world of ours<br>"
+ "Seems fallen into ashes dull and grey,<br>"
+ "And the age changed unto a mimic play<br>"
+ "Wherein we waste our else too-crowded hours:<br>"
+ "For all our pomp and pageantry and powers<br>"
+ "We are but fit to delve the common clay,<br>"
+ "Seeing this little isle on which we stand,<br>"
+ "This England, this sea-lion of the sea,<br>"
+ "By ignorant demagogues is held in fee,<br>"
+ "Who love her not: Dear God! is this the land<br>"
+ "Which bare a triple empire in her hand<br>"
+ "When Cromwell spake the word Democracy!<br>" );
+
+
+ items.insert( tr("copy"), IconItem( tr("Copy"), "editcopy.png" ) );
+ items.insert( tr("cut"), IconItem( tr("Cut"), "editcut.png" ));
+ items.insert( tr("paste"), IconItem( tr("Paste"), "editpaste.png" ));
+ items.insert( tr("raise"), IconItem( tr("Raise"), "editraise.png" ));
+ items.insert( tr("lower"), IconItem( tr("Lower"), "editlower.png" ));
+ items.insert( tr("new"), IconItem( tr("New"), "filenew.png" ));
+ items.insert( tr("load"), IconItem( tr("Load"), "fileopen.png" ));
+ items.insert( tr("save"), IconItem( tr("Save"), "filesave.png" ));
+ items.insert( tr("undo"), IconItem( tr("Undo"), "undo.png" ));
+ items.insert( tr("redo"), IconItem( tr("Redo"), "redo.png" ));
+ items.insert( tr("delete"), IconItem( tr("Delete"), "editdelete.png" ));
+ items.insert( tr("help"), IconItem( tr("Help"), "help.png" ));
+ items.insert( tr("home"), IconItem( tr("Home"), "home.png" ));
+
+ listView->addColumn( tr("Actions"), 240 );
+ listView->setColumnWidthMode( 0, QListView::Maximum );
+
+ QMap<QString,IconItem>::Iterator it;
+ for( it = items.begin(); it != items.end(); ++it ) {
+ IconItem item = it.data();
+
+ QIconViewItem *iitem = new IconViewItem( iconView, item.name(), *item.pixmap(), it.key() );
+ iitem->setRenameEnabled( TRUE );
+ QListViewItem *litem = new ListViewItem( listView, item.name(), it.key() );
+ litem->setPixmap( 0, *item.pixmap() );
+ }
+}
+
+DnDDemo::~DnDDemo()
+{
+
+}
+
+IconItem::IconItem( const QString& name, const QString& icon )
+{
+ _name = name;
+ _pixmap = loadPixmap( icon );
+}
+
+QPixmap IconItem::loadPixmap( const QString& name )
+{
+ QPixmap pix( "textdrawing/" + name );
+ return pix;
+}
+
+IconItem DnDDemo::findItem( const QString& tag )
+{
+ return items[ tag ];
+}
diff --git a/examples/demo/dnd/dnd.h b/examples/demo/dnd/dnd.h
new file mode 100644
index 0000000..79d4526
--- /dev/null
+++ b/examples/demo/dnd/dnd.h
@@ -0,0 +1,40 @@
+#include <qpixmap.h>
+#include <qmap.h>
+#include "dndbase.h"
+
+#ifndef DNDDEMO_H
+#define DNDDEMO_H
+
+class IconItem
+{
+public:
+ IconItem( const QString& name = QString::null, const QString& icon = QString::null );
+
+ QString name() { return _name; }
+ QPixmap *pixmap() { return &_pixmap; }
+
+ Q_DUMMY_COMPARISON_OPERATOR( IconItem )
+
+protected:
+ QPixmap loadPixmap( const QString& name );
+
+private:
+ QString _name;
+ QPixmap _pixmap;
+};
+
+class DnDDemo : public DnDDemoBase
+{
+ Q_OBJECT
+
+public:
+ DnDDemo( QWidget* parent = 0, const char* name = 0 );
+ ~DnDDemo();
+
+ IconItem findItem( const QString& tag );
+
+private:
+ QMap<QString,IconItem> items;
+};
+
+#endif
diff --git a/examples/demo/dnd/dndbase.ui b/examples/demo/dnd/dndbase.ui
new file mode 100644
index 0000000..3e01350
--- /dev/null
+++ b/examples/demo/dnd/dndbase.ui
@@ -0,0 +1,355 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>DnDDemoBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DnDDemoBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>677</width>
+ <height>586</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonColor1</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="color" stdset="0">
+ <color>
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonColor2</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="color" stdset="0">
+ <color>
+ <red>0</red>
+ <green>170</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonColor3</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="color" stdset="0">
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonColor4</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="color" stdset="0">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonPixmap1</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="pixmap" stdset="0">
+ <pixmap>image0</pixmap>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonPixmap2</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="pixmap" stdset="0">
+ <pixmap>image1</pixmap>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonPixmap3</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="pixmap" stdset="0">
+ <pixmap>image2</pixmap>
+ </property>
+ </widget>
+ <widget class="StyledButton">
+ <property name="name">
+ <cstring>buttonPixmap4</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>40</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="pixmap" stdset="0">
+ <pixmap>image3</pixmap>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="ListView" row="0" column="1">
+ <property name="name">
+ <cstring>listView</cstring>
+ </property>
+ </widget>
+ <widget class="IconView" row="0" column="0">
+ <property name="name">
+ <cstring>iconView</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="1" column="0">
+ <property name="name">
+ <cstring>multiLine1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>2</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="1" column="1">
+ <property name="name">
+ <cstring>multiLine2</cstring>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>StyledButton</class>
+ <header location="local">styledbutton.h</header>
+ <sizehint>
+ <width>40</width>
+ <height>25</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image4</pixmap>
+ <signal>clicked()</signal>
+ <signal>changed()</signal>
+ <property type="Color">color</property>
+ <property type="Pixmap">pixmap</property>
+ <property type="Bool">scale</property>
+ </customwidget>
+ <customwidget>
+ <class>IconView</class>
+ <header location="local">iconview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image5</pixmap>
+ </customwidget>
+ <customwidget>
+ <class>ListView</class>
+ <header location="local">listview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image5</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="72495">789cecbd49732339b6a8b97fbfa2ec6277adcd1f4989d3a217a4268a1225512229896dbd80033ecf13a7f7e71bf0730e24454466466456559659df92b1949fdc89f18c00dce37ffff73fde9e16fff8effffdbfaa9ad781f887f079f98fff964d921cff9ffff7fffe3fffebbfba83ce3fbabdf13fbae3eee01fbdfffabffed77f59f63fc43f1eb2d469817d8265fdf90a57c03aedff34476786479ae30171b7bd9ede1b6eaf7b11f2397c5f370e19bebf2086ef270fc823b8bfa0fb4778dd4516707dff0cdcc3f20ef8fd9ee88ddbf69eb73ca2f6c74f86dbfb0b498ced0f0db7d7a347646c7ffc6018da7f24c6f69d1986eb7de25e7bdd65c8d8bfe8c2707b7fde2586f2e2a5e1f6bab347c6fee7aee1f67ac389e1fb3e7ebf8bfd9f08646c6f798f3c82f61503642cafde11c3fdc777c3edf5e310b887e3777c2586f2f6d8bf1ef6fff8868cfd396e8861be2abcee0c642b7f8701b13368af47c81cb81c1a6eefafee34778d7c156b621ccf33641aff4bc3d0df8818eecf1686613e63641cffc036dc5ecf36c4f07d6b0f4ce39f7886dbfb937362b8bfd911c378c536f159b7bdff1119e571fa6a18ca1b20637f1afa3ef6e7f8440ce51f12c330fed8fe2ef6af792786efd78d6198bf2d319457af0cb7e525381f3decff2e35dc7e7f1f1143f9076618caef10a33c2586dbf24fe7c4303ed5abe1f67a43f5e3fceffb86c15ed8c4505e732286f2f6541e8e5715186eefdf5d10c3fd271719c7e3f0488cd71de033d4873d8ef7199677b82286fb0f63e0f3d1396fdb87e50f64bf35e3fb0c58f664bf6d0fde2f515f9a033217b2659c2fe9c0f5fd10d8a1ef2f89f1fb0bc3ad7eed0432e9e31419f5f140e571b7e51dea97e340f9d58418ca2b1f88e1feb2047607aedbea576b0fbbc6de796fc0469ffac430bfbb29318c6f2388613c778fc8a83f3234dccac3f48c18e5bd360cfa352786f27799e176fed22132eadf91ea2379b92186f6144bc3a02f97c8d85f3937dc9657dd1343fbbc3bc3edf513b517f5afcc89a1be10c783f4316286c15ec4c4d8ff67c3601f5f88511f8ec4209f01dd8fe35b2e89717eee0d437ba93d389e8d67b86dffd122c6f9cb89a1beba44c6f13e507968ef4e9218e7ab6718ec878d4cf6ad2046fdb50cc3fd3362d44f4e0ced39a23c9ee1f8ed1d622cef60b82dafc0f93dc3f12876c4e82fcf91b13d7bd0efd17907f47f87f37f8ee355d6c4e760bf70be06dd417b7ff9842c076d7b0be4617768b7e38fe335ea8f5ade6d91c7a3b3f6fbd8bff1782cdafee07cf22e3f6fc70ffb47f6a6de1083feef57865bfd6f707ca403f7ef3ac478ff9a18eccbb1300cf608dbabec57cbb520c6f8a0320cf104eaab33407b9812a37d1a1a6eef3f96c4609fea0532f6a7b689a1fce29c18eeaf501fc8fe351bc310afbc13437b77b7c02ef6e770438cf636360cf6f39118ede70099ec67fbfd9e89378e0fc418cf1c90515fbdade1f67a7a490cf2eccc9051dffc9c18e32561b8bd5e9e88417e4f8161b0773e32da3b471a867897da87fa79280dc3f52931966fca437dad88c1beca3b60b27f9c196ecbe32e31da8327c350df2d31c63bb161f0df97c418af5d20e378ba39318ee79a18caf31d62f8be6f21e378365d62b40f03648ad7e97e1cafddd130e4174362b4dfd85eb257656018ec91478cf69311a3ffc2fac85e15383f67d8dea2838cf5ef1262ac7f4c0cf393239fe378ee0b628ceff6c868efaa1531b6e71e19e56b3f41467b5de3f7fb7db0d7bb11f278d8dab7438a2cfbedf5430f78d085eb0df6673046ff734f0cf67587f333c0efef6f88e1fa31041e76e17a9d12c3f506c767d8c7fa17c8687f1bac6f28c13ed71c78dc85ebfb2be2716b8f4f383fe33edaef05315c2f717cc7585e352086ebc51930efc2f5e6480cd76b945f7b60b75c61fb8523c0dea1bd91685f8b3e32daffdd1331da77943f89df3fdc11a33f480d83fd3c11a3fdc4fe3b3db0ef873e31fa872331deff8c8cf67e5710637bd09e38e8cff65d62b4e723c3608fd17e9a78776918daeb1063f9c864efcb1931dafb9161f87e834cf1fdd8307c1fe5d3c5f13cc1fde30ee5f7a0ff63b2e7876764b4e7d39a18f4270c8951ffd6c868af0f4f86dbefdb8c18ed89430cf547b786215e06fb32267bec2586c1bf4862b4c74b6228cfe921a3ff8aba8661fdc92686efb327c3edf5e09618caf33a86c11e45c8b85ee09e196ebf2f4ec4507e101b067bff4e8cfd9f1383bd9b5e22e378a62bc3edf7e59118cacf33c3e0afb6c4385fd45eb47725b6f70cc7b7792346ff6c18f3931762f8fea440a6f5032c8fe2cb23ce771fe3ffe611b90ff165798d3cc6fb717c065d885f9b9561889fef89c11ed638be833edc5ff791c7683fb1be81447b1e11c3f7f7a0bfe321d6b72b89d15ecf90b1fc9d6318cadb23a37dafa561b88eed19623cbdcf89219e2e20fe188fba70fd88fa3392688f713cc67d8cbf5f91c7606f8f1e31d8db03caeb18bfbfb30cc3fd789da33fa8b6c4f87db0276389f66687fa21311edee37c197b8cf240eb03c79c18f3fdb961b04f682f1cb44747818cf6f1b02586ef17a81f641feb0131c6ef389f640f8fd2707bffa9bd7ed635f1656818e23f0f19f521d903937d299e8971bde9400cf767efc8685fc4a56188b72a628ce732c350de9118ca9b9af2305f6e90d19e78d41ed437ef6418aedf13437ff985e1b6bf5e8a4cf643124379d1da30c493d7c4509e381a86f573ec1fd90fc10d43f98218ed7dcf30e417e6fb685fcf0c83bd31d7617cbc73641cefeccd30ac7f3c10637f5e0c833d4b9069ff60448cf3332686f6843131c68701328ecf01e5cbe4d3283f7d6cefb18b4cf19a0f3c403ea2bc9878f19518ecc1a140267b85f34bf161332486fb4f0c19ef2fdf0d437d3531e8fb71093ceac3fd071cdf11daa73dca3bc58fcd1532c6870dcaf398f27fec2fd99f1aaf73bcbfb830dcae0f542e3287ebfb0eb283f6ea0ed8e6bcbdff88f22fb80df15b0e4cf6aac4f954f60ae2c319327d7f420cf7efe97eb26738ff141f1e5d62b06f8733c360afae8971bd14f5d1ac1fac89f1fe0d32c68b454d8cf1eb9118caab519e295e2c2e0d4379543ec58b33c3701de7dfc48ba8ef141f168fc4b01e706afddfd998ece104e6cfc447bb0131eac71a99d6d362c3ad7e84b7c8686ffc1331da03cf30c4970b62cc7713c3ad3d08ce88213e0a40dfc6646fa22762289f9f1986f62c89313eec12437ff31e32da13fb8118f7cbce0c43beef11a37d9c196edbe798fba17c5722a33dcfd6c4b81fb4310cf123b597e243410ce589ca705b9f4bedc7f10e57c450be3c370cebabb7c4e81f16c450be33370cf1e33531d8bb2436dcda971ce7f79ce2f1b961f08767c4b89e3b350cf5778931fe8d88a1be5d888cf3d30c8831fe047f39a67c7d8ff5517c78c4f121fb5a6079948f1fc05f7cc47b381f2a5e83fc1ff453c56bc0c71d32e6cfc71331d8b73db68fd6471b94d79184f5d002eca989ef8a8618cb1b2163bc57e27c513cb7bf24c6f556f01f63ce71bd15fcc358f4c0fe5535b203f6f3981283bdac507f68bfa8ba40467b56dc21a3fd3a56c4686fb0ffb45e7b5c11a3bd02fb3e36f977408cf675828ceb01e58d6188470fc858ff6e4e8cf6b3478cf6d006a6fc79ef11637edfc60fe7265edbbf23a33ed63931aeaf07c8a84fc11a98ec8fbd23c6f5ce33c3ed751613e37ecb8561d0af0299f6a7bbc4509e3b370cf672420ced930e32adbf8e88e1fbe2c130d8972b62d03fee11437bf89418f4cfa7f6a17d613362b42f13c3705d10633cfa68b82d9fbd13e378507d685fc23ef039c5938fc4509ffd6a18aee7c4509f7d65b8ad4ff8c4683f6bc3d0df0e31f6d735dcda07af41a6f31d73628cc76f0c433c5e11e3fcf488b1be1331d457ec9169bde0cd30d4372186f226f786dbf27c8f18fac77dc3605fa97e9ccf8498e27dea1fed4773e03eedafdf21f7a17d05b68fe2cbc30ad8467bb34779b31db04fc51658e07ae001bf4ff6e7780d4cfb4115ea13adf7ed70be8dbd0891319ed92f90291ec2f930eb63203f9cf4c37926c6f3373131cac71b328e4f392146f93a23c6f14c88c19f2420df9ce455ae0c43bce213633cf26818d6bffac4b8de3f330cf1cf8018e4b3b84646f98c4a62d4ff0f6eaf5b67c4284f1131d497ae0d837dea11837fcc71fcce713c63ea0fcaafb40c837da4f6533c73340cfa79438ce37f6d18f4a54b0ce3cd1f0cb7fde77362689fe320a37dca2e0d837da4fed0f9146618f489fa83fa20f686e17a400ced71ee0cc3fa56064cfae35ac458dec130eccf9e23f7511e3ac4b83e90238f71ff1bfc07a7f5f83d966f0f30dfc1f60af4df9540e6a07f47d06f2e7b180f80fde5e6bc07ea83d9ff7c4146ff2a5af9e9f7c89e57736092f7ca320ceb9d3e318ec72331c6df0e329dafe81806799d11c3f7f395e1b6fe78488cf66f420cf3e156c8289fdc310cf24bed45f9b407c4385f8d61d89fdc10a3fc2d8841fee21d329db7bb310ce341f7a3fc859961f08fe6fb50bfdd18067d31d751fece0db7ed89af89a13d01f6bf8ff3236e0d83ffec12e37a8c300ce3bb25c6f6bc1b06fd0c88a13d2c310ceb5938dffd3eda278b18f5d3370cfa49ede943fd16b517f5c1fd60c8b7a87d7da85f98faa0fef40e790ce55754df18fa9bd4c4b81e78320ce7bf726489fef99c18ca3fa13e0cf0fbf90898d6938f38bfbc0ff1f911c747603c5c86c8a89f27985fdea17c1ce48dd3fe4008e36dfc5175054cfae68c9051def337c330fe2131cadf8418ca8f36c4d0fe5c22d3fe3add4ff15d4a0cedb54e86617ecc75981febd1703b7e59044cf2e9bf1a8678ca2246fbf16218f2df9218ea974fc4503e5b12833ef853c350ff0119e5915f1a0679bc2246fb9c1b86f1728871bd726a18da1710437b12418ced490d83bef48921becae6c863685f38340cf9beb98eeb27f47d945f4ee387fb2dbc67b82d3fa2fe8cd15e2486dbeb536a1fee77a40532ea4345e32fd1bf3f1b86f90f89617c820b62dc1f02fbc8075d94d723319e8f8a89511fb1bf43ba8ef239423ee27cd1fec811ef57f127ec67b8c8b89e786adb3be875317eab66c024df090326f90cf7c4d8df9418fbe713c3788647649aaf3762f8be250d83bd7d25467beb1986787e420ce5db9561b0ff77c8383feec8309cdfa989b1fd7dc3107f52fd385ffedc30f83faa1fe72f2a88a13d966318da83d7693ead0f86fa46c4505ffc460ce5cb3362ecef8de1f6bae313837c4aecdf00f5371a13e37a9d6db8ad7f322746fbbd310cfda5fad0bfc49218dac313c3d05e460ced89a83de47fa8ff38df1947c6f12fb03fb603fea00880291e9bb6f663c069fffd3400ee613e99c3fc7cd8877b649cfffd23319edfa98931bfc888b1fdd7c0347f766a18e4b52646ffb123467b6713c378a5a63c28df7a350cf6fa8618d6db7c6c3fcd6741d7713ea337c3108fe6c498cf9c0cc379af17628c0f2362983ff1440cede307c3d03eea4f1fdae7ad9071bc3d9f18f3ffc030cc378d0fea77260d833ecc88713dc4350cf2de27467db8360cfd2988a1fde19961d0571aef31ac3fba5b649487921986fc84da87f6c0a3f946fd670d31d63f2086fad99b61b8ff9918eacf41fe8d3dafce0c43fc372686f1897bc4303ed10d318e87290fdbf3448cfbf13132ca4b3d21c6f825370cfa2f89d15f5d20e37c057362dc9fc3f91b61fb26adbf1e9e75315f983c21633c341901f730df9edac8b4be9f00933d9e56c0a47f518c8ced4f5262187f77824cf1c18361f0cf4362fcfe9118e3812b6294a7d470db1f7f8d8cf6455e1263bc746318e4fb8218c7db5cc7f8272046fbd033dc5eb7a83fb83eefe3780dbb985fed89a17ef66018f227468cfbbb33c3d0be9218e52b2186f6d97d62685f706718dae71143fb2cdf702befc91531acf7e70219ed5b901363fb1f0dc3f9852d31da8f176294ff37621cbf0f86f64d89a17dcc7c1ff72332648c37a3c630f813ea2fca9343e383fab07b27c6f13b11e3faccca30cc774a8ced0d0d43fee610437be36764b43ffc9e18da3f417d18e1fc368c18d76776c8a4ff1e31b47f02edb7e9f99049888cfa383903a6e78926207f36ad9f7b0360d2b77c4d8cfa6518fa1fbe13a33c4d91517f82d230e8eb3d31ea4f420cfd0b3d62f4df9218c6273c2786fda402e6c726fdb11362dc9fbb20c6f8ac6318d6c3cc758c7f2a62eccfbb61f05fe67ed40fd730f8830019f5c1ee11c378a49561b07f36318ec73d31aecfbe12e3783f1163bc78320cfa1113a37de9186edb677589417fd30332ea874bfdc3f98fae0c433e46ed4579109961e80ff517f5a7ee1a86f322e7c4187fde11a3bf35e5617f2262d4f74bc36d7fd21b62e80f9b2093fd7e300cf6d35c47fb796318e21b8f18dac768fcc99e5f1a86f6917ca03d6743c36dfb1823c6f146fd1aa17c260b62f4976fc4305efe2d318ecfca30c8c38c18ea2f713c47283f279ccf11cedf84eac3f998b4df57c138e67b933532c6e3a70259e0799d2930c577d31819c7377e21c6f3455b60f26799438cfb670fc4b85e83f5197f2289317e5f10637ccc0cc3fc0d8831febc2186f6c786d19f5d13c3fcc80819e5ffe0196ecbb72f89f1fc706618e4eb8e18f3877b623cef191a86f86e460cfd17b161f0d73531da9bc030c8574a8cf25f1906fd7846267d5818867ce295189fffba300cf6fa488ce369cac3f61b467da0f9267d181b86f65e11637b2dc3609fb03e5a0f111786c1fe34c4b8bee01b86f65e13637b5f88517f3686a1bd0b621c5f531fb677448cfa4bf7933c6e0d43bc3f20c6f8e69518da630b62688fed188678202486f68489e1b63db64d8ce7d7a83c94d76c6518e219c3783ee6c530d81baa0fe52fe186617f74878cf2b2a3eb282ffbd230e4af3d62b4ff389e639caf13cecf18eb3fb5f1eec826fb739a00d37ae304c6d3a6f51517f4d7d87bab63b81d9f2c24c6f37b0932b6f7d427c6fd068718f3bb3531facb6b62acefc1707bdd7f0226f964e7c4289f27c3601fdf89617c824b62acbf204679bc32dcd6c78fc4a83fb56190574e0cfd17387e465e5f0cc3fc537b515e036e18da9b10c378d92531ae0f52ff507e45488cfa9f1b06f97589b1fdd78621bec3f920798e578621be9810637b43c330fe7d628cdf0fc4984f2e0d43bc47fd41fbea9f1b86f18e89a1bd0e43467b1a978621def488319e1b1a86fc8cda8ff1447a6618eca9b91fe35d9cdf31dac3746318fcd12331da6f733fcedf3d31aeff45c8688ff6b7c8387e93d67f8cf58107d0c70498d6db4fefc0032cef80f793ff2b5d648ab786c0a40fbb07625c4f9b12c3f8467bc36dff9d8018f78bdf90519ecb4bc3e0ff6d62a88f2d0cc3785179d4ff1931b427ab89d1fe3e1a06fd2a89a1bdf6b96168ef0999f2cb57c3303e17c4381ee67e688f2c8861fcbd3531b4874786dbfa04f507e5b360c8b89ee15e13633ee61806ffef12e3fad8d130c8eb3b31ee7fcd8971fe2431ead39218da2b22c3d05e1a2f8a877b86215eb9051e633e2712626cbf6718fcfd2531ee9f71c3d0bf8618d7fba6c4b8de200d43fb9f89a1fdd313319e0fdf2293bcd175f2f79561f087d7c4307ecd9218ea2fa8bf282fe59e18f78bfac4707f49fdc1f99ac07c09a3af50bee875603c4f77c8e7303f53e8afa0f5e41ce45b90bed48961b007afc4988f46c828cfc99618ee2f5264da0f7089717fa26318c6ef8618da9f35c430de197e9fe69f6f0c43febe25c6f29786a1fe1531ee2f84c8683ffca16188df9e88511f3686a1bc17628c6f6e9171fec28361b0bf17c4688ff686a1fd77c4e8af1e88713f6f410ce3336d88e17cda84ee477d0f4ec4a82f1bc3b0de3b2246fda0f6937ea786a17eb02782d3faca9218c78713e37a701bef7363dfa69c18c7eb0e98e6a3982063beb717c4a80faf86dbf6ee77c4b8fe30350cf25a1263f91132ae6f444b621c9fa16190c78018e76b6bb8bd7ed813e3789d1b8678f59618f4cda3fa70fcf91b31b6df330cf2901143f9596a18cecb15c0341ffe2331c6231bc3601f05319e2fba350cf18af93edaa773627c9e312286fee40b645acf8a0d43791931ea636218fcef9818ed896318ecf30531d4ef1e8951fecd75907fff80ccd13eec89d1fe527f39ae9fae901db4af35b03d007d9ba03c8a1eca13dc2fba683f273d62f067a71c7984fc868ce7974e307f421fc06a790e4cfe720afd37f6aaea23e378ed16c8288f61438ceb430219f5bd090d83fd9911a3be3a86c1bf7789515f407e04c953ea1a86f17a21c6e771a78621de5b10e3fa508718ce0fed0264941f37330cf6e88218dbdb370cfa1113e3f31513628c479e90491ed686c17e537b39ae679bfbb1fc9018fd05d5cfa1fc88fae7e0f9da2b62f427dc30e8c32d31c627f78621ff328ce7cf0686413eb6c420ef49056cf7f07c47d730cce71531e603e63a9687fdb30750fffe1c19fbbf5f223b28cfadbfb0cfbb237cffc21098e28b69014cf1c9a48f4cf1c98918e5950193fc38966118ff1532cdff0331ee5f4e90717efdca70fbfd3027c6fd934bc350fe9e18edcfce303cffdc10e37ae41332ceaf37340cf1534a8cf9fedc30ccef1d31d4e75d19067b7e04a6f90c4bc3a00f37c428af33c3e0cfc7c4507e69cac3f93e2786f9996686c19e1f9007283f8218edf78b61f0272e318e5f6918fac39149df1e88b1fd8161b8ee10637ce013e37a698f189f4fa7fa71bcf75362b85fa0bc92fd6ef0fb02fbd33c1906fbdeea972d957d077b7d20467b3d461e014f9686413f1e89c1be9d40de650ffdc10ee445927c1f1c641a0fba8efd0f0a64ec5f3d22c6fcfd9c18f773415f24c9433e20c6fbbb86211e7927c6f59b4b62e87fec210f303e5a18067b7620c6f379e7c428df33c3205f3e31cadf35319cf79ef688e1bc50f0848cfa9d9f19067fb62746fb501a86f30773623c4f7b4f8cf6e9ce30b48fbe8ffa1d6e0d833fcb8971bfc1370cf1e29018eb730cc3f9c72331fa8f2931da171c2fd1c37c7d478cebb99661187f468ceb5ff786617c32628c1f4df9381fb7c838bfe50b31ee67a486417fa87e9cbf499b1f8b7eb783fee0887c0ef9f2e9017904f37bca9005e8cb8413e3f79f0cb7f747efc0647fd8bd61881f43628c2f568661fdb14f8ce73f6a6494a7e2408cf130370cf62027c6f21f0c83ffba24c6f5bb3764f2ff47c3e08f18318eaf6d18fa3324c678c35c47f9e911e379df09b0921788cf1e0cc3f3b92362941f6618ec77438cebe9a961f0377d62688ffb6a18ce3b18467dbe330cfee68618f4393f471ee0f9cd8018fdcd9118d74fae0d837e517b70be536e18e271533e3edf3345e6f8fc9d478cefeb3a2346fb5211a3ffce0c43fc4de5a33c941b627c5ee2848cf31f3f1a067dbd24c678796c18f415db2b713e26303eb283fa34a991497f603e6517e3afc90e19fd4f03fa69ecd7e49118cf831d88d15ef50c837c41ff3feccfbd6190d73b62b43f9661f03f3131da1f733f9eb77589d15f3f1b06f9792146f999230ff07dd20d319eb77e350cf23526c6f38b33c3206fe6fbe83f62c3104f2d8971ff501a86f14988f1fcc2ce30ec2799fa315f9d12c3f38039ce27c9679a12e3f324e786a1bf1e31eedf3c1b06fb42fd47f9cdf686e13a27c67c696718faf3408cf6c5948feda7f1e0d0fe2c477670fcf78661fd89ca437d702ac330be2b62cc874686a1bd1b621cff816188ffae89f17dc1389e12e5b5c80d437d1131cae70331da13ba9ffca1458cfa6a1b86fdca0e328ee7e90ad8c1f24e6dbe29fb9d73f06f936bc3b05ed741a6f58217628c275f81957e83febf18067ddf1363f916f2397e7f418cfef51eb8d781faa71e30e97fba0326fd4af7c4389eafc478ff2332ca676618fd5f4d8ce7ef7786c1fe84c4681fb686c13e78c4287f6fc4f0bc51364646f9cba686dbf62423626cffcc30c4736b623c0fd61806ff77458cf6511083bc55dc30e8cb05b044ffbbf389713c5e0c833f0888d17e9aebe8efae8851fe6dc3505f97189fbf690cc379936764b28f966198af2531faabc030ec9f46c4387f6f86217ed811e3fe5f6318ce3b527fc8ff768871bdc2320cfac98831be36f7a3bc14c4f87cfbc630d8db1c19e77f42edc5f9aeaf8971bc778661bd83eac7f9dea1fc39389ffb9018ed434a8cf9996b18ecc32531be1f0ec7d3c1f1afaf88d13f27c458de9818d7634b641c9ffa8d18f72f9f8871fd12daef74c83edc209f437c30e9228fc01e9c36c8188f4fae0c83bd82f975c8be4c0ec4505e04faeb907e4f13628cc72e90c95f5c1a86f16d8831be2888717d12cb9314ef5a86c15e65c418cfed0c83be8d88d1dfcf0dc3f56b628cef0e86e1bc67490cfd49c6c8a45f578641bf9e8871fd746918f265498ceb2b378641bf6a623c2f641986fced1e19f52b7921c6e7bb1686617fe09d18db3337dcd61799f2503f668661fdca23c6fde9b561d82fa5f1c2f9f670feb484b5dfa7f1c1f90f2dc3f03ce61b31c60bb661d88feb13e3798ab561d84fe7c4682f7dc3b01e1503abe2e179ec15313e2ff96218f6b72e88519e9861b08f67c498cf5586613c03627c7ffa8218f7f33ac8283fe5da303c1f342646fb7c6b18d6cba83c9497aa4b8cfb3538fe0ece77e313c3fdf59418f3a79418da573e23e37c34d43ff47f93767dc31974687f79854cf1ce1419d7cbf26b60a31f0531da539f18f70b2dc3b05eb62446ff468cf21d0d88d1bf740c437e151243f9856d18ecbf61ccf71f89e1fd3bf91d32ca73d210e3f3d413c3f0fcd49e18f7371e0c437cdb25c6fd3f6918e28f2931aea78586e17c509f18f5edc5308c0fce07c9bbbb21c6f75bd886e17dabe67e3c6f39370cedf189313fbe370cf6ea9d189fcf1d1986f59857625c2f981986f38e37c8187f7a3b62d4cf67c3701e644c8ccf97740c837ef688319e38370cf6e48e18d75bb786613df596189f071d1986fcb44b0cef930850be1db4bf32330ce37f20c6f68686411f1d62b46fc230d8379a0f944f3b370cfba59218db6beac7f39cd41f94cf784d8cfa1d1886f893c613e593bf1a067da98871bdfedd309c0fc3f171517eea4b623c7fd923c67805aeeb7805e20d9718d60f273e32e64f5368aff157598c8cfd8b226294e7d430d84b8f18e3db816190e78218c77b4f8cf2fb4c8ccfb39aeb200f2eb69ff44fee89519ec786e1fa8618dbfb6218fcafb91ff3e5816188273262686f75300cf13123c6e797ae0c83bc778931dfba2786fe841532eaa74de5a37eda9161b0273362dc7fad0d437c7724c6f5dd9361e88f20c6f5476e18e231ea3feae7e98618db6fda07ed9fee0cb7f6dccb91317eb2a7c4383f43c3d09f3e31f6676918eca3b91fede3c830c813b51ff5975f1986f9318cf2756b18e667828cfe47a6c4686fde0d83fd247941f9b73b86617c9f88d1ff5886217ea1f923f927f944f967b786a1fd28ef2ef99b8618df2f66aea3bc8f89f1f9a23bc3b03f7b4d8cf28cf3eb92fc3c11e379a3d6feb903b217d31258e2fecad40736fab422c678c3350cf92831ca7734340cfd7388717c63c330be1531941f750c433c63cac778e38918e5f5ca30fcfb2b3d6494574f12e3fc3f1806792d88d1df1c0d837fec12a37dbf360cf9d02b31ae7fac0cc3fa3ff507e535991a86eb541fc9eb9618f52b370ced1d10637b7dc3200f636294d7c2308c77498ce72702c3b0df49e34bf6dbb40fc6d7c1eb24bfcc25c6f7ebcf0d43fe7020c6f5e56bc330bee63ab6776318d69fde89f1fd47916178be5b1263bcd127c6f3a8a63cfcf717ce91d13ecb9818e523310cf27b498cfbbb07c3d0fe3b62dc9fce0c833da3fad11eefd6c498efe3fcba28af714a8cf95fc730ac6f6f8971ff756418f61f6f89319e8b0c833e4d89d1bed2f8d2fe8c4076717da8cdef5c97e28908fae792fec423628c8fce0cc37a848d8cf2ec4786e1f9e21d31cac7c230c457b7c4187f9486e1ba613c5ff1064cf22977c4f8feefa561888fbbc4987fac0d43fc6beec7f54f6e18e63726c6f3039786e179a91762dccf1e19067935f5c1bfdf94e4c8289ffe8218df1fdc1886f6bbc4180f750c837c7ac4b87f591b067b3121c6f3993bc3b07ef24e8cfb077362dccfdd1a867c8bea47790ec7c4d8feca30d887676294e72bc3e0bf687c509ee59b61989f9218e31f6118da43f34bf10223c6e75b503e9584833d7388515e9f0d437b69fc5c9497a961b057341e2efa336e18fc658f18cf2faf0c437b4fc438dee6fb202fcbda62eac3f1f7ff7c3e7d2c6e7e7ef39e760e6d3d82fa47fdb6ffe7f3fd0747f137aea31cfee158fffffcc3718c7e5b0e8dbcfeddf3fd9ffad132f8dbb2f83f72f87372f849ca7e2c87f60fe45058d2722cd7f22c5ffd04566845566c25566a6556fe77cbc5bfe15358a55559b5d5583b6bfffb7afa8d1c9a71b60ed6d13a5913357a53ebc2bab4aed4185e5b37d6ccbab5e6d69d75ffb7cbc6bfeab3b01eac47eba91dc1a5f56cbdfc916ffe2a879ff47d65adad8df56abda9517c57e56ead8ed5b57ad699756ef5ad8135b446d6f83f405efea91f6631c638b399609239cc651ef359f047fee2b7e490852c62314b58ca3296b38295ac62356bd88eedd9811dd9894dd8945dfc07c8cd3fe9c32e55ffaed8b51ac51b3663b76cceeed83d5b28a9f92939fc348aedd85a9c3db047f6c496ec99bdb0155bb38dfa79656fec9d6d598775594fcdd0193b677d36f8fbe5e72fcb5fcd866cc4c6ac56162b52c380b135e7acc7edef74f4c772f85d3cce0597dce12ef7b8cf031ef288e53ce6094f79c6735ef09257accb6b450ddff1fddf2f477ffec30f6afc6a36e6477ee2133ee517fc925ff18a5fabfe5dfdbe4ffea11ca2cef31b3ee3b7aab439bfe3f7ed9c2cf8037f648ffc8975f8923fab917c519f951ac935dff057fef6f7cbd3af7ff8bbb5e15bde51a3d7e1dd560a7bfc4c3fc7c807aa8f433efa81aff80d395c7e132332978f6d25e47c6173dbb6857ebac07679cff66cdf0eec508d5c9fe776c48e76cc023bb1533bb3f3bf5fa67ee5631716b74beeda9515d9ae75a13e0bbbb61b7b67eff9c03ea8cfd13efd42befc8d6fb627f6d4beb02fed2bfbda0a6d97bdf250d57063cfec5b6b6dcf7963dfd9f75c2899ecb39ebd50ad79b01fed277bf9f7cbd6cf7cec67fbc55ed96b7b63bf2a0b75549187fa61b9fd66bfdb5bbba3fa35e3cf76f76772b84f72c83eeb3df394cd5bda3dfb4c79fa11bbb4cfad0b1edb7d7b600fed91f22a813dd6f70a8b75ec8d68bf2bb8b08510f2ef96af1f7cbeb5675c38ccb39e852b3ce1abdc612b02118a487d62bb1189d2e181487929b23fb2855fe570f9c5268a5c14d65a94ec4954a2168d2a7927f6e2208ee2f44962b992cb93987ce20731b5376cfb77cbd997cfd79863262e3eda2b2ec595b8e681d8a9cfde7e173762266eed9198b37b71f7c7b6f0b7e450ebbe68fd88588807f1a8a2ec2dcbad058fac4bf12496e259bc288f35132b15251ec5faf398b6e3b8101bf1fab7cbdeb77dd2fd7913efcc135bd151ffdf553f3d71a6ec93abe4ef9c1fc5b9d2e71b51ea2761c4500538bb3ff6c9bf2d87aab691751063f1222d3e958cadad4b6d0fad2bd6085f725e4b9b0fc558f99567156f3f7c7c4f0a29a5235de9495f06ff0132f8c9cecb504632668e4cac67993257667c239505b416b2b0852cd5a7127b594b9f75552ef655327e520e3f8fa26cd85ceee45e1ee4d1aee449e5cb5a0e55cec703399153153b8d95d59829ff3c93179f6b9397f24a5ecb1b391396bcfdbbe5f04316e55cdec97b357a3bf55988ae7cb08ff2513eb14cd979472ed9463ecb17b9926be6cb0dbf96afdfc6cc3f2587f697b17893ef722b3bb22b7b2a3fc9940c6ef418ca33792efbd65a0ec45c0ea5cffbf2730cc5edb91cb3b932da96c31ceed88ef8cf90437d54885fb1b9d5c8f736f6eb3baee3393ebbb2de95a5ba7002fbcd0965ad6ce1982fe5f4739f7ebf8edf92435567e4c4762c874e622b9bc1c656a422f9c04985ef644efee9bec2293f8dfcc4a984cb73e68b17a7e68ed3f095b3fbf1fc39fb3fef677f5d0e9d83736481b5748c4f7426ce54d4dcb71e555473cdae9d0bbb712eed911ae199f313f9c98fe5f0f3283ad7edffdf3833e7561c9db9aa2dd076d19a3a77cebd982b9f325623bc7316ce83f368ec68691d9c2767a9a2abbe5339cfaa8417fb82453f9a3f67f5e764cb59ff9e7dfa7acdd9d80f728ef36b39af62a0f5c73e3a6fcebb55f0aecdd98a6d9cadd3515187ef749d1ef6e4fee76ce10fe4f0931f936f56c58ece95aaf9cc39772eac37bd8ea8fdb3d397967d142fac6b472a8e7a7106ce1047f0e88c9404baeca862fc48cec8428af98f64d119bbd69f914397fde8ef2ec9cb27fbe52a97eb4ad327d52a6be93a3c775dfbe07aaeef06ca3aa93e697be8866ee4c66e22072af78afe921c1afbe1a632510d18ba999bf38ee35b81b2890b6513afdcc22da5aff4dc6747e59f6b311766ecddcaadddc659aa4c69e89ad8c0ddbb07e5e9be9b43f7f867e450f6beff1b1fb92777f28dfd6adca913b19969c5857bc98772a1f28fa97be55e8b193f585357dba90b1eba33f7d69dbb77cc5739cad0bdffa6ac5f90c30f6d7617562d77cc771fdc47fb8a1fdc272d87eed27db602f745598d31ebba2b3d67ece4dc180b3072d7ca6a3fa8b9deb89f3c9bbcd17ee63bd979fb753974dfbff793626e95eef6ab1f753b566d3dbb5d17b5d33d73cfe575dbb681dcdb91dbe7a93b6063bb56f1c6853bb4b97572475cb86365a5e69ef5733ef9f7e5d0e21e137a85a6f6b867f39e15b217356397ec4a9e3c2172880df9b327f9ca738c57ee898ee73a7a5d67e5799fcaf2bd802fbdf01b3964bf2e87def7b655cd9a177bc967ed732f99a37cf0b3f2b097d882d4cbac677b22775eae7e0aaff42a5959536b6b6d6dd776bcda6bac3b6fc767dede3bfcac4ffe7d3954b51e955ed6bc9207efe44dac376659efaadb6336f6a6de8590eca4e6ecda55f2e85d9aef5c394b6501b6bcf0aebd9b4f65cdbc5b6fae6ca5fc5c9777e7fdf2be8cb7f84606c756653f7b0fdee3476da2f4f47ec8b3b37496de125bf0ecbdb043bbbaaf62062ebc95d831bdd3b160250fbdb5d3f736b6ca2cdcb1f7faf3b1e18fe5f06314bd37ef1dff6beb7544e575b9aff2c9bdd7f3cea4fc54cbc7489d7b7de6a9b872671fbdc1972bb7f6da1b7a236fec7c53d7afc9a16f7df593cabbd64ee5336fec7f69896f5bcf2ad3eada535fc0aab4ca8c27f6a7fd255ffa8eeffa9eefeb3cd90fec3329f04ae87cc8e14fb4e90772f8d937f7ad673f72b81ffb899faaac59efad6c6c975bd68c0b651367de98d7f691677ee6ab98d12f84b096f65aeefcf2c3c2b763a8fa235cbff2559eed375feafa2539fcf67ef9e6effcbdca37e7fee1737dcaa674dbb5a7dc3ffa2a22f41247f813bd4fa734fca0722bdfedf953f6625db00dcb65e95fa85863a8caf179ed5f7e94f3336dfaa11c1a9be85ff9d7a2e31ef8cabff167ac61151b5a0bffd69ffb7752e7cb858e115947fdf75c4efd7b5eda1d7fd1e60243ff53162db8bc57118febaefd471535dafe9391aba58ab47f410ebde833fbcffe8bbf52367ba03c6df6790cfdb570d5fcea7ca4f637feabffa672ae77e5631a197bb91ad9777fcbbb7ec78a6c8787d695dff5567a8f488ced91dffb34827f520e3fdb44f7d55d2b0f31f61bffcc7ab5a6acb62efc73bfeff579cd7315490f78adfcb31a4d77ec0ffca1ab7cb955293b147bfea71e8d1cfdf746b57dccdf021526051ff2c403fb67e53010dfd8c6c0dfcb6b36b76355ee97f5a3402a4d763d291ffc41e0c82b772c1f44d75d33cf59fa8bc0b58f81fab235e547b6f2cf8380a72a3aba54723b909facf8cfb5ebf7e550b525141d955fe64114c44112a4ec55e5cd974116e44a939fb51caa7a572a5e78e603d60b0a39d3f2a6e3cae0530618546a76172a36bb967650078d9b063b76fe63d9fabdcfb7f629d84bd5737baa66b3efaf3e8fa1bb0f0e320d74fcca8393aa75e2497b6a355a4754445108194c830bbf63d7c1a5ed045772628f826b5eb08e6ad72ff8e4df91436313831b51e8f90c66c1ade3077315dd6cd5bcddc96e70cfbae245d9c299d2e4173954766ecc8ec12278b02a9e3beffea7f90c1e8383ca685cf96047c1938ed582a51c7d96fb5fb1891f6d0c9e8317150774957c2f8255f049123dcb79d791bed3041b3e0b264a6354fb541b3a2a7e3da876be066fc13bbbe4475b88c82d146dad836a5dc7997d1ac1bf20871fda1c74831e9bb3839ad7b3e05c49603f1870dfb9f316df7b6665bdc7d63a180a4b6c822f6b39c1d81babf91ff23c546166dbc734e4a1a94f863f2587dfca050f45284557befb0bb7b1d7ecf14b6b6215d21f43874be72d78b27b5fdbea9e8999a8c5b5d887ae2d42cfbeb2b7acc797e1270bf4b336fab7e49046d199b136eb0983300ca330164ffcceba0893300d335eaadc53d9431d87f36b760acd6a8eff1a165efad19ab0d4eb76721b56eed8c67c22d8072f614df5fd844dfc562ea0e4266cedac2a3f0916ce97790dcd59a3f0c04e7cac343e172afe5711f96b7874fae1896d441004e1249c86177e1b13861f3ef9a7f5e137e5d0d8c460c9eec22b150bbc84d74a9bd3f0c6ba0c67eec01eb050b5ea59e72bad5dd43e706077aca51784b75fa4b062773a77b1a7c1d1790be7a66777fef527b9ff5dfffcbdcdc432eeddb54cad8ab956252cc7f95caf92805ada72132e545cf1aef7e998b2d5fe42a64e246ec307b691a5b5081fc3276e792bfd4f07a8ccf617f2e49f95433502af62ab6db197854bf1183e874fe1297cb12efd9eaffd89f2cfea77ade2aabe8abb724baf37acb9194329c25568ab1e366a8c0761255e3e8de1dade861baacffd5d19fc462e3e3456450d2a236998a3e2a9b7f0737ea1b4991d9567debbe360624772dfca61472edcda7b0adf9c0bfb9ce522529afc6ecfc2adbaa6d7e4dd5fb385bf2f874bb3a31876c22bbb13763d3bec8567e1b98aaa1eaca9ec2afb31d47228e62ab3dbe948c752be50cdf33bbb0b46a0cb61df7f5339849a7b6b296d2589b38f316caf0f3ec9d54fc7899fbe3f0c473209c73a16e07de64bb30fe208bdc3c95776e45ec9bd57d807dd46152336f6446c22cb7d56f175693b4a1a9fe4c4d16bdb75d089c89bfe42ccfa3b7248a5b1885b7a6dba1fd991b05e23c9522b6279e444aef2cb91dc686fabcf3ca8163e6839549f2739d47ae5a50cd64ab62aeb8a558434893cffeccb181eddd73f9ae76f6dd3e7ef477e1458b5bfb09e43656f558c750d6b48512807ced27558576e94b79db8e328e27df9a062dd9c796e1ac5d642c9a023a228895271c1cb2853df3671cd3f4d0ecd1964ab9689e8b007c78b7277264fd6a575191551e972255b47e9f3a550710d53da6d77548ee5ab28661cda4ecf59f0273582a9d0abb585bbb18ffed5e711507dadec93f3f207b2f89d3ffe52421d1c743415eedc8d92bc157f8a1a3537b6d2cc41b8537fe9f3173e73ded47c5fa8ff56312a1f0555b48bf66e181dc293ac22edbd5584e4ed289ffe7919fc2339fcd066a5285395c75d8a99e54427a505ef6c2c7cfff4795fe5473fc186796cae4674a17204c71e4593cf57ed9d7bee2adf194da9bee822bafc63990cbed4110a7eabb28bad7d50d679cc87eef8fb764457f2953dda27f9aa4669105d0bce766c25ce5568b48c6eac93fdc27c768c66dce8debf400edbdf4c44b7d1dc99f34ed86349f824bbc2633de5cdceb42caadfdacb2c95d51e8757d19dcaf897d17db450516da3ed21cfbdc0fe62f3bdc6f5fc8d3e1b113d7cf8dfe8f13b99fb46269d5df4f4652e5e9d77bddfed5ed991f3162d83a5d8b807ad0beaa3ec9cb2d7b5638b17e59b6bd6111ba5c0cffead9e62f7d6b57c2f7a11b75fc7fc9f2a87c6f6442bd171aea275b4895e55ae12dbaefb1cbd395c59e2b18a1a9487961b250d2a27f523ebd96aac4ad9a8c65a46efd1d65a6a8b1f75beaee4a8f8d0b10efec41f46dda8f75127f9e7e84cff8ecebf6d933b155b36f9dae7a8af2293bd788906f69dff281f02579f62c076283b1d0d95ad5319b3feed47d1281af34809f0b9bb14214f622b663167edf9a4d8fef59ce9f7e5f0c3f6c48239fcc979b0af6219252cb32e63279cdb1de5eb0a25033a3e9ce9f8900f955d51b19af3e4766215d15887d80b5fb53cc86f2c61ecc78155796e1caa0848c626fe53fafc18c7b2eb89af321827edf9dc8e55c76974ff39826f4bcbc438ce39f7876a2e57eca8a205150b2a7f3d57794caae358f9a0fdb27d503a318c0be5510211ba4b67e5dec66570b027fc63bdf31764f067e4104791597538b6d7721a57516e052abab9b0b6b15e39cc950cf655bbfb6d3eaa63c4815e2b161deba0d791f54aa8bd8a1bd68b775f24e729de5bcf7aef8517d6537c887a545f20e2a360ee213eb9b9d2ec33fa7b3cf1b6fe56b7c3573989bdfa3a86de4d3c75d3f842cc552ca8f778e6da0e2b59acdaa82757edd2918eca53d83cbeb4d3f091e53c7297e153f0165fa9fc7ea9bee5fdba2dfc2939b4c93e3047c6ac13c4f1757017dfb0ccaed92e9e495fefd5aa99bde5cbf8d6ee283b34ffda3bfde35fc5dffc35be537e7eaed784e4d6eaeb3c2bbe47795bc40f51377ef479fc142f5b8d567f8f9f554ecdc5bbdba8785ac9177f12e5d712c583cce3972f75acdc6bd653333f762fe3b5755039fb215eb343bc895fad852c55027b19bfc9476bad7427f75ec1a3fc9a0cfea41c52c9cf56adea7f8fb76afcf4399f9393c69db8fbed78059e96417bedaec32b9587bdb96bd151d9c83777d943bdefe2476afe23bed2a7d9e21ed9c1f8213e8bcfe524eec78300f702e3a15e2757323e8f473afeb49eedefe62a1e275630d16b3462cebaec28affd713cfbf62ef72e617edf1d265c9cb34d62c7a5e868398cdeb19fff02395c1adfa8b5993789b0269667bdc99ee3d90f1ed36bd87a8fb95dcb1eb20ef3bd31d822d5d38acdad2aba73f75ffb110e555eddb4fb2e07de0fadb095a944b6f6f0d18be2b3c471ef5ce62f1357ff4dd48997f849c06b6fa7ed1a53f69505d1379228552bc2459b1fcfa4fe8702946591ef7a3d5b7454dc8a9f246433e1bb96bbd4cb3ef19b3fb40eee9a0f93e8cfd8c29f95c325ae99445c0ee22a899344f862678549eadf2419aff5f9146fdcae69b73973bb36522579380e777add3829be95854459f1e0c85c25834377e3ed92aad5c66bf0cbf19973604f49ede62e9e6908627d6acb2b93868fbd3d1f07aedc896eb2fba6d47d72f0f6fa1e9593ccc24a6e75fe0eebeae115fae9675e86f7c95144c92999b8b7b61795c994f9d12cb9f833b6f0a7e5f0233f9d2597ce5d72955c5b537699dc24b3e456654f4358b301bfcce67adf427b14e6aa16f7dd3af82612777ba1cd427dbe91cfdc2b77135ab19728cd4cee927b6baf245d594465132f920776113debc83b79d4e7b692a764993c0793e445af15c96bf7f5dbb9b1d36096acc28548434b49f8b35e097196b25d33d1de45e7d5d6b3779bacad0b59baa12cdcc0ff74aef7d765f017e4106da21387fb6463eb678aaeac2879f56e55249df381eba82c2f66befeadd794f5da8d9af72679136efc8d2d4cde8399d74fb6fe4ee5f82a8f4d3a629eb456d53d4bfcf8dd2a939eb689c959721e672ab3bd4cfa491b7724c364948c534bf930dbaf532616e977de4b4c9346ee954d1ccb3d1f46433f4a6d9dc387e3e42d1c2bdba17c4b2ac22711b03c95e14b62bbd74a77967fd616febc1ca236db2ae37be2978e3260a9a362ecc4bf12562b877a1db1d0cface8a842e5c7ae3e63a0d797c32ebffcda4be755b5f8c03aa92b92d67ed9c90bad9ea65eeaa741f2e03265131fd230f6d34894491b73d82c8dd3244dd32cd572fdc4baaabea57bf1b5f4a8746a2ddbc94b3b9243fba0e450d944d40b659ffd495a842f6ec8236b2b5fa2b11ccad47b8dba7fce16fe8a1cd2c77ff6c7696979ac4a1db6765f9250e5525dbd1fa6eda15ed756b98a1b2a1ba42c966b2dbd6fcee4060e2fddda8fb42d4cc2b492b364c95749276d3d97b84c9b70abf4f82c5ee8519456a447a5dd3956b67794ee94243ed997e91e72233bf65ed32ffbca51572aab9d2cb57f5651abd20a4f5a8dde6b56f181b2a2e1383da6271ecae774924ed30b95f9e93dc863fa0779fa3f450ef1131cdc697a955ea737ecc58ad2595af1523f53047bcdda266a5fa8a38f70acf295bbc8fa2283a7e82ebc627367195c2b4bf5e6edd35bfb2e9d4b3f6dcfe0078da37ea2b3f45e45cd91f22eb19ba60b8c5c76e943fa983e392c1985dd742937d2d63e5a74d2e72fda5c062bbe4a5f9246e5cf07e5c7b7f6445997a7768db1a372ad05bf6365984487b4b487da4e0a2b5dfd5919fc3372a83e155fa66bebbab5893751986eb4e5d66bd97a5f45efedb13b79adec61c79f849f9f4ee0e191053a6e6ccf273e495b285b28a7beca3edc7edafa07ef3958a66fcaa30cbc48e52817f15928fd237aa245b0741e5215c5a5731522acf4dab48a040be6a75bfff58b245ea69db0abecec8bb757d9c7911db4262b69ecf032edba23b6f1cfd35e7a16bd09a97a53466f7f5e06ff8c1caa586d9b9ea77d2b0e2ed96510a403fb3e1d5a1b6b137c39cdfd2b3fe9284669b51f122b1deb0c2f3a53d1357755629ee1ba47b4f67b4e9e7df7edccb65f3ed6d49c4326fc3c93699539cecdd73b1d9629cd704e99e72e65193e66be3ea394057f4506ffa41c32766b37b66b5d6661dc1145bb0f51f96d7cd89e5719584bb950b6e7dafd228559e40a6529afe4c22fedb8ddf31d6b9b95a9ff66b813e4bffacfa98a6ad2fbf45ecba1b3cf126122a32ccdb2f431cbfdf7ac5036b45191d198f97e24dcacfcd8c3f33aeace4afade5ed9c54e6b3755bb4447c7acfec2aadc9a2db23a6bfcf36c6789eccf9f09ff0b72f8f16169e406d76cae62425f0e79a16c5caeb28e9db6872a5eb8cabe587b6ba06ce13876e1ac7668e97c426e9cb7f6b9b8218d61384ac7ca0eb6da1c28a5cf8e1f16353b655936c9a6d985b2011d69ab68bbe27d15af4c62fe754523bbccaef8cabde263152746ee46efa3e80c145642b2ebec263a4407bfffd7e4efafc8e1c7279b894dd4d1fb7bad1df47991ddf24a794137beb4932f23c8b37992c96b25a30fea67aff30db9d1f64aaff7485c63e36e7697ddc771f4183f7851a662edece1e3bc04bf7577d9a392c4a76ca9ec9d9e8b59bb16d36181ff25de76cff4f948bd8f22373a7fb623bd8f02118ed864cfd98b7cf9ebf2f7cf9043f8b0f3cc6a738e323d871d52bd3ee205c1faeb6ab396446bf0cd5ff047a23d13a76c15f4bc1b1561ab18313a17a5bfc9f00448b689be5bdf402bbacd7004b3373363efd9d6b1a51d5a7ca53e339dc7679d6c1fffc96711fe7572f8dde7877dccbaf4349a7c1442456d336f2fe6dede1df3958acf0b79f858c772a4ecbbafd163a2e4308eb39e33f954ce99bc97b3ec3c7b4a33f721e9d8fa44d232eb2778d2d45d382fded11a78c76fea1f38b37f621fff0572f8f1c9b45dcc60dd46af657bda838c55cefc1498331cd1955e6f54b2b1d032a2a21395db649fcee6b867d981dd056f7a5f252abd38fd92e5f037a5cde36c9a2c734bcdc1951de5ccc1f85128639c6476871da23b99c84c59e8951de9330e01f366ff6cd9fbd7c8616eb383ceeeb5dd71d7b046e2ae6d1d0d7ab9a051c8a5f4c127ebf515fd5c9cf299efe92709ce9d88c7f3dc8d2edc2afc7cd65f7d37f5734fdbc376e561691fa41d74c89b082e2365ef746e7ca57e2f550cbad47b3dca26da7198fbfff97218dcab6826b5962a176edc06d60df56a7cfbfb907f7a474cf8ca5fec83f699fe3b3be5a1fedbc789ad3ccae360c69e12bd7253daf7d9e7f37022db456f49643ffbefe1a25dbf99b9e9c7f327be1d1c543ebc50f948970fe53669cf38f0b1ce57f82ab7ffb3e5d07e105b7fe13feb353a8ac3941cb63fced2ad3fe4508d52c24eee033bf96d3ce3ef94671e64e6a450d0782c6d74ae1c9d49e9bc879f6c9b58c859bacfdbdd286fc92225d12befd3aea68c5424e8822ee8d58f6828f76ab654661e452aa317729567ffb172c8b335bb634e9efbcf71da3e1f5cab4f651d9ca59645fe947f5a854dd1fa65f7d13d5f59caabb08e78a7e826a8ac3a2f758ea27cb39b571f11b67f93b1bcce9b7c97efd3797e886c3bb12ff34f63accf60ebfd96764f79ac3d57bb9e3de43772abcd49deae14fee7c921b65fcbe2da529f888b8e3b152ee4c57abd443f0f10449f7aaadf4952f0a11de928596ee44647e8f4244e3e618ecef6e2a7e8dcd907f74e63bccd22f7f2697e915fe657b99534f9b51aa355f244670e953d3ca8995bfa657b32a5afd7b261bf51c59045cc5353d27f961c7eb2f8bf912dc72b6f1edde59f9ff629f53e8a977bd255f1afffaefa7b2387244fb954f23c4b542c149d270fc13237518fece6b7d9349fa759ee4583f425bfcbef955f5e184de7f9837b19bee68f3f6e89fd6947fa3f470e3fb510ffe63f5bb55569595451cdb55b6bbf9c3fe5cbfcd3ea54fea26da6bb761d3e4b1a6dafe4837d077beef92a5fab8cf65adbc3f82177ddd469f28d8fdaefdde6afc9484736c9529f52d732ec0d3f95fc16af54fc93b7b97bad73202de3de5849e7217fffecd7feb9b2f8cfb187f0db7ff69ff3ad55c3595365dd537dbe8179deede7e7df448e67058f7af54afbd66c0f798a779e77c485d83a4ede8d07f183bfccf6c193e3d2c990bc979fe5e769a6239bfc5eeadda7e1e7277bf27e3ee04fed7a7adfbd6a7394a15ecf749b70ec8ddd5a9fc9ce87f9281f17d63f5316ffa41c7e923d2383ca2f8763abd6f64f3e58079515abd82fea142c5dc69f64a0e096f6df2a6fe6c3a4f1f6854dd1a13c049dbca3a243ab1085d4f650f6ed3b3171bdc2110fe057c41ae490af94bdabc54b62229bec2d983955e1eab51ad93e0b40675f9d25ecedf92a922cbcc22f8222fcaa3f7f871cfec0a63c33274ec3b17c6f63b3f6791515bd3d1451cced4efa693fdd2b550ed3c8546e8b58da69a7c0b509e735ba2bd2e43dbc8ae76d96f2e845b9939f2debb40a66053e05155d654fb9a5bc5121f7fabce1871cbab2c8fd891c1691ffc26b959fa8b810f653785f74e5b5700b151d1465511575d1146d649e0eff4e7bf8c9a6682d4ada730d63257dd7aea3d76594a7a80bdb1f322fdc597a0fa6a2be2633e6e9f36176ac22e087a03d85eef4bca328ac278b39237bcd9d363e3cf7a262efb4cff6b917c521c015c274e07ad993964395c95585896d8a532bdf2a772c26de8875742e94c56a360bd1556d58aabf4fdb31bc282e8b2b5fcd9ceddb2f72fe77da43eb631f8c3bf7fa091e7bc25c6fc787ca9a47a1e5662291d7ed99fd39f37c936fa8ffa91cc29ef27eb68f70c78acdc28d5cebb28aeba017bc45172ab6d1e71dfc02e53d293fce4a1437c54c29e338b4bc711a1b6b18e8bd44fd4619310f9ce256e7d34aa79f95c4eb33e25b6ba977268a7971a7e4f05eca70582c78513ce82784ff1e395ce2d987e2b1782a96c573dc5807bd1aabdfeca7626659bc387912ea5d71b953f9ebf263d52115f0dc9eeacf8a4e16dbdb10f3596764ed622b10c51ae4d04da93e36a0e7a1a36be7b2d8e8f8efb33d547eb76acf31e875e02d4f032e5ed41816ed19f127ab29daf5b1e2ad782fb645a7e83aaef55cf494efeb7956eefe7d72589c15e745bf1814c362c4a47e5f6031b64469950c2c94786fcf15b8a2f3212ff15ed92769bf14b392c33302d9bab44b01e546a59cb94cf9e5a7f8499f512c8c8c94d26e23bfd20987d2cf58e9aaccbb5f980cc85f418e2e13d6d34f222bb37b51fad267077dd65a58b1affe1694611995b1146562dfb279b8f376c96d9996d9df2587655e16655956a5fa6fefae6cf433f5ae57eeca7db0858cce8fedb5f6d7564351b63b6281f3ae7cf0351f9607582f70cf83172a57afd5b4fbcb2a4f0944ecfb47aa2fb9288f528d62792a27c948e51f99987aa36c4f714fb88173af3c2fdbf7fba4053b9517e5a5986b9b5cb6125f5e9737e5acbc8d9edc9ea3a22e76d46f5328e7e5dd5ff1d1bf24875fec866ad17db9281fcac752494cb98c308e2e9fe3dbac53b62701dd3b6d0f656c5505e6bd41e5bcfb8ffa39169549e3dfca95fd42e516d77a1f4fe7cbd1b996c3fcf051a70cf20eda03bf5ccb548de3a6dcd0faad53931c16ed3a44d6d7e7afc5b87c8d26851b17e59baae9bddc969db25bf6ca337692a98af50f4a6fceff5aeef20b72f825bee7ed1b84ca7e392887e548eb63aae654cc1dee1edc839adbf674be23e00c98b280680f2bd5cd767db1e17d58b9f16eaa4f32a0e490e9bd1415db9c4767f973f5e9393ee790f7657bfe359ae8b54ab9e533cf9ce6891b7d8e41dbc3b47dd629b779cdc7fa2941a5ddf3b8d1ef17a944252ba7720b8bcd2acf5fd8537b54d1538eff2639fc982fad8f5550855554c5958e135474c79fed4eb9f6c6c5d83d546deec61ef4d97c2d1f01ee0688526cf47302d68197105b575974f549d61ef52a8317911c068bcf6da8f2aab57f5529c642bf4d755099982978d1cf6379aebc86a7cf83a5f3a606722aba2a47b974b8de31a8ea725b35d5aeda0b5ea9b996efb93939fbef96433bcc955c55c7ea544daa6975515d5657cc973b95190c59e88d59a7ba066f51ddc069a114dfee51cd986f35a9adbc4c47b6bb9ed59777d355736d0fbd769da7ba8bfd70fbb90dd57db5a8d46ce427357607abf12351d029e572ace24e2573e51cac6c70afa46caa9f9dd7a78f1d5e295b5a3d55cbeab97aa956e12dbff466ee989ecffbb7c9a18909ab75a574a87a5572f856bd57dbea325779bdde6bae3af13abeadba153e2f5c9d8977870b373d921cf281cea3ed4e78004dfe5a47d84f8ffa9c889243e557b2cbfce5eb75b1f45ac9d367f9f533f1e9399d8695574aded696a07705e5cb9cf1a5de7fe67975ce9f2b158b56836a588d8abb6a1caed3556dc96ecdfead7248b26864d25206a7b66b51cb3c531d7b6acfdef76ba7766baff66bcc91a3b13f7458804f2fe552bfeb438de300f641eaf06b1db91332bdf2a5e2eb631d491d287dd386b0951cb912d2aa9d657c2957751b3779177512f02886e7e0c5433175cfe3d05a3a4b7dde9a977af547a58da3caa955de582b7f561775595775fdef9543fad4ed7a66bdabf7f5a13ed627af13c4f5a49eca61a66288faa2beacafeaebfaa69ea5abec4abec73c2e480ef5de9fbcae5bdf597ff79e25f9a89ffc8cce54342ce307f7ad9e7f5b377f84a7adb220ece83d43f2cbf59ddecbb19fbd34bd109360a54fb6f38d7e128f3fd91baff545f57dbda81f6ab3c2585bf553bdac6965eedf1a1f96abe4c2cfeb977a55afeb4dfdeadceab770155df99a77eab7fa3d5e671d1535acebadd83065b72a8fde5c54ebb75fa92c0532b7bafb7dd9f54d20a233adcf815df7eab3efebafcfc1af043d7dc21174b9ca9d4b7fa0c43c617e7c91dff03a6994c4574e5cdf6615edddd7fd7a500f431563570fd95b3d62217fadc7fa710defaef9179f83fd768eac3ad87247bfacb8918dd3b80dbed92b5fb33316367e13c4b7d17de0e93338c215b209ad75d6aef607b97e8f2c44c6d93adf7c5f57e6811ceaf3874dd4c4dfb7c709a3d69b861b5f4502741256e9805bd82ad774d52c6d8255bb8f5df0a13fcec96bf02669d22653d161afc95d6e1ff533354dd1944dd5d44df3af3c8ffdbdbd703bfe7375487acdaed93787e6d8b4bb3de9457dadfd72d6a99de4c91a6a89b30ecda4099d659281ad4f76f6c11f47ad75cc7ef8ee62f6ae3d8a8eb273b799fea83db1d5b4e3e64e44c75e37b813d3be9b7613b4d6d61d17aea7df3231d3fb7b85398b536dcb5973d55c3737fc89e72abf9fc9617a5e5f3498753b7feadf3df8e9e7a4682ed5df9a5bab965b7668e6cd5d73df2c9a87e6d1bbf34e4920c6fca5096a65139b27a6624539f4b937e20315b78d8336032ba7bcc84bafb540cd6fbdd39d6b6d0e44fb46a01fb629c63daefc462639ee93f07e701deed2c61beaf32762de3ce70bfd264b478d65f392ab6f34ab66dd6c9ad7e62d1de87733c98c0fadb5ffcd299e7f891cf26f7e987ebf8370f9b577d1bc978b665b8ba6d3748bae75c757621cecaadba617afa56d8ff4feb17e46a439b396a0bff5c88eddbd7ba6cfde34e73fae53c787f183de1dfdad3635fdb88d70642db6f036932cd132a7d7686c353f7a1d5b6ebc585e30fdbc4c3766cd408de1b01935e39db563f235bbd5ebe8ca2d7edbbb7fc9f37adf8ea2235564e6d99dd47564e3edec9dd8c99d532e93f762ac6d90c577ae25761eebe88c43ef67a848574517bb367bf0c36028db583159fc767d7a14b546ff769b22dc47f436f06ea90cfe9d091d7b76f5cce9b543314fc7bb40ef94b26017aa7645d5a8d9ece25d227831d5a7999df7dd37cf9ffe9be243ceb6d69d7fe3e7bb6c97ef8a9da807bb7257f15bbb23fde63263cad75da5e75cbafa1dda03a5576e6afb0b789ffb0ecbc81deff7fc208f2e5a59fccdb6ec1af3a6bd766e763bfd3e89409f101d28af7f5dd89a79e1d77ee5aed56f1543eef695a3e4f050dcef8ed99b97c90d9d97ff73fef897e4f08b6d546d39ed2611db29fbb6bba80fbbcbddd52eca8751592cb44cc861316e8252e5718eddbeab73aef758e47bb4fc98edd8df5d3b97bf5d8f96c21fbc6ff3d34738850dedd9b572986eec8e187b523fb32533a6243de9783bed35e2262ce34bbd7ab89b55cdee7637dfdda9ffbe77cf760be74fbdbfe12fca61eba3770fbbc7b2f5c4bb8bddd36eb97b5672f8e2cec3b734d66fe8d6d9de6ea524f149f9cab93eff22bae2c5790831ceb62ff39bddfaf7eb5123f8076d115b6a8ffe89ae022687f6416edb779c1cd8297d16ed1ab66ac14514ea2c65b769e5b0f5d279e6d9bbb7dd9f7e56f4cfcba1d6325f29519eee30d6df6d9bedaeb3ebee7ace94cdf4bf0ae28dc12fbb8762acdf4b28773255792ccfaed85e7b12afafb2c26a77f6d7e6deb2d9097e676f89cfb6bbf3e645c9fdccdde877ede877d4729ebafa992d99a4781e77a722ec725baa0c69374857e98abf25c15fc94ffeac1cca30bb5319d6603784bc7437da8d6bb1b7ea67afe3ddb09e3716e33dab2ff8ab7bf0c67ce82cf5b97df7a179d1ef1e14853fb10efa3493bcfa6b73fff1916f7b1e737f12787b5b9fabb523e5716776e48ef7c27d5075ba7ba93579efecdd7ab0f7f67ef5b00f8275b96a827d981df7d1bfd71eea8f3ed395ddb263edec959dde27fb749fedf37da157a454eef412ddefcb7d555fd99daa23dfeda9dedf55f7d57a6fcd5fe85891cde3bf3cf79f3f79aed7aff72a0a50b9b8dd3e0730e3ed79b2fd4efad633bc076cbfdf1ff6c7fd693f119c9d872a972ad77aff673ffd1bf6f52a1d1feabd8bea20cafdc5fe727fb5bfde2bcb5ecfbd500efcbbfd6c7fbbaff4db5a5494f6ce736fae7a77a7e54fbf8b53bf8729fea79e7751eda998a3ca55318db689fa1d27f6484ed93608f317b1d9cff7ca8beceff78be6b85771e7fe51b52df174d6395792f0b45ffebbe5507f98633d8763766727fbe7fdcb7eb55fef61cf87c551b96ceef69bffafbd6b6b4a5d59c2effb6fe43d05a220b59fa641949b5750e16d720f24841092f474d5f9ef6726a082aeb55d2ea3ecaabd2ad50555c64a98f9a62f33dd5fe70ff33bbbbd38369b9ab732032efddf6c93173b6b3aa9312813878ea158329653ddcc1ff9c5bc615a4f59edb9b419ee655e44997925afe647b9f4eeeda1f4bc6f151723bfce9fd8a9be078705769e748739d56c736a9fe727793d8bf3467e9a3751cf16d9020b5b891c0d34d14a93c5b5eb6b9eca4394ab399b555407186751260ea58dae9853c51de10668a354c4d2a6bd8ae0d0437f5dc7194aed67b61423a7cad73106f87c66fb1d387cedcbeb6b75de88212e304aef93062e31c61d8605bb9b9fa0a9f730898c6505d79613e5515765bc87559e968943ddc034e31161163bda313ee743e436167be5718602697591dc204b462e458fb12898adeec2777b899689c35751b9a6af11b025c7b08d67d8c96ef17c3dc40bec620ffbd8c1010ef112afb8837b753e490d6ffc465c9d27e5e210f7aa6fb7c8bbc3917c9331dee3033ee204a7498a95bcf05135a679d27e4f70a7422dac7f3d0e77f0a86ce114b7ab45aed923ac491c4ef018a7789200d6b191dde0293685be4eb3a36cb0ffeb78ab2cfc6dd7c49bf15347efc210a6b0d27b610b47b8c2939fbed8e6cc3935deb51a626e5c1d224eb929f422efac763800ecb10844281622124bec24b036442c565212b116a9c8e27edc1779da489aeb5b81423893d230f8accb0409960b01a225dae24c74c4b93025063be2228be3b6e88a9ee88bbdb9b42fc5305f1d264e5173bf7c1497e24a5c67d1e644271b78faca1737e256dc8991188b7bf190f8e2514cd6196a622a2a794b54c591a889637122ea1f78debb3a7af35d22aff1033c9e8ae6ea9c7492ba28a5d4ddff2bf1543b449cb27deb376fabea86b384e4af424d06ab2659598b6c72b03def924bbb8cc9a5fa86af46c5a719cd29f8d1fbfdfc3a080eb9da2749bb0e6a9e3fb71e36a7e4bb4c70a92b1e66c11c28a40545b4a498569450f1df541206f7df8752ca28272441448c607f949eb82189538bdae92af5e88c3ac9532de0617098a9dc7f3d95b1bd8c09c258afd3790c2f2cf1f99c2ea84b3dead38086744957744d375458cf3c2c138737cf67de7447231ad33d3dd0234df81eeb2c4dad813e36aea892277193aadaccebe87d3aa21a1d1f02879b4fabb3e94f22a3fbd359df4119a39e68356d9b63805adaa713aa53834ee5e83599ce34c699e230e4ace47e7b4f386216b399c35ce6319fcdd84e55916226d0476a2f8405f1304f5848d5b8b9b659c816f4213ee45270b89df3820ff14cf383953fb3188bd872c32563884dc70fd458cc562c616b96cad1cb58ce9009468ce925e5e2bf1506acc5daec8c75d839bb60cf757cac67d5a340314b321935b3c1aacf869eeab97dabe2e52d9bc637e27077ce9ce1cb4ccfafe54a99ab5c6c76a9b22cc356c4d915bb6637ec96ddb1111bb37bf6c01ecde5a25d2606f7854dd8945558951db1dad2b0b6318809cb4e142ccfdc59b2d3d1c54dac815693633888bc6ff60ff77a186faeb06df56ccb8b8c40ab1ae016f95ec6253bb627ec84d559839db2a654f191aa9b0f7eab9fdeaf0a68c055aa17586083c3f9a62b04b8e0816fc7bb1eede65a8eac81710ab3cfdae64fe5636f2f98dbb0702170b8d6b313e995d5b52bcb2bb8db1b464b46f62dad122ccddea234bff027a23a1d61c083ae62c3d0685e6488401856c0cfb711c90c14433a3cfb10dc8608969fd3899fa94f79b9cc8e76edd4b0c5cfec0d6f97ab79d2662fe323956760cc6755f34d6fbd2f91221f5bebf98e6b990b2862e3288415c89985b50d904206b9140401041b5dc86d2718d917df8cc3c2a7323675e913287c31685902dad178c3a4e24456a41825a5ddbeb5f9acaec75f8abf6709218c14efa6aefc8478e325040db6adb1f27d38d31a7a50dcdb860e9cf3a246cbecc2865dfc9b71f84a940e7c7cc165aa43d70b62077a8bf262e35f149e42dfb8e3c7bc3377e29d5d443385b7bdfc865058467b0897bf6f9f4be315e1b053371c4c9d9a1b7e0ff67e2c36fae92e13bf99c1f58fef553b9d863633ecfa57f370be277003426babacc87262d032645763c32ddcfdec3e57eac538e46b1859b3df794e79fc3630d677f7450e88c197b5f174cdcee1fe9fee2df885b856597af0f0f1e794c76f03aa872d87c9e7fdfe1285af8bfc309842e59fefb523a3e78cbda6ff1b6ba84c9e25a886f79fb16f5f8745387aff5e69152bced89f6e35d14170a88457ddfec1b1f77a7dd47e7d5dc0319c7c7c1dbddb4fead0383a086e3ff6bb7fa59fd4f761e65f211ff62bcad487ff552999fff03f297f70f879f983c33f38fc37c81f1c9680c3fffdfdd7ff0129439aee</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="2212">789c8d95cf6edb300cc6ef790a21bc0543bad46d80a0d8236ce8b1c0b00325db725c7405baee30147df7919428ff93a3f092d0e2cffaf489926f76e6e9f1bbd9dd6cfebce3fbd919d7e19bd9d57f5f5efefdfcf5ed63b3bdbf33d59d3954e6b0fdb2d9ee8d333f5e7f37fc9f8a0d7c95e0b4d6b492ca674d8fb79c5a4eab4315471b4dc3e859d393e3b4d7d4d59c22a7c7dbe37d28ee340dc5ada6a118383db9d3298c7a4dc3e87e1980d65a84cc488a2c894ec3aec31912ac1b055e4f82d4032b0ed35e4bc258235e4017244b1d325c173c27b974ec8aac396bd38c8485ba91dee90b66e47ccaa8971f91e597483759e564527097481aad9b96c2cf262d92ddb94fa13044b91748ef5b094f8c6f196e935c1497f3a4e7a03e6fbaa8d6ebcc5648719d4e81823e90006c3950208d85b97d9cb8b762112f1751bb8b74c9a1a3dfb02a44a67924ca66f839989bd452396b123269b7dceb01f6096e88ac5b1f49afce4fbdc5f0fa292c64dfd7e430b0069fdb15dd3b650516877c4b6437dee84527a4ee4b30938da89df465a6fb868e1758dfb6ba9fc9a2d06a887a7fe9f12990e12aa18618ae2f1b17502087930ca17586135b2261586940d3ed5222e7a84d6617bcddeb359d9618ff023fb7e41cac9361562a23a386ed8dbb33525cf83a24e588ecd9f853b3f245927da13a1b37079637e70a39556ee7ee5c41eaa2339f8812a9e8f29a2f92d24cb9cfe8f6f361f31f007ffc50</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="93620">789cdcbd47733cc9b1edb9bf9f82766b776dac1e50004a2cdea2b4d61278368bd4a2b416f3e52732fd1c6f924df27693bc6633ddb0faa37f08919111e1ee272245fdaffffad36ad4ffd37ffdafff385fac4be4fcc909add39ffecbbd6eb7cffff37fffefffe73ffe33f7f6f6a777f3f9f8c87dfc29f79fffd77ffca7d3fa93f3a7cc5bfa5fc26e56b998a6b7c19f48cf28a7e9ae457e4fd31da61791bfac2cf5d96047d26f39e5343d7817ce15df530eafc21f6fb9347feb53b994b07d207fbca7f53fc09f48ff214b7aefa29ca6c738ff8fa2e45fcdc9927f515696faf6e4cf347dda50b6129ed5c95f292fd03f1f8ed4e7de95d3fae627f2573a1eb30fe5b4fcfc4bf8f34dd83a823fe578f68e2ce5e743723e650bfdf389f659cc5f94fccb82729abe8cc852de437f7da27dcb1c59d2971fe4c247da7f33e1af379c4f8d9c97fe689225ff12f3edeb0be53d7049dae316c8385e918cf2efca76ca6f6057787e2417d3fcf38170febd28f94be02fc9ef74522ed21efc93b2ccdf2618f6e0949425dd0263fe3b45e534dd2b93612f5d30ecc1ad284bfe1759f2bbe077b4cf2928a7f9af0db2e4f73260b6d75116fb7d82d1bef0269c43f9600bfe147bacd7c0b097ca04ecc0de8e6499ef37199fe2c71bec794e46fe37b2e49f16c8625f4e0e0c7b6e66c892bfb5564ed3471db294cf6695d3f93440fb69cfc36fb2e4df0760b4df79574ef3f78a64c93f71c932df23cc8fcf37c9bf9c9325bffdad2cf6f00946fbbd1119e77f5716fbac90e578d385b2d487fefcc4f9597b32ecf75359eacb93c5be1681729abec27cfdc4f95a27b2d4676d95c55ff964d4d75296e365c862bfd65998fe629a5796e357c15f38de860c7f505696fa0760f887de14ec4afed65059fc35e697f10769fe05fa93fe608ef6e44b92be7c29a7e98b12b9f499a6c7c285f79293b61ffd51607d077049d21745b29596cf4afc28964aee57ca984fd6bb974ff898dae7bbc66b2f07867d7b1fcaa9bdf94f32fc47150cffe459ca92ff4186ffb0c1f44fbfb0f8a71919f5d784d53f659525ff832cf9fd89b2c4ff0d98feaaa12ce55764b4ef5d59d22b60fadfba729a6e97c852be325316ff7407e3fc9c1e19fe30248b1eb15fc239c607972cf9ed3218ed0f17649cff5159da87fecba17d414e59ce6f4296e3ef0660b42f6e9225fd78554efdc13a12a63f0e3264c95f0e94451f95c8e20f039c8ff1c7d2bf4f65f1e7ef64c95fcb92c57f44e81feaade88d2cf9bb5d65d1639f60b4df5f9025bf3555167f3721cbf15698df9f6cff4e59fc7f48867f1b2b8b3fc5f97ce27c1edfca69f9768f2ce5973c1efcf192f5438f05e80ffae7dd9d2ce58397725a7efd4616ff37769545cf8dc852ff0cf6457fed5d95d3fce1852cf5f5ceca72be6d32fceb97729afee8087fa17fec1519fe1beda5bf5ef694d3fcfe125c92f4cd5159cee742c6f1fbca125f5a6057f2c73e19e73f238bbf5da03ff2ef188f2b59eab3b764e8c92159fcfb1ce39747fb573db21caf5656167df14596fa9c37e5b43e17fe3b8ff8b46890e578f503d845ba4f96f832467f1718af4e64c49f1ff01718f65970ad34deb879e122e25306fdc1789359835dc49f2259e24ff6aaeca58cf3b5de5de10619f92365492f907d49877fb1be50be4646f98bb2a49fc952de82bd599694cfecc828df5696f4988ce3633e9964a9bf4346fdb0373b87fa3e9425ff962cf99d39382fe9569b8cf48db29fda03fadb467bdc8d729aeec2bfdb684f2bd573efba3e69e5c18897174b39f5eff1088c78183e9425decfc188efc187b29497f1d7f586f7549678f44d463c9b294bbc7b07538fdcc888df7365499f9225beb80b30f7131c6539fe1b19c73f2b4b7d1930cecf6b2b4bf93b19ed992a4b7c8cc8127f5cd113ba3e3a9d94e5780332f441058cf3b7ab64acfff2ca72bc1659ca077db2c41f1bfd4f3de0333ff4401028a7ed0d7a6429efa1ff72383ffb4196f2b5a1725a3ecc90a5fc16f381fac1f1c852fe745096f5614496f2c35f384d1f5fc912afb64730fae35a27633e3494d3f2551e0ffd33fc514ed32739b2d47fc17ca1fe08fb64ac27bf94d3f469932cf16ec7fc9c0f0fb2940f3f94d3f47a950c3d82f44ff4cf724796f29b86b2e89f7732cae37ca847dca6b2e82365c93ff8544edbdf9b9025fede6b60ee77d9ca697da73d19fae85339ad6f7a244b7d37ccbf4f9cfff34146fb5d6589f75f64293fba29cbfa0ce3f985f30f67cab23fd4224bf9c15e59f401eafbfa92fcf32e19fb5367b2c4f306ce9ffa64b55496f8cff2d01f0fcc7fa32fd2fc7e4359f4db8d2cf5db4bb2c4771bf5514f4437e5b4bca38cf5f29a2cf1df2f81a197dcb6725a3e80bfa09ef086caa9dee84a7c35eb55e14e8b2cf54febcab25f36228bbe5861fca93756276559ffa27f0b581faf303e05e899d58e2cebdf01ecb9483df3ad2cebe53a59f2f7615f451c6fe191ed34bd9705f3f85bb2a4cf61cf45e8a325e66be95dd2976bb293eaa14501fc259cc57c54fd84f357fd345116bdc0faa1a732f0af463f49febcb2e41f91a13feeca928ef134fa498e9f5596f42a19e55d6549ff248bbec8607ca8a7b26f64940f9425dd23a3fc4d39d52f59f82f935dcac7ca52de27a37c5f392d6fc11ea9bf32aeb294df93513e5216fd84fa8c1e93f4b1b294cf91a10737ca727cc44b9bfa714446fe9d729a3fc4fcb271be1e8f8ff3b37d65d17fa8dfc1f9380b32da8ffa1cb4a795da474ef77bf63e18fa281e83a177e2bb721a4fb75932f60b66c2d477514b59f267c8d0574365493f81d19e60ad2c7ac622a3fc5d59d26330f45cc0fab9fff4a32c7a3202f37a51958cfadbcaa28fba64d10febbab0eecf1495450f2ec892dfef294b7cc5f9e470be76818ce38dc9d063aeb2e805f4778e7a76ae2cfbf1cc8ff30f7bca72fe3932eaf79445eff1fc10bff7982fd47b4e958cf2beb294cf93a1672c65d99f4679ea3de74b59d2b36429bf47ffe87ed1a7b2e8c32919c7cb2acb7e7e972cf1db298371bece8b8cfda68cb2e83f8f2cf1d9c1f9ea7ed2818cfdfe0fe534fd80f3a53e733d65d9ef3a91a18f66ca697bbd1a18e7e7ef9565bf6a4e863eb295456f54c8d2fe32ce9f7acd5a2acbf5c4882cf52d3e9465ffe340c6f5c23359f4c3ed0d4cbd5f5096f1bd91a5fefa5e59ea677dd0732bad4ff4903310a69ef3eaca697a74254bf9f645394dafa03f8d9e93f5504b59f4e81759ca87b1b2e8bf4fb29cef05fec5c897b4be6b4d39cdbfdf93b19fd555167dc57457d20f3565197fb607fb53739e2ff4d71dfe87fad1ee28cb7ed98b2ce5c76732ca637ee6b9dfb65596e3bb645c0fce2b8bfe1e92451f6e317fa927672fe534ffc4218b1e7cacc038bfc93b59f4e315ed2ba0fda78cb2f4df1b598e3fef29a7f5afa664a9eff20d46fb5735b2e48f7ec892dfba2aa7e916e64301ed5ff5c168ef7449865e3c28a7fa701e90457f5e703e45b4b77d25432f2fc8a8ef4296f233f40ff5ab87f12de27ad06a03863e5de1f825eae133197ab6a1eca6f9d19e12f4f00af65b2a897ecdd864d18f73cce7922be9ce4e39ad2fbb2443afce95451fb13dd0b74bcc0f0bfa7939514eebcb5864d43755167d3626433f3e95d3f425f404f56f76a02ce57b64943f2a4b7a992cfa6c81fe32fa57faa7a22cf9fb64d4775296f41b59ea0b4b600ff5b17dd4c35d6529ef90a167efcaa9fecb60bea81ef695a57c4846794f59f429e6939d97f3714f64d4575496f13c90a177d7caa25f593ffac33b28a7e56d4d477b2ecad21e1e0ffde1579565ffb449c67e6c4b59ca633e513ffb2e197adb564ef37b980fd4d301c6db417b36321f4bd4d31b1b0c3d7da828a77a6a2fe757a27e5e379525dd05432fc65365d1734bb2e8bd6808a61eae90713d700ca6fe9d90513ea79ca6afe5fc4ad4bbe153598eef92459f850118ed093d65399e4d96fcde5259ae2f2ec0d0ab4e8d0c3d7d5516bd5920637ff30b4c7d7621e3fa1dfa97fa32b495459f6cc1bc1ebe514edbb31b92a53d0f5f59f4dc2719f55794456f92d1fed3912cf9abbfb09c5f890cbdf201c6f9b436ca727cd10725ee0fda17b2a46fa764e83b8cb7ee079694d3fcad0119d7272fca72fdab01e6fd220b32ea7f29cb7e9ce6177df1e2f1a99ffbca72bf0e8f07bd388f95458f75c8d08b0b65d12712ef4b5f387feb9d8cfe6c2a8bdef924430f1d95451fdec0d08fd687b2b4674d96f213b487fa705a564ef38f1e64e8f391b25c4fed9045afb470fed48b765b59aecf0ec8a2977a120f4af97739defd4096f2e7bcb2e8eb902ce51dcc77eabff05339cd7ffb01a3fdaf0fe534fdbc21a33d0565d97f0dc8a2df466db2e8a91bec2b8ff39b2dc952df3eaf2ce3d7204b7d65d81bf5a31391b11f5a504ef556780643cfee77ca69faf444c6fd3c3330dabfc92acbf563870cfd38208b9ef3e01f0bbcde9c214bfdc141394db7d19fd487bb1e18fa7479238bfe6b62bc8ae8cf68a42cf9c764e83dd86b11fad5f9514ef5e2ec4296fa239c9feac92559ea9bcdc15fa23f67b0bf128fb726637f14fe9efa30e328a7f17985f94f3de81cc8d06fdfca12ff2b64d10716fa9b7acfd92a8bfe5990a1679eca69ba87f1b72cb477a52c7ab44e46fb7bcad29e2c19faed4516bdb1ba83a9f71aca52be4c46fba6caa2b742b2d4e7c37eec1cf4758d8cf24765492f90511ef551ef792d32ca3f94a5fc8b8cf2b06fea3b7bac2cface2543df9595533de5c0bea8e79c25197aaea69ce68f319e0ececf8f94a5fd5d32aea71f95d3f26bcc0f07e7e7c7645c5fff5096e3b13cda1f2c94d3f408f6eca07ddbb4bf3edea907371d65d17b7361d5830de5347dd3268bbe3ac660eac3b9729a3ff2c8927fcdfcd087d13b59d23b3965d99f6d82a9174764ecff1694450fbe09532f460365b91fe041869eeb9025fe974330f5a3af2ce5b364ec3fd6c8d05b2c8ff6471732f21795451f8ec8d0876d65b9be4b76a47cd453167d9527a37c4759f41bcf1ffa659311e6fe67f0a92cf9bfc8381f4759da53254b7df1068cf1de1cc8d8affe5696f22b32daeb284b7a832cf5bb4b30ef7fbc9351bea12ce59b64dc8fd65516bd7803a3bf624759fa3347c6fede5af813f6605fc9c87f264bfee15059f40ee6e727ceffc6749cff6047863e2b2aa7e59fb017ee97366664ecb73acaa267f7609cdfe2a92cd7eb351dfb853765d18f6d32f4e74959f4ec8f30f5ac5b24438fae94452f29439fd594d3f4f107187a76fa5296f24f32ee1f44fba967274b65695f8e2cf9bdb1b2ecff75c8a2c7466c8f8bfac6caa2b72b64dc1ff8a92cfad127e37ef1908cfd48d803f5ef644e467defcab2ff5c25e379932359f4d9a004c6f9dc466439fe730a467be2a1b21c3f43865eac0b539fbeaaca69feea020cbd7dda91a53d33f85beac7c98a2c7a6f8bf12a42efae43b2a4af26caf2fc0ace877ab28cf12942cfda0bb2e83dab4f163d68dd94d3f41dfc7d11faf5c0fcd0976e4739cdef5cc9a82f22cbfee302f3a184fd4ebf4896e3592159f2bb57e5549f9de14f4a687fc321cbf1326f64291fc1bf95d09ed54059ee7f447f703f32bb228b5e1a203e58688fb327438f6dc9d053f02faa1f4b64e8d78cb2940fc8d08f387fcb93f62c2e64a96fd55416fde59071fc8db2e8e10319fb7715e554cf4ce0dfed9c1c6f1591e57876a82ced6d91713c2d8ff3c993e57873f86fa33fd3fadc2f6569ff888cfa9aca52df848cf6dbcab2ff88f3b5a1cf8333197a355096e3b13eead5a1b2e83bf4a78dfe9e1795457f1ec952bf7b5696fdd41c19fab6aa2c7a12fd4f7deb9c94a5fc9a8cf20d65d1b7e84f07fd19b33cfacfed91a5bcd75196f22e18fd131694a5ffbec9d0ff6fca52be0cc6f946ca923f5a2a4b7e8cb78bf38b666449df891ed4fdd5a3af2cfa55f48aeea76e6f64d197873218fa697b254bfa7e0686fe89276449df3860e8e14d4b59f498d8afee9f6ecfca697ad32243affd80a177d77db2a4dfeb60eadb3619fa7443867eec82a95f0365797e624b46fe9ab23caf86f653af86dfca52be4bc6f5e9beb2e8c13a19fab708c6f9c4aeb2e46f91a5bee8a02ce96532f4e914ccf5cc898cf24765692fdb07fdb6d981d11feb1519fad45696f23119c747fe4fccafb8419674ff038cf9b55e92f1fc709e0cfde32b8b3ebb9171ff01c68ffa73f2a12cfb8957b2e4ef57c0d09313f197baff69bd298bde3a90911ff35df5e15559f4cc940c7d88f3a13e1c87ca52ff830cfdf5a12ce7fb09861e1c7f294b7a818cf24fe534fdc2f383fe1a61be50ff8d9e64b477ad2cfadb238bde19637ee479be3332ee37ad2aa7e9b50119d7db615f799cff7843c6f14bca727ccd2fe5bbf05f799c7ff34196fc1df1d7a502dadfed90a5fd5b8c07f7332703b2e8bf368e5f803e1d8ec9789e7a4596fc55d82baf57afbec9b89f74a72ce9684f11f7772ee0dfb81f795c2ba7f97d1c8ffa30c67ce3fea297278b1e9b58ca69fa0bf65f827eddd4c852dfacac9ce6b77b64d4f74d16bdf6e2f1b05fbb667dd08b5bcccf12f46b1c90a1275764d19f4bd88b85f6bb2119fa70ac2cfb894bb2ec3776d11faa272fca69fef13759f29f309f2c4b8ee7d7c9d8affc24436fce95d3787b823d183d29fba513e5b4bce593a5bcc7f3417c3f61be187d287a70a09c9677d664296fbd9445cfecc8b83e8bf1b3f372bebb2a59ea732f64e8cf4859f460878cebcd81b2b417f1dc46ffd843b2948f783ce89fe8a92cf5b7c9d03fefcaa95e59623ca90f371765d9df3c93a13fa7caa21f4b64a9ff84fe73d07fd14439cd1fefc868ef4b59fa372663fff2a29cb6f78cf174d07f518d0cfd375696f64fc9d09f7565d1c7387f07fd39e991a5beb5a32ce39d27e37e8883b2d4c7f347ffac9f64e43f2aa7f98ff00f2efa63fd224bfef8a02cfa13c777713e9b97b2d497a67fea7eeef94b98fbb7c712197a330bc67eed6eac2c7ab14bc6fe6e4159ae3fff80a177364d32f6775b60e8d19a254cfd197bca527e0246fd9b982cfaac7a02436fc60b32f4ea50599e47bd81a9373f94453ff964ecbfc5ca69faab2e4cbdb93e298bfeeb90a1cf32ca928efea19e8c4a64e8db97b25cdf46fff27a7cfc4146fd96b2d4b7234b3cee94c1d48b5565c9bf26e3f9e548392dbfd90bf3fed0b84e96fc9dbcb2dcdfa8f9453f9c0230e6cf9de9bcffb54796fc1dcc17ea47ff13cce7f756ca723f31e6c717f4ed53197af00e86be997d93458fb4bfc8d043682ff5db64a82cfa03e369f45a5affa8a22cfaa94886fecb298bbec3f852af0db364c93f9c2b8bdeda90f1bc70a02ccfe3623e53bf0d6db2d4d72c28a7e9fd3619fb911159f452cf0543cf35bec9789efa1796e7addec8525f93e7037dd6c4f916d01ffd96b2940fc828df5196e363bc0be88fc60f59f25742e534bd7e06e3fafd3847163dd7807d533f5630dfb8ff38382bcbf3cab0ef22f46819e34b7de8c464d15f5d8c4711fb9de53a19e50bca72bd9df5419f856bb2e8a117f297a05f9f39e5b4fcab4896e3bfaecaa2372f64d487f3a3deb44a64497f2cc1389f87ab2cf7678ec9a2670f383feacbc7802cf58d0fcaa28f9b64d187cfadb085f6060fb2a4677ec8a2cff6b0570bfba93ecb436f663ec8a2371e988f9625e976868cfb43df95533db5467f589ee4bf4d95d3f4934f96f2d7a7729a7e9991e5f8ad91b09d93fada79e534fffe870cfdd95796f46f32f4675739d51307f4a7d19769baffad2cfa704696f2bb9ab25cafef90b13ff945163d71443cb1d15f7e4139ad7fcbe3419f3bbfb0ec475a64a9ff8cfea5bedcfe28a7f9b73e19fbc94f65d16f2bb2b4efec08534fba5db2940f4ecaa2bf2c32f454a89ceaa529ec83fb8f615e59da179371fdbda62cfa734146fb703ed49331eb477fc47b32aedf7f2aa7ed99c19e753f724e96fc7bcc5fea45bfa22c7abc4896fc3bf87f17ed3d74c8d0eb727c4baff74b7b2dee4f9e2d30f55f5159f45f0086de3b6595a5be1718f51f23b2e4df8d9425bfc4338b7a70f70dc6f177a1b2ec8f5ec8787f8c0fc6f1376bb2a46f1b60e8c1bda32ccfef487f5bd47bf15359f4d32719fa28a79ca66fc660b4671329cb7ede818cfdc0b3b2d45f248bdea8a17fa807d75332cae795452f7e91b19fb805430f461d65395e812cf1bf8ff1e2f5ecf5918cebfb3530dad7427bb95fd7b0c8d84f5a82b9bfe428cbf5d21fb02bf3a33a23438fb59545efa07ed5531332ea8f94456f603ca9973a59329e17ba90450fcc3e95d3783b447f531fb55f64e8a395b2b46746c6fd85b2beb10ad08b831719fa77a42cfb659a8ee74fb2ca72fdb74bc6f3cd7d30cebf5d5696fb33e764bc2f2ca32ce9ac1ffab07e5196ebbd7bb2f44f03f657c0f9d5eaca927f4596fcb5aa72dade4a878cfd3bcc0feab1d60718fb8395b6b28cc7822ce52bb067eab3eb9d8ce75330bfa8bf46cc8ffdbcb2e8538b7aaa8c74eed78543b2e88f2de61ff7db462de534fd5e01a3fed78d2ce95594a7fe79aec8926eafc9a217ac1e19f7f7e1fc2cec173e776429ff1893457f845fcab2bff64d861eca9125fe3d31ded44f9eaf2cfa624e163d10b13ee8a5db8c2cf5dfafca928ef2d43bc18c8ceb7f987fd437e1882ce9674f59f44c40967878c3fca65ed94764291fdc95a5fc832ce54f883f36dabf1a2aa7f51d5a64ec2f1694458ff078d03331ec93fb61c18f729a7f572163ffe75359f44b8e2cf1fa81f639d07bf71719fb6d75e5b47c38254bfd5b4f59f4494496fad75a3ff6b3606f0efa6fbb224b7dbba6b2d4d725434f227e38e89fb54f467f47caa2772c32f6ff6eca697b2e983f2efaefb220a3ff2aca727f6e968cf620debae89f9b4d96fcdb0fb2e4dfe694a53f36609cdfa6ac9ca6ef591ee773e892a1c75aca921ff57bd0a3a7349e7ee5a8b7ce9f60ecaf9df2645c0fbe80a1a78ea1b2e8ad800cbd5312e6fedb66a12c7a4ad3a15f7a60eabd2b197aea09a6de9a92513ea72ccf6f5b60b4673b5116fdf4264cbdb51e9145bfb46330af3f3794d3fcdd3519faec5d394dbfe2fc544f313ff7d7787ce8a7ea198cf63d3fc8d053a1b2d437234bf9c65e987a2aae90257d8df1d3f7dbacc888e71b30f45d7b4b46f9b3b2e88f3732de1f83f6f27aabfb2dccfdb32eeae7f5d336eaa33e8bd1dfaacf3264bc1f262b9c2fa1be1219fb6d981fd44b838bb2ecd7c464d1139d8130f5516baa2ce7e79125ffe0ae2cfb672332de0783e3531f0daecaa27f6664e8b51f65b9be89f329e07c3a1619ed1d2bcbfd7a3e19cfffd6c8a2277a4b30faa35924e37d3d0159ca57bf95e5f908d6073dd36d0917797fde0f19e53d6539fe090c7d550d94459fb13ee8ab2adac7fbed2a387fee6f55b2cab2ffd514e67e541ff6cdfda741952cfa29982acbfe15fa9bfb4f8f2e59f297d1bfd457cfbb729aff32264bfef64358f5d69a2ce9f14059d29764ec57c13f524f8d4fca69fcad3a605ccfb4b364495f7c91454fdc301e9687fdb73e19c73b28a7e5431e0f7ae485faec1cf4e49c2ce5ef67b2e45fdf95d3facae87f3b2ff9e33619fb51b1729affb8274bfcbf4c95255ef2f838df88c7a3fe5a91a1df5c65d15f9a5fe27783f5e1fcb73b32ce275016fd78244bfdeb0c59eaebe0fc1c9cff714b46fe87b2e8b13259cadfd1ff0efae7365196ebbd5db2d4b7a82a4bff4464a96fba52163df441c6fd632f309f3f1e28a7f9374f329eefce2b8b3ee1f9416f4563b2d4b7392bcbf5cc1f32f4cc4339adaf0f7f43bd750ac952dfa1ad2cfaaf47867e7295d3fa7a181f17fd710e94d3f2fb3732f4524359ae7fc21fb9e88f7d4c46fe0e98fb85e87f0fed3b8b7d5bbcbe79fa02434f9d3360e8a96d5759f6a7643ee8fed4be0f863e3a0460d4b72b2a4bfe23197a6caa2cfae40ac6f1b663b2a45f6c32de4783f672bf6af3a32c7aaa40c6fbf83e95452f91b95f152a8b5e7991f1fe7ba6f3faea858cfaf3caf23ee2988cf721d6c1389f474096f2ebbdb2e8a909197a0cc7d3eb933fca927f4cc6f5ca0618ed6faf95e5fcca64e4ff5096fdac0318e7d3ed91f17cc7bbb2e8a54f32eec71a81d1fe8ed893c5fbd3061118f17f83f1cfbfe3fda2186feaabc113ccfd27894fbaffd3fb5496fd2f1f4cfd3224e37ada988ce73de764e88b07187a6da08ceb774f65a9df26e37df518ff229f67e89025bd5e218b9ea8a17fa8476a0d32f4c81b18ed6d77c9923eaa2b4bfbdb605e8f137da1fb3d15d80ff549f30e86fe182ec9d027682ff5c47005867e19a13cf5c0ed5b59f40cfa5fe339e617e3f9fd4896f8fc189125de9c61cfbcdfe8d12363bfe54246bcc578303ebf583ff508c69ff17656214bfae4872cf5edd11f8ca7fb2d19fa00fdc178796890b1bf04ffe9401fdc4b64c4e3aab2acdf3364dc2f642bcbfddd7332e217cb33feb13d887771878cfc77e534be3c643d90ec2fa4ed69df94a53d0db294bfa3bcee273864ecb78464a9ff6681717ef72719f1b94296fa670b65b9ff09f6e4e2fc2e5932f63b1e64ec2fc8fa2ed95f90eb47f07f1eda734efb27ffcbfec20719d7734aca723d88e9888fe7ac30e3e1e141467c2b83b19f71b8284bfe0118f51f5e64949f28cbfbcb7c308e5fff5496fd891219e58bcaf2feda2f61beef777722633f62a42cefa76881110f371f643c7f87f3ff407baf4de5347fe34e46bc5a29cb7a9ef5717fe149463cfd524ed30775b2c4933b8ec778585b2acbf385e85fc6bfcd868cfb7fbe9453ffbcd6fc783eaf01467b6b6332e2d95159cacfc952be8ef632fef53364496fa03cefdfe96695e57a88a623ff198cfd8a6e9f8cf534fa93f7ffb4998ef83552967855a90aebfd3c77b2a477f760c43b17e75f407cdebe91f17d21983f852fbc9f05e75f40fceef7c9b83f674896fa878eb2dcbf342563ffe01d8cf3e977c9d88fc8284bfcc77817b1bfd16f2a4bbcc67815b99f01fb2aa2fca04c96785bd574694fb32dccfb531a3b329e67833d32be0e0361c6c319fadbac87539efe9071bf33ec9bf1708ce333de3dd17ec6b75a058cf8f5dc28cbf36075b2f8f72bf23b582f8f8f64f1afcf6f30e2d57143463c833f7350df13ed7719af8b64ac073fc9e2ef17aeb2a4bf93c55f8f591faf6f2c95d3fc471c9ff1e3915196fde71e18f1e1fa22e3fa7fac2cfbeba89feba5db828ce7a11eca125f703e1ed66b8382b2dc5f81f679bcdf358ddf795d5f9d7f9453fbb888bf31eb2bbcff7f4896f453812cfef6bc0073bffc5b59ec6f43c6fd01ef60c69b2759d2eb236589171f60b4ef7025e3fb68a43f74fdb5ed28cbfae848c67a6dac2cfbe15930e2cb2e43c6fb2aab607e3f4e4159e2514096fcbbb3b2b43f0f467b770b6549df92111f56ca52ff3b19efc7447f7ee27ceb3b6589371119f58d94657da6f9b11eac81f97d343fca123faf64c9bf43fbf8fc7b79ac2cf5b7c98837596589070332de17cff6e0fc2bb1b2c4e31719f73b34c952fe29f3df62fc6a5c94c5ffa23c9f57aa4d94a53d3b32e2db09ccf7310dc9b83f00e7cbfdf7d1802cfebb2cf1dce2fdaa833519cfef301debc30e8eaffbef5565391eeae7fe7a9fccfdf21c98ebcb2f329e27bf815db1cfde0719fbf92e19ef4b427b8a88afdd3219c73b28cbfba5f660c4db6e9d8c78d75396f68fc8f83e9a988cfb39311f351e2ec1e89f6e5559ce7743c6fa99edc3fe7427142ea1bd9d1f32d6b325b2e46f637e95189f3d32becfa74e96f8da81fd97a017da4c47ffb72232daf3ae2ce5dfc06c2ffc01f7c7873e18f1fa3913e6fa73d424237ea27ec6e34e178cf85eee91259eb7600f0eea2b3b60ac4ff70b6559bfc29e1cc4f769958cebbf5965d91f44ff733df73c2acbf31e6f64ac9f5a64ecafa23e17ebd793a52cf1da26cbf1e74d65d9df7d27e3fa3dce97ebbfc7948cf88dfa197faf65329ea77f2aa7f1748178e7e178ab1119d793313f3dc4fbfb4359e271dabec287c6e33761c6cb7d1d8cf5e065a02cebc177b2e46f309dfba53d32e2a547463c1c0a335eee4764493fcec05c2f9ec952dfe1ae2cf18cf5217eecd11ec6cb6d8f2cf59fcecab2be5c83d1fef60f19e5591fe3e55c59e2e5928cfbe57ee1d43e8f0de14fe8997a898cf83f21a3fe6f65896f5d32aefff694d3faf71530fae3782763fff643599e37617b185f313e1a4f3764ec6fb23d889f0fcc17c6c7cd4c59e2c74998ef87a90fc8781f4e1efc85f61cc988977365f1dfe84fde4fd87b2a4bbcbd92b1bfb900e3febdc1868cebebefca69fa0bccf8d9fe04f379e00719f7cfedc07c9f4a4016ffdb3d08f37a756b0b863fef62be73ff35ca82192f513fe35fbfa32cebc32659fcb7ff05463cec6dc988270e18edef4cc15c2f4664bcaf10ed29211e772232f2c35e189f7a47b2c4b7fe58d8e2fab008c6f5df32ec95fba515f49f9d13ee617e30de0c30bf195f1a980fdcbf2c233fe3c5a40f467c98d8caa9bfacc0bf71bdf67a90c53f6f4e64293fbb81110fae0fe534ffb446167ffb847fa17fdf3d95657d09fb71b17ebc97c958efad94255ec01e3cb4efe19025ffa0a89ca6cf7764f1f74dcc0f0ff1aa5d204b7b97b00f0ffb8d43cc4fc68b39fc958ff87291f967f3fb422f1d32ee47ca81192f94c57f5f5a60debf9425235eb8c2ba9e5a93111fa6607ebfd6858cf83007e3f84d96e7f5b62219fb791930afb739645c9fda92e12f914e7fddb89125fdd607737d3727637d375496f8e193b19e7880b91e0dc852fede5296eb6d6b32f6df0a60b4ff1192b19e03d33f372764f8df85b2e8cb2119cf77693abe3f2a02c37f0f3764ac97bec058df0c1a64d4375796fada60bc7fa155524ed3cb3c1efcf9f8a99ca63fc5ffd8f4e7953519fdd35016ffbf03a3fd3d96e7fb6247cae23ff760beaf6040c6f365122f6dbedfb55301f379be2518d7a78e122fece217fcff9e8cfbbf7b64d1efee1bb824f9bb0d32fc734846bcc1f1e9ef7dd8a3fa77978cf5d19a8cf5c10c8ceb73ed2a18f1ab83f950c27aa8f34dc6f7d57f90f17d56980f8c0fb53e59ceaf85f2168fd7204b7d2db4d7f2849b2d32ee3f427efaf75b962cfeb36c83e1cf9b7930afaf4cc8f0d7b06ffadbe655394d6f321d7afce692b19ff7a69cfacf81c44bdbe7fd9fe9f9163ff87d3c973619fabb0b863f3badc078bee65022c37f3a64f84be4d7eb1f3932fc711f0cff79fc5496fd18a6b3fe2f32fc99a6437f378455dfeec892bf3e5616ff5604f37ac55059d27d30f7bb0eca527f4416fb3d5dc068df2d5616bdbf10fe427b0ea1b25cef3f93e12f519e7af5f14e86bfdb29cbfd785730de3ff32c2bcbfece848cfdfc1919efefc3f9d0ff35a7caf27e17655cdf1893a57cf526cceb1b8d2919d7779acae2ff5a60f8ebda4c599eb7ed93a1af3760f8efce4959f2f7c8b85f33a72cfeb30e46fbeb1d32f4725f59f21784e94ffb1618fe717421e37ec70718feaf7753167ff302c35f4f3e95c57f8179ffc1b4a42ce9183fea650ff3a384eb4121e64309febcb322c39f55c852ffec8b2cfeab8bf129e1facf6246c6fbba313f4ab83fd77d27cbf1e663329eb75d0a5b685f674dc6fb776a60bebfbb41c67ecd1bd892f6b7703eea7fabc2761ed787ca64696f03edb52df867cc47de4f5071c1d0fb3d1b8ceb3715b08beb35e58eb2e87f9477a1ffcb1930fcf9eb4916fffd447f514fafda64f1c74fd82ffd79fb0e869e6f8d95d3f4c58d2cfebe87f9c9fd9786ab2cfe1ff642ffdf873d505f5f53bd59fc451f7f08ebf7d3be83a10f8f1659fcd9790446f9d35c59f4f88c8ceb299a0e7fbd27c3bfcafcb4e9cf0f4532fce74d394d3fe1f89fd4e77932e2454559d6ff7530dadffe5616ffef82e1cf0f627f36fd777dad2cfb356db2f8bfd310fc85feaa92111f9fcaa2ff5d32fc7b8e2cfeeacefae1df9b1be5347dc3f2f08ff5080c7fde8d95257f9f8cf7436c9545cfa2ffe8bfdb7b65d1935b32fc670b0c7fdd46fbe97feb4c87bfed8bbddadcef9fc464e8d73318f5756764e8cb2518fe76ba5796f7c18660f8d7b1c45f9bf77fcd4e60eec763bc78bdb983f6d07f6e0361fab3768b0cffb420c3bf61bca81f973619f74363fe5816de5f7223e3fde153b027dcfa21e37d13b04ffabb960fb6b0fff14ec6fd6615e5d41fd6cb64d92faf3fc0d0b3558947b683fd912afac3c1f37ad5b5b2f8cb0118fb2315d18346efc23f76c1b89e5d86ff507f29fe4ef5ee0bede3fec1f45b59f623d0dff4871df1cf36fd5903e93ef617ae697b4b9f5c9f9f7264b1c74b1d0cff743d9361af1965b1e76f61faa7e31b59f2376330f4ecb540869edc2a8bbf417b546f7e288bbeed92b1deef81797dd523c35f39cae23f8fc2f457873c19fba90332ec3d02c33f6dcb64accf57e012daf720633ff3a09ce6dfc564f827b4efcb85bf9f91e19f3cb2e45f77c8f02f4b61aeb7f75732fcd9a7b2ac970f643c4f7c03437fee2c6539bf37329e971981713e8d0919e55d65d18733b2f8b7da05cce77172caa2c7bfc9d0bb981f7c1ea9de26e3fae28a8cf7e1e078fabe9a2e19fe32a32ccfcf603c78ff4faf4ec6f337e85f5e2fed5a64f8e783b2f8575b98cfff54a7601cbfbf258bff9ab494453fa3bdbc7f763a278bffea63bca85f7b4361aedf5d32f46f0bed37eb73f97e3f970c7d89f6da39f8cf9c725a5fb306a67f0dc9787f21ecc986bf6e3964dc8f84f963e3f99b06fadb41fdb53619fe17e7e7e4f1bccd8e0c7f0b7f40ff5b1991459fd69ac22eee5faae694e5f921b4dfc5f5d34a4f59fc33dac3eb8515d89f0b3d5cee93c57fd771febabf5b0443aff6301fa947c7a88ffaf39aea9792c3fdd44b0fccfd52e92f87f77f5c2330f60bae0765f1670532be5fe004e6f3039f64f8bf2f32d6ef3330fce72eaf2cfe7d214cff79df82a1e7f61d65c93f01c33fde71bef477b51519fbbb3619cf0bcafc73f2efb83f24244bfef35639cdbf7d9171bf7f5359fcdf9e0c7f3604c39f8fa664b1f707cbc39f37c6cae20f2232fced890c7ff700c3df3dd6caa21f5b64dc8ff8a52cd7bf783ef02f3589c78ebebf220786ffaede9565bf7642c6f3953b30f607da2765e99f3c19cf0b3495454faec9d80fc478f3fe92ae4d46fe0d19fe4ae2a743ff38ec93e10f2365f9be0517ccfb496c32f61b9a643c1f89f3d3fdd73959d2076f60e8dbb9c44b87cf13cc31febc3f72d926e3fd0c983f764efcddb24916ffd27a07e7c5bf2d3d32fc25ec95feb2dd214b7a2b00437fb6509efeb29123c39f62be38a8bf8ef9e250cfdec9d2fe3aced7c1f9d47aca723f27e623fd6505e343ff58c5f870bd5fe992c51f36d05eead72ac68bfeef9cf6afa57af1f446c6f3e23b30afa7ff90c5bf5c8f60f8b3f3044c7dba5496fabec8f06f48e7faf55203c37fddbacaa227dfc1b0ffc349399d8fd710ece2fad097b2dc9fb716a67fdabd91717dc60773bdfb41c6f77d8cc138fee59d0cfd7456167f159361df685f1efeb5f6ad9ce63fb864ec3f5ec9f0474765597fa37d05f8dfc352394dbf6dc8a8cf56167f7827e379a6adb2f827e6873f3b649425fd44c67e6d4559ea673aef1f2893c55f8ce664bcefaf0ae6fb759ecae29fdfc952fe5910e6fd00ed1159fc4d3b0b467b26cccfef53c1fca77f1a2dc8f08f3565f9bec11918fe7374228b3f187484793ff8e48b8cf53cec83f7834f5bcab21fc8fcd8dfecdd95653f14e3437d393a80713fc10cf5f17eb539fa97cf5bcf67ca927e13e6fde52d0b0cff379f90c5ffb87b30d6ff59cc0713c0e5fe27cc37fabb06eccdc1f19a756197fe724b863e2c90a11fd19f2ef6431b4ca7ffcb83a137ab38be8bfbe3aaefcaa2173d61eac1f200ccfbc3c51e8dbe829edb93b17e8e94c55f8a3f54fd75a980e1bf4e0b70097aac49c6fab005867f3acec9b067195fd55b8f1619cfbf7c82b9ff3606a3fc6ba32cfe91e5e15f8e622f0efdc55359d2f73565f1975332be1f09fd55805e7bf6c9d05739b2e43fa0bf0af097a7abb2f8937732ea8fc168efb5ad2cfeaf43c6f78fde94d3f47343b888f36b76c9584f1fc952fef1a12cfae60c46fba73b32ee2fed81e13ffa5765d14b6d32fc419e2cf65d7d8079ffd4960c7f82fee2f32413cc1fbe9f6b6c91a5bec94e59fc03ce4fef676d29cbf39ba84ffd85f8cb441f895e6a91c59ee64f30f22f601f7cde645e5596ef5f42fb1de8ab26c6c3c5fab281f9eb623d59c3f8a83da33f68bf95a1b087fb8daee97ac536fa01ebb32518f676a92a8b3e1982a10ff66d65299f13a6bd5d3fc9b87e19284b7ced80a1172e4f308e776b9361cf1f64dc7fbf06c35e9f4365d11b13618def1b65b1378f8cf8fca92c7a620b867d1e9b64d8f79d2cf3ef85f6d03e1f0d6559bfa0fdb4bfd71b19f6b3514ed32b6561da5bf9938cfdf9aeb2a4a3ff8ad017d50919fb4f2565e91fe687bfa88e9465bd7a22633f6aae2cef136e93f1fcf5018cfda4674d59aee7edc9927f5820e37d2c685f89fb4d59329ebf5e2bcbf3d90b32fc411f0cfff2ea90a5fc78ae2cfae94c167b1fcfc05c5f75c9b8df9dedc3fb647a1530f7b33e94e57e758c27ef4fe935c8d0230e98fa254f86bf692b4bfb3260ec47f55a64c93fe881a157665965795e0ef39dcf8bcf703cbd3f12fd49bd327f80b19e9a63be3bd01b83900c7f6581a16fc617e5743f68e990b1df84f9a7fa04eda1ff6ac2dee8bfaa5fc21ef4cb358d77b64bfff0da8261ffaf1f61daeb73a02cfbbd3d30d63fe51719ef8faa2acb7aa40e46fd67995f6e11fea3525116ff6193a1af0330daf35a298b3fea91c51ecf3b6589bf2330da571d90b17f8bf6f37993ca5359ea2f92f17e2bf41fefc77d6cc978ffe65e59e2b103c67e455f19d7a3dec0b09f3eeb47bc3e76c1684f794616fb18f6c8b08f2919fb0962af2eafc70d2660ee97ec9565bf7b4596e38fb3ca52bfa6e37de7689f85eb6dfd4fb2a44f3bcaf2bc691b0cfb9a94c8621f238c1fef479e59ca62ef9a2ef9e70b30f637665d6579bf42014c7b9478edd21ebb7965c95f22435f607ef0fe88c5942ce9b3104cfbcf8071bc6b6a4fce17e3f9f50d8cfd85eb828cf40f30ecebd6142e307dae2c7a340746fec39e0cbd3b0543cfdedf85a94f8f7532e2d95059fcc112ccfdc41c59f25f7e61897f1530ecbff2224bfedb5659d2f364b19f7d5559bedf9ec7e7f70b74c0389f4a918cf7ab8d95e57a749b2ce5ebb67089d7bf1cb2943f5594653eff90b1df5906a33f8e2d32e2fd8f725a7eff24239e4ec0d4e70d32ded7c6f671bfa14e867fc891b11f88fa2dde9f755216fd7020237e97c8785f6e160c7b1f2dc9b05fcc1f8d9f55b2d863e70246fcec1495c5be95c5de865d61daf3644f167be9afc1580fcc6c32ecbba39ce66f67c0b8be3fbc9051ff810cfbf6c17cff8a4b167b1ea13efa877e41599ebfdb9325ffb0a19ca64ffb603e9f07fbe5f5a981a72cc7ef81f97c5d46599ea7b890f17da29630f767a7e81fde4f3bc7fce0fd56159cafef63ff55ec43e3fd4dc6d3a5debfb59425bd06e67aa34c16fbbb55c0d013e72e98fe2612a6bf390fc8488f95455fa03ce3fdd3554ed32f0f30fcdbb9a72cfe6f4616ff72f1c8d0d70e18eb89038f8ff87ab0c8623f77b16713cfa13f2265b1ff2119fe44f34b7db74fb21cffe0298b9ef8208b7d9feb60ae3f0a64a4637c4af0a7c71a59ea3bb03df097278c17fdc983ed813fa91d95657d3f25c31fc97c74e94f2e1f643c4ffb54167fb32043dfbf29cb7e1cda67e1fc6a4c87bfbcedc8b8bf7105867d8f8a64f1374d8c3fef07aafec272bfe7988cf58ec423a31f24bd7521e3fd54dfcab27e1891b1be3893f17e8c8ab2ecf76dc1b8fe339d90a197d09fbc3e3e53c6f5960318feb4bf21c3deb364dc8f89fee2f5a061890cffe690e15fd03f7c9fe2e44416ff31c278d05fcd8aca525f00c6f1c75565a9ef4696fa266765b99f53fc95cbfd985944467d7565395ff80b5eaf1fcc9425dd21e37857e5f4785df40faf57cdfa60b4b7d7234bf93ee6b387ebffd7f47c5dd553b78630fdd76107a61e1893c5feaf5330fcd3fd0d4cff182acb7aa246c6fe465598fea6fc20637f734a86bf5a80f93e609f8cf594a6e3faee4459ae2fefc8b83e6281f9be83bbb2f8f33d19d76febcae20f707e16da5bb993e578c71719f6fe4dc6fdcb6d30d7730e19fb29181fcbc2fd3e1932fc2debb350ff910c7bff04c35f0cb264acbffac2760eebb91118f7c30cc6cab23e71c978bef20ac6faa8f241c6fbec3a6499df2de6c7f5dff29c8cf54f4816ff33c17ca1bd0f8b64d487f9e2e0fef051960c7fd05516fb3d92c51e86182f5e5f198564ec674c95e5f85732fc475b59fc23e61fafcf8c2c32f4d7bbb2e82d8c2fafd70cfa64a4db609ccf624396f68f61afbc3e3db92ba7f6bdc478f1facde44196fc534b39cd3f8b853dbcdf60b606e378bd0118d77bfaa8cfc7f5f09bd88747ff71ee8361afd71919eba51798df6fac0c7b94fef2b8fea83cc832dfef0118f53fbb64d8cb1b19fac806a3fed7820c7b1a93b17ff0a59cceaf7353d882fea95b64941f91a5fc2b04c3be0fef64b1b7d38d8cef639b8369ef3f64ecbfb864a9ff10294bbc47ff599ee43f56c8927ed274e88d0219d70f5bc2c61f48fb7d65d12f5f64ecef2cc9288ffeb1f3f0bf5965e9bf0319f7db3dc178fea37c25430f9ec9787ff78e8cef871b93c57e1a383f1be7d7ec2bcbfb461a647cdf4aac2cf6ba2163bf66ab9cda6353e6bfe7e430ffba64bc1fdc03c31f55cb647c9f5e8f8ce345641c6f4546fc477be87f6ee83f07ed7ff595458f8dc9f037df64bc7f12f395fea673554eebef223ff5c7e8870c7f535396e71dd11e17fd3f2f93e15f2bca69fe619d2cfe628cfea05e19b7c878ff759f8cfce26f3dfaa7fe5e599e971f82d1befe9d8cfbcb313ed43fd3880cff95b6dfcb53ef5c7d30fcd5dd11a65eb9bb60e8fdbb0746feeb842cf6f040fd25eaa10a19f9591efee8fe2d4c7d715f81e11f4e0332f44c070cfbaf6dc992de792acb7ac727c35e0261dafbe18d2ce5bba1b2e89b3219f1fc06cec37ffec2f27d98683fedfd352363bdf6ae2cfaca254bfb4e5565596fa1fdb687e7eb1e64c95f2b0ad35e6f79b294bfedc9d80fda92c51e2e6730fc55f947392d7fbe92f1fc445759eeffcd81d1decb2719fae9a22cfa27268b3d341a608c57ad40467b589efebb26ece2fcee3d32de376c91f17d921365593f1cc972fc36fadfc5f9b56eca32de7b32d6772c0fbd322c93b1fec278f17ace90f5c15fbc6c30fced284fc6fecf4a59ee5f3e097b5c5ff5c9781f53858cf7230ec1dcbf1a9025ff4059f20fabcaf23cde180c7f3c75c9a81ffde9c19fcd0e64f89b1119efffd809fb68ef6c40c6fb9f1c65699f4f96fdae39ecc5e77a10f3c3c7f332f7544f78aa57ee3e19fe6509863eb9cfc0d01be537b2ccbf6706ece1fad08b0cfd93539678df16a63fb9ba60e88167160c7fd09e93a1577a6499eff56f30fc596d43867f78288bfd958469ffb5b5b2f8a32919f77768ba8cef710086ff7a313fd743ac1ff6d1bf288bbde17c1db4bf5126637fc75396fa94e5f8758c0fedfd72524ef31f3b64a9effa0b8b5efa22e37e308c87de1fd65196fde9888cfb5deb60daff5d59eadf93a1bfaa609ccfad40c6f7913495456fb864395e0ded75713ed5a6725a5fdb21637f7c4a167bbe603c3c9e5f5559dec73320637f69a92cfee6930c7f955316fb5d93619f3f603e5fdc264b7aed038cf3add6c858cf8d94c59f84641cff4b393dfec82163fd555416ff017bf078ffd09bb2f4d78c8cf5e2938cf3f95696fa241e7a3edf77712263fd18284bfb5c32f496af2cfe734786ffaa28a7cf8b7430bf7cf4df6240c6fb60e7caf2fd1f7d309e8f9ec6ca697a17fdc3eb038340394dbfa7f1c6cfab3fb4c0dcdf1a83e19f1e4f61ae8f1e0f30fcd9a94f167f719f80a16f6e3730fcd7cb13a63faac560fabb99b2f8b3104c7fd755167f33218bfd740365291f09f37ed1f349394dafe4c8623fe79bb2dc3fef83e1ff6a0159ea3bb695451f5dc8a8efae2cfe6d01863face595e5fa5f852ce52fb1b2e88d1fb2ccf7beaf2cd7a7b3609ebf47867fa8284b7d6732ee976b097b7c7e6b4e96f2d7aeb2947f2363fdf541c67ae8a59cda43b501e6fd7a9fcaf27d0c07b2d4773b2a8bbe989011ef4760f44ff94c86dee92a4bfa8a8cfd1e2d0f3de191f1beb3aab21c6f08e6f74ffcc2523fdb0b7f33ee90f13e31d81ffdcbbd4f96fcb7a2b23cff7b23433f8d95e579e10218fd55ad2b4b7bbec9f87ef7bcb29ccf808cf5e65059fae3872cfe64585396f72f303ffdb547467bf7cae25f35bfd4d73f28a7f595619fbe2fe5bb6f64e43f2acbf741887ff2a9bfee1961aec7ee5330fcd9ed4196f4cb5d59d6873730d61fd71159fccf03f91dec07ddc8582f5daecaa9fd9c341ddf575602e3788f1b59ca5f1de5b4fc614586be60fdf07f970b59eabf0464b1af1bd2b93eba0ec9f0873530da77b595a5fd9a8ef74d7594c5df58607e3fcb950cff775496fbeb343fd6434f65d1630119eff3cb82a9ef8a64bcdf7eac2cebd7902cf5df914e7f76ea90e1cf06caa2cf7c329e277d57167ddc03a33fae196539fe1759ca3f5bcaf23efb2a18fd716a9025ffe3a22cfacd21c39f3e9465bd5726e3fb60793cf4c7a94996faaf3d65696f44c67a74a42cfe45fca9efa33f4e7565d1479a8eefafd928cbfbbfd6647c5f5905ccfb17fb647cdfce43598e7f244bf9cb5659ceff45c6fb86351def036b83d19fe73219ef33d674b4374fc6f10acad29e13598e772b29cbfb1c0f601ffdcbf6fb38bfa7b27c9f1adb0f7f77292a4b7b766439de65af9c1e6f7cc966b25636f3fff7df593beb981f37eb998f9f0db2a1f91d64a36c6cfeb2363f9bec36bbcbeecdfff9265f903d648fd913f27bd973f692bd9a4f94bd65ef26e5613ecfec2b5bce56cca76cfe7633ff3ae6b79bad666bd9baf9344c2dc97192a335b3ad6c3bdb311fdfe4e8a69fa4fe5eb69f1d98cfd0941a19ae9a9f87f9ebd8fc6d929d6667e633cf2eb2cbeccafcfece2e93313167f3f387f89c4c8fbd994f35fdeda79f9ae99b9af9fd9ecd993ecb653fcc2736bd98e4eba7798fe6f399e649f27ea53d7ecce6cd788ccd18f4ccc735e98d6c215b34bf47664c923c2593bb64724afed85064b8653eb1613fada3674665607e0fccff0dcd279fad66b226259f1d6532d95ec64a47646e46636a3ef38c9dfc7f26f5fbff5f98e3ff96df8e99c9a1f93734b33e3433779fce61f9ed9bf99bcbb86644523bc978e62f619aff94da8c933d659251ec9a3e33f33b13649f19936ef2251f2f1365e24c6cacc84bed2ec8249651cdacd3b9df4deb3899d2c9e804a98d3866fc9cf4f7d1703fb33133e02dadbb6afe6f643ec67ecca88ccd380c3256666b7e8fcd886cb3e33f949d54d39e111b08d2dffbc45632bb741ec799bd1993f7ccc1fcbb31299bd45ede937ca687fb69fe6e669ff4606a3f77631baef9094dbe643477a92da57562f464de27bd9cd857d1cc7db29fda5e80d1ee27f5678e26cd359fe4772ff918fb19674eb493ccd9fc4e4668fc878a276223e9bccf1cb2a1f9f8b091c45662d333b1f9db3e7331d62271659fe649caadcdbffb349f9fc61bdfd8839fda5bc2495d89055c600723e37daec602123bf0523bba99b453eaad4ee9dfeed9cff4ef5e6a8bddccc3a474d3b26f699ce99a71d998fcbdd436a6693c313126f3fc83d94937f332e71aa61e24ce9433bee9c977f3ffc9dc36f691da429cdac92e892ba9277b4f7b7b9d71cd482523d24e472f32b695c4896ea692a99a4f2d53cf34cc4f33d3cab4339d4c3793f4e8d4f4602ff15099be990511e258e2053dcc84c47386998169c920b545d8a1e18af94bc58c4bc68c83955dc08b8dcde81cff48f1c48c4898199a8ff4469829a7f35be67862036bb187cc2833361f37f924b66246243223b2319fc4ae12db703293ccd48cc02c33cf2c32cbcc2af39df931bfdfccbf3f9977f37fb9cc8749fbcc7c65f29982e83bb10b63216b3346e9279bcc8a38534c6db49bb6cbd851c65849261919a30232a5ecd834df32bfe756d6fc7f26bbf823d9899979afccc38c446a1bc61e8ac656928f9b31cbec6cd2e3ebc476922f21b5dcccd872535bd9189bd999ffbb98bcaf64fe5a5ea665f95660855664c5d6dada585b6b67edad8375343f27eb6cfe72317fbf5ab7cc8f75b71ed6d37a659a628789cda523bd49ed30f196efa6057bb115fc3ea63653b1cac62e12fd956ab08c6555122ff6878a2776a600dbe826f66155cdb894cde792fe6d6faca16cd5ccdfeb56c36a667356cb6a5bc98a22ed3933161deb657533ef56cfea5b036b688dacb135b1a6d6cc9a5b0b6b69adac6febc77cdeac772b677da46f64c85b05ab68956c7370db329675ccbe5bd5642d94896cdb8cf72e8d59c64ecccfc4b4e395fc369f97b1c36eba76e9d98e69bc190b1357be8dadfcb1ecc44fcfd8f46ee2bf6c57ecc4f6c436d29ebf243664e6e9c1c48b5c3667fba917abda811dda911ddb6b7b636fed9dbdb70ff6d13ed967fb625fed9b7db71ff6d37ed965f3a9987fabe653b3eb76c35ada4dbb65b7ed8eddb57b76df1ed8437b648f2ddbb6adb6a97f644626678ee75bb5f4b803d32af97d349f69ba7619187b19641796977cec3fd4fa24892736e6a23dc9bccca81c12965149e247d23b699c718cef5f9bdeda2569f6d49ed9737b612fed95fd6dffd86ff6bb9db33fec4f3b7936a86017ed92638aa43f967e927f6dc749ef57f79dc07a7742277262333233676d3c99d176cec6f6cd8f398ed5322d38a4edf0533b9e64bba67dd3447b9911e9db4e76e06c9d9db3770e7f283b49e249159fa299973e6d443e99b1e1a2d5b0137f9fda8c73744eced9b93857e7e6dc9d87f3343f2fa7ec549caa5373ea4ec3f47cd369e94f1b9fa6d3319f669ada353f0df3d3b3eb4edf19384367e48c9d89337566b6edcc9d8dd57616c97c48dbf08bad1c8d9a7b98f8354de24af2717619cb8ccae18f144ffedc469ca5b19389b1132ff924b662e24823892de66768b4559ced3a2bebe97c3b3fce9b7574de9d9cf3e17c3a5ff6d3c91bbb28a4b6d0768ae65332cb90522214cc1232937c30421d7ccce8b8b6d3751dd7752aaee7fa6e602fdcd08ddcd85d1b05b17537aef9485c633c496cc58c8789f646599bd86265dd9d954d62cbffbc9db87bf7603e4777ff3f6e270fe30d92b89ec692f4e3b9a7c436e4b7b34cec23bb339ddbb2c7eed9bdb857f7669ddcbb35751fc6573dedaafb745fa98f6a8b4db865b762c6a568c6c18c8c199544c465d55e3a7f363ac676dcaa5b73eb6ec36dba2db7ed76ecbedb757b6e3f337207c656123bad261fd872cdd84ac57cccbac7584af23b59f774ff67e2891985a13b72c7eec49dba3377ee2ecc67e62edd95fbedfeb86fee7b3a42ffe6e35ac97926f1c34d6c241b1a5b39b8268224bf130d66bc9967e6eaceb6dd0ff7337d4ea0e0dc4dff15dd92973571a1ee65d211e9aa8d5866fe9b11719a5e229fede4c7e99a309c84622bfd29a63fc6969c9649ada69eaeee39f6d5fa486eccf57c638953dbb37d8929497ba47de9e798da88516b5e90d88c95f5c27fbf9d7891177b6b6f63ceabf50f7ebaded69d783befdf6a3bf6d8f47e3a07137bf10eeec96a9af8917ebc83e911331ee9889cbca377f2cedec5bb7a37b7e894ed92fbf2ee663cecd43eda699c28ba15ef6116e9a6f7cdfcb7bda75bd5d1e822c65b6ec58c44c57b7965ef958c8af96b62339657f1aa5ecdab7b0daf69cf8c4df66ddf1469658aa68dc96bb85b6678c7a69d494c19984f238d2fcd84ff7df1c4d8c69bbbf2daff702cfeeac7d8cfc4d8d3bfc966bc8ed53467ec27676607998755f7ba5ecf6ada766664b5cc68f8eec6ebbb676fe086ded01b79636be1bcbc8937f51ede0c31bb9bd88419819953f4e6dec25b7a2b6fe67d9b1fcbfb494728ebbd99889e3523b13223627ebcf7e4271d9daa977cebe687d33176d53551e9d3fbf4bebcbc57f08a8907cbeedc0fab656ce56846e3e1956c376d6fd178dbb13df64a665ccc08fd7becc4ddfbd9ffd636feca5290bb6b1653960900c77fdd4e7cc7777dcf1efbbe1ff8a133f3233ff69d44f39811312b447fed6e7dcfdff85b7f67b7fcbd7f703efda3d3730a6ec53f99f99deaa7b4ff7fcc78ccfdb37ff1afded4bff9f7f4af6fded358f8c3f0cd6880ac493f7b2bf3999ab19bfa6753f6e959fec37ffa0fefc34b6c2deb1fcd715e6ec72ffb15bf6aec64ec1cbdaebb36b366ec99d1496ddbd88e7b7296091bfb19ffebf1c4d8c7d85d19fdfe3bece3d72364e24e6a2fff8aad9839d834675b4cced6ac39c66ecfd849c7c4733b592324bfdd0fbfe6d74d0f35fca67ff05b4e4fe67af20a5933bfdfbcbb5df4db7edb5bf81dbfebf7ec4fbfef0f4c8ffff843efdb6f1b1b49462419899bb1ad453a1a0bff6a7e46fed8fc9ccd484efca9f977e6dafedcd85dc38ccac25ffa2bffdbff31fe6a62bbfe9b19979269dfdaac2dab56cd6a9831890de73213ff3d33f957edc4cff91fbf9afbffbd8dfc7964b1854d18fcf4bfdcc3bfd096aad7f5bd74cecdfcc0fc7f6227d5c47b793ddbf77ae6af79bfe017fd52900d329ee33e8d5d7493486ee6f733b09cba591d16bd855d0c6cd3bf3d7f1038c652cc98f85de3bf12bbb925d661c6eeed17fb08dcc0f32f81677efc2008c2200a2253d6e40de2601d6c9c7ab00d76c13e3804c7e0149c4ddf9f92b6791d3f486cc4aa3933afe3cc12dbc9bc8cfe2afc2bf1c4782c9bf1c3adfd4b7682f226be8cddc33fdb9ee062ecbf9bce3f37b111676ace3df65daf63dbc1d53906b7e01e3c8267f00acae98864cd8cb0921109aca0125483aa59b37ff9e3a066e6fdc5f4753d6804cda0152476734eacc77b939148ff4d7e0f9211093a66e42e6644ba5e36e805fd60e05fbc65300c46c13898786dbbea786ec96e05d36016cc4da4f333e360e1c7468fb9c95e43622beedab4bd64562cafccf49fb7936019accc1cff8b9efd6bfefd3f46af6cbce89fb3136766d6e8c63f8b8d04df899d98f9f76196700bafe7bf053f6644debc51f01ee4ecb299c1897632113df830fd17a763f2157c065fe6df2fd3c7cda069e7ccbf79f3ff056f11a45ecd8cc622f16fe9888cfdab1911932f70d27f4bc90582d00aedd0f1afa11112a11f06611846ae6357ed4b18876b3b76bbe1c6af865bdf35f6d135eb2613ed9d6562277690c693e09f8d27e1cec4f45f7ba2df6a13bf94f91b71c8ff08f7ff8cad180f90f865379973e1c1ebb81f493c31f6b1703fc2a3330d4fe139bc84d7f016de8d7d1b55eb56c38719914a32a7c3287cda5fe12b30231234c37258099cb01256837cd0f42f612df862fcf096c697a523627abe1e3ac98884f564044dfe86191133467edfa985adb01d76c26e1826231ef6c27e380887e1281c1b2fea9ad8f7e12c838b696fce7c6237e79e334d678531f9dd73d2ff3262fb9f1a8fbffaf93be5bd8d9ffb67ecc44f22e5da0fcca89cfc373f3263313176626c261c87536714cec2799009174edd1cb9e3d9c187f70c97c1247c2656627e8ac988183b31b33ed98e31bf9338e125facbfc3db594c04ec72589ecc9a85cc2d44652ef654627b4937f139f67c67715b682cff0dbfcfc846fe17b980b3fc2cff02bcc8785b0182cd23872b2eaa98d987687a5e0ec7ed9d37f269e445977f61771e0f769aeee5fe5ff9be3e2b5ddd1ef6d979f4f54a6e994953d315ae6181e6d3bca9808338dacc88e1ceb14b9dec471cdba41bc5612d9274125f282a1e9eb6a64062f0a83afb016ae4c9f7e465132f74d5fb7a3385adbf968e32d4237b0a3ad1997a51925137792118876c9bf6674cafe25da4771580e1ae1cafe8a0ee12a3a46a7e81c5d42df1c69e854a36b748beed1c339b9bde062c6c1aceced69e6e1ae93dfd1337ad9a3df6f27ff8d8dfc5a5375bd4ab20671672656d87f3b27b5d75f94dd78bbdf672761212a4715671a558d070b9ca3fb1165fc38f88e6a513d6ab8eda8696ce496ecbb277b206ed59f472da38c8626c20fbdb7f019b5cda874c25632c3cd02a7627a3699f15ffe355a9bbeed3ab5c0369aac18f582a253b3f349dc497bddfca4d69144a146d40f9a516cca9971493ed1c9d849371a04a368e8dd9da7778d46d1389a18d5656cc43d1b2572143b3156123b67b193df17477eb1917f640b5edbdba46bf46134c52ee4c1dbfb39b3d61fb94b77f15b2cca9dfbb9df632bd1ccf4ff3c7a450bafe47e7a9d68192dc363388e56d177f41335a337ff98ecf8ba691c4946c47cdecda89878e2fd44b9e823fa8cbea2bc8903aba0633c92198fa860fccf97e9f562548a82381b6da25ed48d7a7126f88a2df3f78219af756c9bdfc7e810148c6d35022776a2c8d8561c9d622b76c3efa81d7bd17b343073cf7572b19928916d8fa2851b271f67ea9ee3d0cd99d129c551f4fc7d76122cbded3f8a0332e7bd6d1cff23ed14af83a53b8a375c97fc83ba7e97068bb7c6522ae138dec57b3f1f1fe263b48c4ff139bec4d7f816ce8ddfeaa52bc4a6591fe6e27bd44aec446cc57bc68ff819bfe2725c3163d2323691c4faaf681dbea2aee9fd6ed48982a0186793f8602848fe1a57cd4f2daec7553322c6968c7f8be386fd99dac7d18cd4298927d125ba182b798f866615598f9b71cb89e276dcb187c69ea7f13eb10d3bb0eaf6d4d8f8d32bfd9e7862e6fae42ffa2cfbcbd8607dd2f53f7eebfe5534357169f567eb9b5f79af24ee98fa7ef37ac5993a276315afd8ac4ce283b190a3db8b7b713f1ec4437f1fe4fc71b26a97357b3c8ac7f1249e46eff12c9e2723132fe265bc8abfe39ff82dea261e2ace84adb862eca318e5e3f7a813e7cc4804a68fcfc9a884dff15bfc1185664c3ecdc8189b898d3a881b71dec49e7b12dfe3afd4462ef1221ac405732c2f2e86ef76352e7957abb44e6e97791abd1527b6e1c66b6b6d1bfb8e7f9f9df8d9744e77ffacd7fea20f937dab78fd7b6280b7777ffccc5fd5f697f577e3f837dbc96eed24761255d6ceda8dca6b2f9aaffd75b00ebdfa3a725ca364bf937d46b76a466464ace43d7a5fc7666c66a6bf5aebf57ab3deae77ebfdfa10954c24ef999ffcfa68d46c270acddfc2f0677d32cad6fcbb3ea563538a4af1c7fabcbe245128b6c26f13656e71debe25f6117f98bc460787e1fa6a94f6325cfa737f6ef4b7e3e4edf7f56d7d5f3feca9fbe5c6c1696d45d5686162fccbfc7efdf678e2e7fede9a5db497bb7287ffdc7e99b1853f8f2f7f6e7bdd646d1fee7e5b7df1def8ad6e385e3fc3c2fab52e9b9fcababaae790d7f613fd7756f6e2ce4c3ad061ffe7cdd58378d9dccd7ad786cfe6f1a4fd6ed7567dd5df78cff7a995eef1b4bd9469df5603d5c8fd6e3f5c458c4cffa10bfafa766f44ed1a7f98451693d5b5fd67363436fe6f3b15ec4d5f572bd5a7f9b91fc599b9f786114d7c8d8a1172e93ddfe78968c4adc5cbf0587f5bb198d9c59487e78a5752e38c57b7bbafe0c4ebfd54e929efbdb91446c2758fdf3d711dd631c8b4dfc4dfb6b79ebdf769dc539fbb5c456e2931991af757e5d5817d7a54dd66eb90dc7dd645c3bd9454ff496b18c99b190796c62fcc6dad8f17ce36cdc8d59166d824d183f375134302aacbd1ec73f9b78b3de6c8cf5243feb4d6446646aacc6e881e4f77a1a978d9d84e6ff2f9b6dd8deec36fbcd6193592fd6a760bc4ec7255c1acf784ffe75abd1301e191d5eb5df37c7cd697376bbae1905134f8671d7edfab5cd25eefed678b2b9feca46ba7f6623a37ff5fac7e6f617a3f2573fbefd5bead9dc378fcd33aafab5b5b3796dca9bcaa6baa96dea9b86e7985e48be60ac9aacdd933189ccca7dd3dcb436ed4d67d335e3d2dbf43783cdd0fc849bd1c6f4e666b2996e669bf966b1596e569befcd6addddfc98317bdbbc6f729b8ff568f319bf365febfde67393df148c1dbd99e0e0069f5177bd30a353dc94824a5c88061b3322dbec36b36927aa222e1a3bbd05bef5b9b5b67634de3a5bd79e26b369eb6dfde0b4f57f9b9db87b6ffd777baceb8e7eeff5c26df06b5bf17fbd46f9654c3e7e4b9c32e7146ea36dec76a3f976bddd6cb7dbdd76bf3d6c8f5ed5c97babf41aa15933f9f3ed291a6e9ced797bd95eb7b7ed7dfbd83eb7af6d795bd956b7b56d7ddbd83637936d6bdbde76b6dd6d6fdbdf0eb6c3cd6a3b4a7e36c1766c46a7b09d247e6ef395fcde5ed623e3af528d157aebebfa1a86c9b807a3b8102e8d774c3ce43d51df46e18db6197fbc9d6e67dbf976b15d6e57db787331ff7e6f7df3f9f96df1c4f457f6efedfdba3fbff7bac7e6e66db76fbf8e2b7fa5eafefc188b5fe7ff1bf1a4b375b7ef5b2fee79c56d6efbb1fddc7e6df3dbc2b6e855bd29ae93d89e1dcfb627e3ab9ccd743bd9968c957477d95d6667edec9db3ededdc9db7f377c12edc453be30a779bdd76b7dbed7787cd70dbda1d7727936bb4cb6c42333ae1eebcbb98f179db5d37ebf8b5bb25f1c3c4f4f1a614be45c375bc6e253ed28cc77c63af1bf138f162e9cfc379edeebbc7eeb95ded5edbef5d795771be77d5e0beabfd163b718fd86ffc8b792ceb8adfeaeb7ff9ecea5e25d9ffddd5ff3a2d5e2731eb6faf57bced7f1fafc2e9aee10d76cd7565d7dab5779d5d77d70bf6bbfe6eb01b3a85643f251d91625c4c66706c7adef4e5c8f47e7637de4d76d3dd6c37df2d76cbdd6af7bdfb317d3fdbbdedde77b9ddc7ee73f7b5cb9bd4c2aeb82bed0afbec3eb36d99cf68f3637e5b9be9de36a3f2b6778c759d8371b24b1fbeeddd6d331911e364e2bdbbb1f7dede332aefbef7e37b300c8c3c0fcffb301afb85edb7dddf47f6c09ed97d7bf65be289fbf6f77cbd3bfbbd5a6b73a3c6721751f657b6f2eeceff8ea5d4fefbbd62ffc7ac463adb781fef5a26206ff6dbfd6ebf0f328eb73fb8c93cf87fbbfbaee6449aa6cbfbfd1bdc137850ec557bef2ddc75d3066868ef23f6bf6f1648339a1964e67d9f8df8f6898a52016a35a84e9e3c99e540f3ec03f8f3e4acdcaaab9e1550ca34ceaaacce9aaccdba34cffa6cb889d99861199e11199951199d31199b71199f09e931133309c26539536e7ca6a62fd0aa999636999e199976350099e39501ad7a89d5ccbce8d7e3c54ab5cc8412a6870c31c6447c3939c78d67ddccccce9ccccdf6500f8fd697bec393bb963cc34400edfd2b8ebcd38c3bca7f7225509fb204b813e85fea899bcdce146032cf16d9325b65eb6c13301726db1e3747eec83f56038503e4edd067104a79d92e7bc95ef2695ae693dccbfdfc9807799847797c23f2537ece2f79925ff35b0e60e5795ee4655ee575dee46dde4169f22653f20e6a9f0f999a8fd90e220206fa1c223a88b4a12034722c61efa89877ce30399ee3172dec722227732aa773266751cd0e2715d5aff5e46cdcf3922763b9d1f26cfc4d1ef2c691d7b164947b98bf7305e87d7d82ca3d4ff98a933997e0d7ea92e67c2e40402ae652349e9617c66f8fe80817fece933d6082c7eaad063511b329f4ab9c61a9952bb99a6bb99e1bb9995bb90dd838b99beff3433ecbe7f902ca2d5fe6ab7c8dbc59bec9b7f92e7f29a6c5a4f0a0fac5b140cb0a95224ce32242b1dcad296250aaf8ca14a7842dcea02c6c71b975082ff063d6697e5cf96c9114d7e256c01fe52cf25c4596edbfe6497879de47e09bff6adcb6c8918efc917bfca12b45fe91d27ff57e4591cd4e9bdba528b3655115753cf3b9a2f17b1fc5d94cd1a2555af1f2368993cb163c975774a95ef4459f47c5508c0556e00551900555d00553b0f0882bf84228c4422a64284aa1165aa1174661165661174e46156eb12f0ec5ac98178b6259ac8a35b0a62c364574eb8a6daa16bbe2a59c826641dc0d8a73c8b1cc02d6d080997766fdc15b9693d22bfdf25806f1a10cb37d193d30f9dcc603f7831ebafdcdbaac9f3af267f99d2b81f14c4f8e42197ffe3ee5a93c97903066976c595ecb5b99965999974559222d29da7809c58bbd2b9b1c50345b5637253f96753a2b9bb22dbbb22f87722cb1122fc89228c9922ae99229d992839f7c299462299572a9946aa9957a699466699576e91487d22df7e5a19c95f3729189e5b25c95eb72536ecb5df992f7e5f62654d36a524d41b7ea2b5379b72ec720ce20a22ca42bffb64a89ea186daba00aabe06b3df91173fdc194ef8f43bdc55aeffddef1dd2a97dfd777058727f329ecd7b157155571b2ab4ed9bc3a57972aa9ae484d4ab4828b432be1d0ccfbdd73e1d7cb8dbe1ed26dbea96ef9aa4aabaccaaba22aabaaaaa16daab6eaaabe1aaab1c2a0a2160784f88aa8c88aaae88aa9d88aabf84aa8c44aaae44aa9d44aabf4caa8cccaaaeccaa9dc6a5f1d009d6535abe6d5a2dae743b5045c56e506a23cad5ae758ac5f8ed5a6da56bb1221f272d4e30ee2affd577a12281fce03ceff9623bfe437d3df7a5bf9797da0c0f54fe62ed17b7ef63ee529e7cefd99ace27a5a7af50430e98fe1710598b0a7bef61e3c3939976d72a8fdeba13ed641d6d5611d95621dd72748f72ed55827f515eaad4ec1a8d39f056153e775519775550a755d917553b7503bf8d9d7433dd6588dd7444dd6544dd74ccdd65ccd43156a11f1a796f2975aae16b5522b80cd1218a39fcb5aadb55acf1988b7cc0c22e2daa8cd2f79f2340e42bdf87d1d79324ff26ba6039af2ebbaae0fb8c946ebcfdeabb6921da071aeeddaa9dd7a5f1fea99df1fd7c723bcc7e2d4a3b1e0fb0c967ab1330ff23fbb0eea79bda897655fafea7549011a9b7a0b3f53c024834759bd7b6d0121e0cc501770d54bc934d392a98866d2788ddf1c9ba0a2eaae099ba8929bb83935e7d26a2e90cc5f9b1b54089521442b9ab238a4eba66a00c84c2cfaa639bf346dd3357db445f1563354e11b4f3eb3bd407beeb95064fa5fe888f08e2b423003447e8dd1fec8e81f1cfb7cdc2b17abf8dc27783336588337444326e7863a860d0d980047d0d80620a25ff58b7d631be6aad441c3365c315679c3370270640b7dbfbd33e4594901b1b4de0163faaa2fa96a68c446025ce4c62b494047a9db466db4466f8cc66cacc66e9cc66df6cda19935f366d12ca1ae0abb59379b669bd1cdae7939c6b74d3b6d27fea58c8a2c36aba0f972fe245a3d65891fa87fad234fb3ce67f93cfabb27335cec57394aeb65d764d74298d5066dd8466d8c3001a62086f2972e42735790c12787cbd09eda737b6993f6dadedab4cddabc2dda12f5f783137fe0f2f61ae2cd06ae0354ea735b0126800a680d53d215e0d2022c6ddb766ddf0eedd8622dde122dd95295dcd22dd3b22dd7f285de0aad589aadd4caadd2aaadd6eaadd10cad99b9adf5757ef22c06badbb6f2fcfa271cf9a1e97f8e9741cef1741c2b983f5f0b13de3ecd4fc46cd5da97aa755ab7ddb78776d6cea3dcefdb05e2c9a54323f4d7e36996b6d77392b6cb6b980755daaeda75bb69b780c90e74e4238e64edcb3b7c109740771a11bcd9b911011188d12aa29b16623745c880dab4dda4f33abf3b76411776511777a7eedc5d4abd4bba6b6175b71c82f12e83e4b3e8caaef22749d75a1db8c0cf791264af6b54fec0a46bffb37ce4d7bb3ce3c8e37d7fe1d74f0ccdcfdeb3ebbabe1b4e9b6eecb00eef880e7cd711039ea05d573c1a9345e3c1b7aaa33aba633ab6e332b2e34bbc4d3ba11321d492ea4d27dff523fdc18b67f576e70b70057e168dd42915dea9103173801151529dd64ddba639767a677466677576e7746eb7ef0eddac9b778b6ed9adba75c61644b7e9b6dd2ea7ba977eda1a6104a8980f4c3ecbbd9fef2701fbfe622cf8753ee443343ee6c8a3fde07dcdcfb8d906fda4f77abfc3fa631ff4a1b7ba307d741f5761d1ae3688832fa7a8a312b58ffb537fee2f7dd25ffb5b0fbeabcffabc2f50b4d59775f6563f2c08b3dd5d59205a46b8945c5f81dfbb42ec06b1425fd76b48569bbeedbb1e7ef4433ff6588ff7444ff6544ff74ccf667c9bf45cabf47c2ff4622ff572af9cca5eedbf386fe5237b8d269fef17f94d479e20f231471ef5039e589fbd6faff70654b3b77abb777ab7df17cd711da128853f7ac7e9691e2bb18658d21ffa593f4f837ed12ffb5555f5eb4eecebfeaee0af9af1194f762832be6b0ff0a41a4aae2efa6d853552d5f7750bc90d440034dc6fd7ef4aa17f19a67ddfb9c364f0067f380e417e18c2211ae2e1349c878bcf0fc9701d6ebd3ca4a772c886fc733d09f2e7e3b481f9710eff735ceba3f29db9c9cff8f9d1df0dc5500ee0e00790cba1bb99435f34f11130615054028810f125563b6a1886f12a0dd8800fc4400ed440d7ab811958e8e1edaf0a8f34e49d8efcca933b53deb80279653f706d055c8378fa810e30866f64d0fc0ef24bae1f071e5011866010076990076550076dd0076330076b487a67b06fdee00cee7fa627c0930ff68904f99b8ebce6231fae96847b7c12bb7da4279fed4f19f6c575380026b3613e2caa6b99bdf2e4be2bee8e899e34693b2c87d5b01e36c376d80d2fe3749c8cdee8577d8bfa78f31af16e1f79c90f2ff616733d6afa832b90e30fdc23df6fab7a031ab381f6dad7e311e2311ab8d28cc1188e513e1be3f1349e87002dc218afe32d77c674ccaed4988fc558f601805b8fcdd87e999f38cfed35fc404fde62adb7f55e9fee4bf9902baf63d17f94f0fa998e8ddd08c6388e23068ff09118c9a2f157a745e01f993b4fd4a4e9a8914ab2911e99911db991074484511ca5511e15c0e2f688a90085f4690496fe50fff4a7a6fcac284a86ba1955844a7d05eeadfbdda88dfa680026e6688df6e88ceeb81f0f853acec6f9b81897e36a5c8f9b71db0be30eeacb57f9c9ebdcc9ef7de363d367d747fec3bebfbb0fe523ae8497e7fc8a969f7d566c8279988f1db1000bb1e8a28414161fd77188563e06e0b700151d3b9d84b4ede361c4ced8054bb02b76c3522cc372ec9e9f60e52b4fde6bcbee952b0f6edc2beafd81fb59c165fe68efb57f7830ac42b158bdc6ea768335588b4100820d159fdfb0117445c3300c1fd71881911885d11883b1fd97fbe383fd079af02466fa2d1ff9b2200ea1f5f37fdafe7d44e7d9bca6fe19a7310ee331011331099331653030b5684ed3380afb23132fef3bd992f31c29ca6548524cc374ccc04c40c5c26cccc1dc7687ed1f1a817a1c9461f70b671ebc48df7e0f7eeaeeb15eb9f1932bbb1ff7005400a72b6496727dc10ea30198ccb079bbc2066c812db115b6f6dc5b866dc61cdb623bec059fe213dcfb8a27f1b3917a14c9fe61dfbfe5231facd5fae335341393fe3ede1bf97f70ed1b6b22711f13f023da1c8d47788c9fbc258636324cd15c3cf0448160c7ba8f79a9371a62af18bfe0097ec56f788a67788e1778d9499d548da82747a5ea3b68215f1feff6ffe0c72b2fd035a0247835dc5bece7f87123bd55f060cac0a17bf5395e8d125ee30ddee21ddee3033ee2180e11064ee0e4b8c3a9c1ba65388d33388b7338ffa59ecc7eedc9b7fd2681f3eb3adeb77ce44d47be81cccff287ae7cb476ff947dc6695cc0455cc2655c8156c54fb886eba7296ee066d4223c50bdaf0cd6cff3c7ba95ab7e1b70ab3fe036ee00322ebe1f45e8bb0a3fd497768bcffa1a8d6b010e0f1e6cfae21163b515e4ed2ccadf2bbcaf1a09a2df01a262c84faabe11113750dc35aa4857ea353ec717fd1a5fe2ab02c7d7f806dfb62b7c87bf10536212068447f8c49108708608a144c497fbb4b0e96ffdf9fa2cc463e7e775b7f875bdfdfb6b84df10f904975f75253cff5843fc1b4ffe5c17f6be1227e24c5c8884b81237222532223c2d899c40fb1ba68f53201e73f1c0930a1079b9e8090bad4e941d4d80d3c734a2215aa2237a6220c68627303064a21109b291080a45bac010bcc27a200f4137138229448285166a3305ffb41ed8aaa84ff5a53e111cc11342d5f66bc87d843623c43625a45c21644221544223747c4718841939843576b546d88443b8c49e3810b3aff424ccee36fbccb7ff62dbb7d96b4ef2364e35fd0591dff766fd5190aefce05cf38c4bf78cf1d335f6c49c58104b6245ac890db12576c48bcf90537212c35fc72ae2489cdcaae49094d7f3c54d92ebf23aab7d34bb05d520bd1b9f4dd15831e9e713f2480625311afd8e0c4bba531117205ba71a09b1038d9e9011199327f24c5e4a814cc82b792bdb822453e0c096ccb281cc51a44d16258e1e133259921559930dd9921dd9f70b722047cf253112277c6c4b12444c922445d2e437d677ddc7cd9f8cd25eaebfae4d7c1dcbfd9523af3f532a509fd8fe2ff7435c41baf2414e84ae587df639a707922159624572244f0aa4484a4448cafe8cc84925ec12eabe23eb9e9f902aa9913a6990e6c8901669271ce974f435b98af988d6a4002a2eb9270fe48c9c938b7e4730254d2e4baa534b865c3513724d6ec8ed18903bf2859a8e2635a13cca1f1dea98f154408554d45ea838cd8b8e3af5f38e231aea4c5da884ba6638754b8f540a6d3c60c484caa87c1ca8822aa90a00a981292e497f3d1f7fca3eeac7dfe7d1cfd3dfbcd5f4fd75104b7db896f28d0b482fe0fda6efeef1ee7e9f8d8fa1966aa896eaa89e1aa89114288cc2893d4550a4bf382d205f4c2edb58bf4c4f42a253144543612896e2289e12289192289952b21da5de784a4b8fddb56c283d9f530665f64dc1350265d5eb6e5af2944d6e28670c2897da0f3c75a8586a3604d83844d49c5aa46b3463452df3865ae532b5ce646a7353a82d20b2a576d44b6ab5e79b4c4fe949c7d01eedd3473aa0433a425bede81821427f63df6ff8fb98d78fbefa730d644abdb3f1c77a23efe71ce2d75c01ef7478b6c71bc560d1e4abb168fa4cb5f485eae984bed237f05e319d86144582f78a02f23487fc044f1ac0a404bf75a3330a4193432de892aee89a6ee896eec092f534a57bd26d387ca407724e8f3486d5344e1364489300263d063443b33437f8344f0bb438deba75e9d05239a7e5740ec98e9ccb6909c5465c211a5aa155a85a3da775daa04ef989da8e346d661bdaa26ddac14fb44befe903e80930e53beb85c17bfdf44aef740134e0f0473e337bdf9781f9ab6d072ae4e75f45c71f7028d0bffa9cf48c9ed30b7a49afe835bda1b7f48e7e61a6cc04378eeb3b2209e2ca797196cff2ad8ad533078fd03e2d0ded6d3cb38cc778b7fa46832593e07d2eed95f1c9fb21765042f25cf2484380210e13a1cdda5847f395dc25f55093cc99b9a46b7a52ac99244d3b36bd3057e6c6a40c880959303953f42b481676f074604ab267aa61c5d461c8344ccb744ccf0ccc48c7e0bd42e28bf1aef7f6fd2e5ff831bffe6cdcebdd1ce1b7d7397e81cd37c69151653006024a86642886a6570cc3b00cc7f09e81c56511ce621d30f1d08c7c382004ce2cda4157b445fb38db31208e7cb828da0b4465372a753b8e3ad31a23f42b46642402bbf30474a42e191930513a9b51bb39a3e57977abf4625fec99849e64727d2c3a46678c34604cc61a79c61ea78cc3b8cc9e39902933632ca263e6cc8259a61db362d6cc86b0992db3635ed82955b313e21bebbb7ee40b7ff8f7bb6f7ab2dff03c4531d8f3f99120fb509f3e2ddf5973c97aac8fc8c9866cc442b0c59e8803daf0c142c80b985ce021445f975decc54bb48e05ad9a80c451bda880ca96bd81712fc3e1c8b3199b5f0db6205b5a674bb6626bb61925b62570b68302490b3bb0238bb17869b0044b167aae17364bdd24f058f3a661694cc3ce49c232a4c9b27774168cc5a42c876fc88ce5598115598995598555598dd5d9096bb026f3c20cac85b8f2bdfd27bfcf8fff1cf30df167b975e48749e43f1fc30db2575df9326b796f01d1d3f1b55f2b6bb30eebb27b40e5c0ced839bb60a7ecb255d915bb3e2d101a910559ca80106137e8548ff382dd9e65f49affc2ee2e7eecc744780094baeba58fd91766c14d09919b701ee7e32577c4676ccb055c5857d4041d29818ddca9bbe63677a6a2bc6a1aead69eb80b517109773dd7dc8d4be9123bd306970d6b4c63742ea7d5b2e10aaee42aaee61aaee53aaea7f7dcc08dacc961f0792d76f2bdfd27418ee6e59feed14263bfdaef367c3f0f32ffe47eeadf9d3d11dec26facb9e4708ee0488ee2688ee1588ee37876ca0938cb8927eb7c09dde0789f6b5c5ebada43fba6ce75bce2a478057e0b9d32e81d85d3fc7c8db8d04b244e4e6b4e19594ee5344ee70cce6c7768acb711c9b0998e0167511e67e78786e51ccea5626ecf1db8195d276a47c5173483763f4b928f97899470dc9c5b9066bbe49629da8c5d722b6eedd5dc86db723bee8535f9293fe13de0c994f75f31f9922748073e1bebfd88135f69d477c72b3f5fd7f556f9231ff0211ff131daaacb5ff884bf123bfed6aa270bc55ea70e9d181cb5f1f2363d3997fec45e483e6577c763e886b3a8054cc223099ecde7333ee78b61c5977cc5d77cc3b77c57a7f5b5dea25944caea1bbee7077e1caf9c432bd4a5ac8b81a948ebccf3188ffbed914e5c9ee0c9131a3d00d5825862496a3c356c5ae946f034cf04e0c2788ee779811779899779058a0a2cb1f86f7fffc91f7be35fcbebbe7621d0ff668dfddf7125d89f8defdc97d7798337798bb77907d0317897dff3077ec6cf39d19f1d9751710cc22e56f805bf00eb2df9254ff22b7ecd6f001374f28a82cec139d7fc96dff12f02faf2054ff021fd0d84f0c77c4ada178d2444422c9cf0dd20e501e7d473e1cc54c2454884ab701352213b1eb99b900b0560b108071439b09b8b413a4299f542c5177e29d442c3344323b44227f4c28078c29ac2f87d3db96bc4fac339f63b2ad1f2efcedd42baf2d10ea0d7bb3eeefb655ef256054cc0050230390990320a343c670456e03045e0fd5c102e8c3f04d429bc9facb23c9f04519004595004f542207b46bb4f9346d0045d3004934b054bb005477085bd7010663f66b5766dd5d7345612c2bcbd090bb2ef97c292568495b01636c256d8092f473fa0e2e4c8172d44d90bb446f93424a0539995ee2899dd796b712a4e444ff4c5a31888a11881ca1bf45e18c5374cbe65dbf7731f3f9f67b7d06ed3cf74e4f736faf50c84df30799db737bfbb5f523c41427e162f62225ec59b988a99988b8558d23ba6132bb13e49111b6947129d252024c332e1f8426cc456ecc45e1cb804d3c451c4445c24045d24454a70455a644456e484c3cfb9c6beac37f55ae44b2257089515c86349d44bd2174a511045511265510989537466af7e16a1338f62efb4175551ebe38b756b4eaca88b4619b4b6686211af8a96688b0eaf882e6b8a7bf120cefee61c89276bec851ff3ee6ffb1b6f45febd3350832c4c3f5ab3ff8b964c9ecf693ee50926f462241080cd5c5c884b7125ae050ef7c48db81577ec3a8efc2d60c2892f23952449264dcf6b69c2cd254ff2a5a31448a11449b17492ce42205da444ba4a3729953229978a3a4315f93050fb33c1b5995412ba5449755533075a951aa9953aa987eb86c409404b20ceeecf8b53102bd208ef808df48d3ec712eed51221911225d1542531a02512f25eac214180cc6c25eeefceef0ae6ef4ee47cda8377be18c1e1f33d55c1fcda40cef35c4ffee4cd37f7df4bf0cf49a2d04ba23887c792244b8aa44a1afd22e992e16dc829519cdc2399e4a703daa17b9d27a9644a96644b8ee44a7bc6920ed24c9a4b0b69c9efa495e04a6b69236da59d94ff322bbf1b8ff8417a91a7f264a0aa52f6645f3eca81b49643399263a9904ff2f9c845dd2940a77bca17391126f255be5d30399533398fb67221977225eee51a78b2e225b9915bd680e7dddff104d55f6c5bf828160bfdc80bafb19b52e139bc9f148578d1b5e125502f97c8fb74dceb498926dfc94f784512845eee0115418c00924152e451c6708fe9645c2664f2f2725ca3f3b4ce71da0a495acb146973994c5f25f8c9a401d9300b99654c999379591059c195455992e53a93e39feb866505a2af2dc1c9aaacc97a7d6940c484a8beca86b0974da9035c2cd9961d745267e8c8aebc970ff24c9ecb0b7929afe4b5bc91b7f2aec1e51765aa4c148f1b0111b448c317f76f3cf9beff47edfddc95af6258e175fe04dac00eb9c779f5dff8bb0fcbfbf9958f5a7e2246fc8479e12772a31cc59512f08a12b216e4289e122971992a27e57c395e88f38b0251d2c54d6b2551aeca4d49954cc99522f59452dacb9cb454200696ae4aad344a2b1c7e59e3052adf88034be3fdba6ac6094850a674a35a274aaf0ccaa8600aae100aa9500aad300aab7010e60a8aa88081288aa7d0c75450d471503471a67872ade84aa8f8aca1004b145f3115eb3f390f1294fcc97ef96ff7ee676b5a3e3aa1f8cbf560779ea872c3abf073e455b0bd1a7263839f82f5c584abd88aa3b821adec95c3f9a2cc94390f915792dc57a9ce485b59284b65a5ac958db2155c65a7bca0affb533dd5578f6af0aa25af3c51c3aaeff3811d3dbc523a355263f504e5ac5ed444bdaa3735051ddaaa999a4ba95aa8a560a915d45a6dd4d6bfa64251b7aedaa9bd3a28ba3a42c5d451c58133e82b868807267f9757a0f694bd46b19fafdffafbf2d1fd848fd7b8bc1bef32e93dd89b2fba720b363755a62a2ed72aa958ec44a5545a655456e500344115554995554555136e18554dd5554335554bb55507426357ddab0775a6ce65495da8c7befc6d2d645a27a32a44f85c5daa2bcc51d7ea46d8031233a650b78cadeed4176daa4d344fa421766344529e69be76d482382fa3db4a0bb5e8a278732dd64ef01931edace2c20b3fd52eca54e2b4e43f3d5f189b7eb497eaff5179cd4c3f8be9b4abe26b3775d4522dbde52a862afcc799b7176744a8d85aae155aa955d3a9d668add669bdbce0e6da4049da28b91a260b1a2e5dd5bd4668a44669b4c668acc6693ce2c98fdd0ee97dffc94613c623e628bd266a92266b8a262b98a66a1a93e35b4dd70ccc9402cd94e69aa58882aed99a13319aabedb58336d3e6dac267829db6d44eda4a5b6b1b68b7da0e78335587574cfe8a233f750562b06fcc7bdc6dfce998f2d39eff38b71702e7f3f321c558bb8a2e2072d552667bcbb517a83b2d43ffbd3ed527ba5764baef89fa510ff4508ff4583fe967fda227fa55bfe9a99ea1015ebdd42bbdd61bbdd53bbdd707f5a88fbff104ed5301f5a8131d13421d7f642fed8b4ee8a43463399dc2b7b952e28c4d4c755a677456e7749ec474487be452977499ca747059eaa06bca141059e93a3c37b4445b2b96b6fd6fceab47e76e7dba7efeafcbfd3b1e9ec464f09a10585f8d1330bdb8bf7325d54ddd826aebce51023b5cfab4b7ac36baabeff5833e8b7b7dae05fa425fea2b7dad6f1449df0ababed35f8ca99ae9ad31313cc3378e426a0446684446f4eb0a5523aeaf985b27c6a94ec06f1d8db3941b17944d1a8971356e8c8d6fe5a37430d261a7da4666e4466194edc4a88c7a28c61a533ddbb38dc69b7b4ba3d51d5d373aa3370663d41d6fa1fd57e7d5a3f6947eb47ffeaf3dd37d5c2bc8a2c51f5cb9af27fb7a3c0db860323c2889a56b2a6160dad6c00cdc683d376cbdb9cf0691b7b9c806619093b94119b4c16847833538c1d53c8337384330a686a831eadc9034ca900d45ef0df57d0eff9ac76fd1faad92828878576fc0b3dd47c2500ed3977da96e0ccdd00d63e4b1c4300d4b570cdb700c371086cad81b0763e6adbd45a819a331780b630e8e6e6134c6f2fe7c69acbce57ffffd27e8bb4fa2e58f75c25f7bb3e77bbb6fd1fa6d5cebc798f18f199640ffcef95dba09def845dc1b38b0c432706f0976b7f49647d99b435d7a73637daa7a2da75ba79de87b63636c8d9df1624ecd89e999be7934216037236163c6e6c93c0b293a0e4f98a1b1aeb7b80bad5445a3f6e6b591eef5d66f4cc044d84905bace04c5317375231b6601f72cc3955999f5717fc6cdc66ccdaeba9abdcf869acff88cb7340703f316881d80c8089f70e12dd5fe9ff93eadb3719b85d7b798e95dfbe158d68ff55f53347a19f9bfce8ffc382feca1ecdfe0086a811bb8626a2fa895386008a0a26dd17f69b488335936f439698e2666e2b5aecf4cc2244dcaa44dc6644d6089c99b82219a4743baa322eabd2999b2a9fcb6b6fed61768e70f5aefd8487d61aa7c6b6a75a6903f50cbf4d1d4f5ca34d4d6344deb165dd2dbc2b4bbc2747cf7d2626ad89aaecf842b9f3196881bc668ee8d31d4e0f1f04ff0e4ad8659988274e2dfe2ca6b094c94eb3fe3c08ff91ad091ef9ec50a5e0057079540edbdb4e0bb5ae4b3115bd4de3c808552437f69cd592fdd56d1de9c9b0b73a907e6ca5c9b1b736beecc17736b4d35c69a08a9e5699c091ee9dd9830da93b21d95fa4c906d65f9d5d06ffa82ef1e3cb28ea02bafda6305e88b86acd8978fd5ed286f5b3b3b58a79ebfb46a5f66d699caac4bd8fa0c9521c600475c7340ccf19656f24f7f3f63a09cb2320eaf5f7caf16d83efafeb9cfe645ee3910baeed3b323deb7d6d5c0ad9b4a6889ee18f387cda9fd832b608bd8b98116f7e65476698fea9059e92db2322bb70aabb42aabb61aab9543abb37a6bb046ab33630b33b5dff66aa57d81d6023722562145a9466049264a722c470fe5b1708bb0488b32498bf64fc9f17695288b31318b8dc7a1cf32c4116f19ae3ccbe200199eca46d26750459c01fdff0779f2abc684e7681d4d8137b7c08c3c301a1c5cf50dbcd40a62b5f4167f67ec183244fdbb63c2a8226ee8165277f0cfd8a3dc756409afc04f9f459aa2410d5b4bb0c424be56972aba5a92255b8a1688f0c79686a4c8322dcbb22dc772adfd6f3be876f5ae93eab375e8147259e1d6acdf58f3879edc1159584b6b65adadcdc4b6b6d62e9b5b2ff6d49e40a0e50f3d62a97546fc804f70b1ce882b548638038f56882721f58ac93fc4914fe614f3e07524f2af3897fddd7706410ce3481c603207be5c1f5cf1203b435c01f59ca398a6697ddae8995a5e1d3bfbd84fed009d8f6965e8cb33ec580bec937db62f7662b296a966f6d5befdb19f3145bb181ab1cf3ba5531157eebb52323bb5333bb70b2bb24bbbb26bbbb956ad6db77667f7f1543bd91065dd3932b7ce57dae2909e001aefb882a9800a7cde7fd3f7fd1a18c4fad6434f50dcf5e089cf20aea0d80b792ea686dcc03596f61831361670366e13e5e9581d539bb4299bb6199bb5399bb7055b843e966cf9a1153fe64fa0f05dbbb3155bb5b54eb275331752dbb04ddb122bc0c3b61ddb8dae6752dedafb5eb70ff6cc9e63d831b217c050c73a1b63047a827041fc402cb197e82760443deabfe9fb7eb504e9074459c3fb36a4508c83b8027e616ebaacac3616379254e6adec9557c6337b6db8f6c68fc3786ad85b7b67bf385367e278a0d2aae33b47940ffe5a40437227306427b44d277262a3704eced9b938c999f0d588bc88ceb50d8ac4b9d9be933a1958c2fcce1170618007c7d4166f9d9d1c6a41654e692f9d8aca4c179e57ff2e9e8062809da1181ff96b64710fff7cb7bff628dfb646cbd4f6e8d41667dd0fe10e9833138f4ee3b4da3e2ec3e2584691d339bd3338a3b970302b7270b5750887742887761887753887b3343b717827f2394770444772644771544773f4288a4e272d8912c2311cf3d2969993062f3e6d9de36909eaeed90f8edcb5e41c310f2db197f6b28447a031e7327bc5e47f828dff032dd28b7b6ebc0a29a7b2ce881b8fe7909d810d82f7029e3c6c7224eda5c587adbdf40cc7f24a7deed8b7bde39c8c40385661e9b8966457cede39383367ee2c9ca5b372d65ae0a9d06ebc1458b17576ce0bf83bf07b56e61f27c2d170a756ea4ea25b39891c7be57a91edfa9e1db601536625628be51e91c687ad53a1881850003d419fd5a9d0e72ac18f85edbf892780c102551465216edc3d162002f1ef02c55d0f0f4241efb801f8ada575b647a8cb082dff3d1d3b377423378ef617e9acc587dbc53db967f7e226eed5bdd9949bba999bbb855bba955b879545bb8ddb5a99dbb9dd793c5b6eef0e36e18e01e762f62a9e7a4bb4f4dbb3d0fd03c686778e32cf0a1878471f215466118abecee8f3207e50f7570226fc727ffcff4fad3180860027eef9f08ff6ae2b77ae4838b2d9a13f99e053c02e2dcef55d1cb41ed061e52b7d6ec2e654a36d3926e6527690ccaf954b47e42d049550dcb37f9ed0c1daedfcb3cb403d2593e0ecb2c9dce59279321d0b974fda64d6ef41a99c8071bd735366a20e16708cb2e025248d1de4246764116536f48813e5dd5f21d410676c40310246fd9b7872d70ef00be55b0cd3221f8d2a8abd405dee0a7b9487fe28836fbf473bc836af749445994f8724f41d33f43def0aae48e5ae64d6ae1ced5de5acdd6e57fcacb97d332aaaab6ab3d6699d9cce6e43e66aaeee1aae6963ae15a728aef2ec2074bda14f3b60df1cf5b767e7441006214201bd6e421d7adb4708215543fc419f3b60e2f41593ff0136fe4fb428eb1a49a49e2886413e1b55e4ab811710e3b836e206ca0120b74f0cdce7bce5e3fa47afa03ef156fdbeccfa3d27f6fb18f27dd7316649eb0baeebeedd3d11b807fb00f19459a6be90b4c6ec543b1627ba015783cdafa20c98e73b45b8726769c789a02773f05836e8086e2f51752af09bebb40bd8a17f7005b801ef8b74047d0e7915fcabe22e14735909e2071a4742c8f88fc8e6deeb11e80b8ab6cc01b2495cd7b417140320cf81ae47fd837a096980eb415d40ff2e218e4d83de5dc5a9ed87d45146b15b1bdb737b9ec5a8d8beed07c0336082e559886feedc9d2b276fe506c61add13f5f89576e7de0a10635026e2068827267850148b3d7e0f98f8e0bbeef78afe55f909ca81c3d5831bc8ea4c17fcd60ac5360fcea00818e2afcb2387467902bcc62354106ad0bfcb075f5cffcd7611424e8a9e2354efbf771eede3f9e37ddefe0e62380bddc9c9915e0d3de2eae33af43af830eef179106f7fc65e0143dd9f3dee83cabf892728d242baf188addec69542ea4d57903d238b462db248649f57fa110b3d2afadddd569117b3509c849e3f7ef778edd7f69e6b9c1fb6fe768f47455af1f81df289a8cf915e3c622ec45974cd0391f235ee42a83c5eff37e9c93d57d71eb93b7002f293c7f811d826e4f2800dca5f90dfe6514efd40e7c10114b13e7ad0f51f88b87e943d9e3fb2bcf71cfad94619fabbb7fbbcbdfee0068a741fcf111ee8fd1ff9c7038d47acf5d63ef4e4f1fb574cfe07d8f83f5151dcf598abbbf3a34579fc23977fc4613e83e628903d3e7cc5c3f3bcd9f39bbd239e3c328b47fd69efbf730571ec81dc1be7defef67eedfd333c10408fa80c457b65f688411ef77c70e471fde333ddf393fff3bfffd7ff0527554e47</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="9213">789cedd6b10ac2301845e13d4ff1d36c416c429782f80882a3200e314574e8a27510f1dd35191c1ce2206488e76cb7217c5b686b64b35e8969d565f2d3294838fab398e13a8eb7ed6e79578d73567a2b9db866a61a2f41b47dd57771cee3dc0ff1439c3ace432a9d66d331ff2ecdfc8d7c888888888888888888888888758afa7b1fe22f21d623faa2212222febb58fe9543ac432cff678588888888888888888888885899f858a827579f8c14</data>
+ </image>
+ <image name="image4">
+ <data format="XPM.GZ" length="1112">789c9dd2cb8e9b301406e07d9e0225bba89a09601350d505302c5b7559a9eac23e6672b363620c0ca9faeef53949da2e2a55eab123f9e38f2f217e5e475f3e7f8cd6cf8bde0b7f8008f6c2456b3518337ffdf6e1fb62992451e8691ac5cb778be55304d1277b6e71fc12c6ab0d157222e61bd8e4c812196f6216535a13f318624a6764b2495842e99558249014c81e99c6294b69d3376291424ae9806431638cd28628183081f4489e70ce13e4852878c129ad905992f18cd291283295517a466ed32ddfa64847945bb595c80e99a739cf29d54499ab9c528b2c58c10b86344428540148400a26b8a0541241b482d215523299494a0551c9562ae409091c32e0c82351410b942aa4e22a53941e882d36e41ed966d8903b2215f215f99a6143b6442afaafff5aff485658622584a091941256948443d1cabbdd6ebf3f28753c09a9e9cdc1fe703c9e4ea19f689a0430fa4c8908082be093d08d016bbb0bbd5e7ceafade5b30de19d083b3fa9e008cd39b9fafd69495b473af7fcfb15325c1d61eea0afaf005ddf97b5295c658a866338f97591babef7340fa396c6c5ca9e7fe650807d0bf566b4262299986ba335a3b4a2cc84b69ac85b1b673037d8fabf95b023a9c09cc7530e104dd5419ed6e27083fb09a7c752db5a9bd31cde4ec634ed8a39aebbe337618c3f6fdc5dee6d8b0bb0d6b5b8b1fad43d78fe4e14e3f6aace8e29d9d736777fea3c686eee0138c9726d4d00c548df7a315ff750f7ebc5ffc04a0e5308d</data>
+ </image>
+ <image name="image5">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </image>
+</images>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/demo/dnd/iconview.cpp b/examples/demo/dnd/iconview.cpp
new file mode 100644
index 0000000..c7c184e
--- /dev/null
+++ b/examples/demo/dnd/iconview.cpp
@@ -0,0 +1,42 @@
+#include <qdragobject.h>
+
+#include "dnd.h"
+#include "iconview.h"
+
+
+IconView::IconView( QWidget* parent, const char* name )
+ : QIconView( parent, name )
+{
+ connect( this, SIGNAL(dropped(QDropEvent*, const QValueList<QIconDragItem>&)),
+ SLOT(slotNewItem(QDropEvent*, const QValueList<QIconDragItem>&)));
+}
+
+IconView::~IconView()
+{
+
+}
+
+
+QDragObject *IconView::dragObject()
+{
+ if ( !currentItem() ) return 0;
+
+ QTextDrag * drg = new QTextDrag( ((IconViewItem*)currentItem())->tag(), this );
+ drg->setSubtype("dragdemotag");
+ drg->setPixmap( *currentItem()->pixmap() );
+
+ return drg;
+}
+
+void IconView::slotNewItem( QDropEvent *e, const QValueList<QIconDragItem>& )
+{
+ QString tag;
+ if ( !e->provides( "text/dragdemotag" ) ) return;
+
+ if ( QTextDrag::decode( e, tag ) ) {
+ IconItem item = ((DnDDemo*) parentWidget())->findItem( tag );
+ IconViewItem *iitem = new IconViewItem( this, item.name(), *item.pixmap(), tag );
+ iitem->setRenameEnabled( TRUE );
+ }
+ e->acceptAction();
+}
diff --git a/examples/demo/dnd/iconview.h b/examples/demo/dnd/iconview.h
new file mode 100644
index 0000000..cd917f7
--- /dev/null
+++ b/examples/demo/dnd/iconview.h
@@ -0,0 +1,31 @@
+#include <qiconview.h>
+#include <qstring.h>
+
+#include "dnd.h"
+
+class IconViewItem : public QIconViewItem
+{
+public:
+ IconViewItem( QIconView * parent, const QString & text, const QPixmap & icon, const QString& tag )
+ : QIconViewItem( parent, text, icon ), _tag( tag ) {}
+ virtual ~IconViewItem() {}
+
+ QString tag() { return _tag; }
+
+private:
+ QString _tag;
+};
+
+class IconView : public QIconView
+{
+ Q_OBJECT
+
+public:
+ IconView( QWidget* parent = 0, const char* name = 0 );
+ ~IconView();
+
+ QDragObject *dragObject();
+
+public slots:
+ void slotNewItem( QDropEvent *t, const QValueList<QIconDragItem>& );
+};
diff --git a/examples/demo/dnd/listview.cpp b/examples/demo/dnd/listview.cpp
new file mode 100644
index 0000000..8c87b23
--- /dev/null
+++ b/examples/demo/dnd/listview.cpp
@@ -0,0 +1,72 @@
+#include <qdragobject.h>
+#include <qapplication.h>
+#include "listview.h"
+#include "dnd.h"
+
+ListView::ListView( QWidget* parent, const char* name )
+ : QListView( parent, name )
+{
+ setAcceptDrops( TRUE );
+ setSorting( -1, FALSE );
+ dragging = FALSE;
+}
+
+ListView::~ListView()
+{
+
+}
+
+void ListView::dragEnterEvent( QDragEnterEvent *e )
+{
+ if ( e->provides( "text/dragdemotag" ) )
+ e->accept();
+}
+
+void ListView::dropEvent( QDropEvent *e )
+{
+ if ( !e->provides( "text/dragdemotag" ) )
+ return;
+
+ QString tag;
+
+ if ( QTextDrag::decode( e, tag ) ) {
+ IconItem item = ((DnDDemo*) parentWidget())->findItem( tag );
+ QListViewItem *after = itemAt( viewport()->mapFromParent( e->pos() ) );
+ ListViewItem *litem = new ListViewItem( this, after, item.name(), tag );
+ litem->setPixmap( 0, *item.pixmap() );
+ }
+}
+
+void ListView::contentsMousePressEvent( QMouseEvent *e )
+{
+ QListView::contentsMousePressEvent( e );
+ dragging = TRUE;
+ pressPos = e->pos();
+}
+
+void ListView::contentsMouseMoveEvent( QMouseEvent *e )
+{
+ QListView::contentsMouseMoveEvent( e );
+
+ if ( ! dragging ) return;
+
+ if ( !currentItem() ) return;
+
+ if ( ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) {
+ QTextDrag *drg = new QTextDrag( ((ListViewItem*)currentItem())->tag(), this );
+
+ const QPixmap *p = ((ListViewItem*)currentItem())->pixmap( 0 );
+ if (p)
+ drg->setPixmap(*p);
+ drg->setSubtype( "dragdemotag" );
+ drg->dragCopy();
+ dragging = FALSE;
+ }
+}
+
+void ListView::contentsMouseReleaseEvent( QMouseEvent *e )
+{
+ QListView::contentsMouseReleaseEvent( e );
+ dragging = FALSE;
+}
+
diff --git a/examples/demo/dnd/listview.h b/examples/demo/dnd/listview.h
new file mode 100644
index 0000000..507e594
--- /dev/null
+++ b/examples/demo/dnd/listview.h
@@ -0,0 +1,35 @@
+#include <qlistview.h>
+
+class ListViewItem : public QListViewItem
+{
+public:
+ ListViewItem ( QListView * parent, const QString& name, const QString& tag )
+ : QListViewItem( parent, name ), _tag( tag ) {}
+ ListViewItem ( QListView * parent, QListViewItem * after, const QString& name, const QString& tag )
+ : QListViewItem( parent, after, name ), _tag( tag ) {}
+ virtual ~ListViewItem() {}
+
+ QString tag() { return _tag; }
+
+private:
+ QString _tag;
+};
+
+class ListView : public QListView
+{
+ Q_OBJECT
+
+public:
+ ListView( QWidget* parent = 0, const char* name = 0 );
+ ~ListView();
+
+ void dragEnterEvent( QDragEnterEvent * );
+ void dropEvent( QDropEvent * );
+ void contentsMousePressEvent( QMouseEvent * );
+ void contentsMouseMoveEvent( QMouseEvent * );
+ void contentsMouseReleaseEvent( QMouseEvent * );
+
+private:
+ QPoint pressPos;
+ bool dragging;
+};
diff --git a/examples/demo/dnd/styledbutton.cpp b/examples/demo/dnd/styledbutton.cpp
new file mode 100644
index 0000000..b592ee6
--- /dev/null
+++ b/examples/demo/dnd/styledbutton.cpp
@@ -0,0 +1,308 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "styledbutton.h"
+
+#include <qcolordialog.h>
+#include <qpalette.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qapplication.h>
+#include <qdragobject.h>
+#include <qstyle.h>
+
+StyledButton::StyledButton(QWidget* parent, const char* name)
+ : QButton( parent, name ), pix( 0 ), spix( 0 ), edit( ColorEditor ), s( 0 ), mousePressed( FALSE )
+{
+ setMinimumSize( minimumSizeHint() );
+ setAcceptDrops( TRUE );
+
+ connect( this, SIGNAL(clicked()), SLOT(onEditor()));
+}
+
+StyledButton::StyledButton( const QBrush& b, QWidget* parent, const char* name, WFlags f )
+ : QButton( parent, name, f ), spix( 0 ), s( 0 )
+{
+ col = b.color();
+ pix = b.pixmap();
+ setMinimumSize( minimumSizeHint() );
+}
+
+StyledButton::~StyledButton()
+{
+ if ( pix ) {
+ delete pix;
+ pix = 0;
+ }
+ if ( spix ) {
+ delete spix;
+ spix = 0;
+ }
+}
+
+void StyledButton::setEditor( EditorType e )
+{
+ if ( edit == e )
+ return;
+
+ edit = e;
+ update();
+}
+
+StyledButton::EditorType StyledButton::editor() const
+{
+ return edit;
+}
+
+void StyledButton::setColor( const QColor& c )
+{
+ col = c;
+ update();
+}
+
+void StyledButton::setPixmap( const QPixmap & pm )
+{
+ if ( !pm.isNull() ) {
+ delete pix;
+ pix = new QPixmap( pm );
+ } else {
+ delete pix;
+ pix = 0;
+ }
+ scalePixmap();
+}
+
+QColor StyledButton::color() const
+{
+ return col;
+}
+
+QPixmap* StyledButton::pixmap() const
+{
+ return pix;
+}
+
+bool StyledButton::scale() const
+{
+ return s;
+}
+
+void StyledButton::setScale( bool on )
+{
+ if ( s == on )
+ return;
+
+ s = on;
+ scalePixmap();
+}
+
+QSize StyledButton::sizeHint() const
+{
+ return QSize( 50, 25 );
+}
+
+QSize StyledButton::minimumSizeHint() const
+{
+ return QSize( 50, 25 );
+}
+
+void StyledButton::scalePixmap()
+{
+ delete spix;
+
+ if ( pix ) {
+ spix = new QPixmap( 6*width()/8, 6*height()/8 );
+ QImage img = pix->convertToImage();
+
+ spix->convertFromImage( s? img.smoothScale( 6*width()/8, 6*height()/8 ) : img );
+ } else {
+ spix = 0;
+ }
+
+ update();
+}
+
+void StyledButton::resizeEvent( QResizeEvent* e )
+{
+ scalePixmap();
+ QButton::resizeEvent( e );
+}
+
+void StyledButton::drawButton( QPainter *paint )
+{
+ style().drawPrimitive(QStyle::PE_ButtonBevel, paint, rect(), colorGroup(),
+ isDown() ? QStyle::Style_Sunken : QStyle::Style_Default);
+ drawButtonLabel(paint);
+
+ if (hasFocus())
+ style().drawPrimitive(QStyle::PE_FocusRect, paint,
+ style().subRect(QStyle::SR_PushButtonFocusRect, this),
+ colorGroup(), QStyle::Style_Default);
+}
+
+void StyledButton::drawButtonLabel( QPainter *paint )
+{
+ QColor pen = isEnabled() ?
+ hasFocus() ? palette().active().buttonText() : palette().inactive().buttonText()
+ : palette().disabled().buttonText();
+ paint->setPen( pen );
+
+ if(!isEnabled()) {
+ paint->setBrush( QBrush( colorGroup().button() ) );
+ }
+ else if ( edit == PixmapEditor && spix ) {
+ paint->setBrush( QBrush( col, *spix ) );
+ paint->setBrushOrigin( width()/8, height()/8 );
+ } else
+ paint->setBrush( QBrush( col ) );
+
+ paint->drawRect( width()/8, height()/8, 6*width()/8, 6*height()/8 );
+}
+
+void StyledButton::onEditor()
+{
+ switch (edit) {
+ case ColorEditor: {
+ QColor c = QColorDialog::getColor( palette().active().background(), this );
+ if ( c.isValid() ) {
+ setColor( c );
+ emit changed();
+ }
+ } break;
+ case PixmapEditor: {
+ QPixmap p;
+ /*
+ if ( pixmap() )
+ p = qChoosePixmap( this,*pixmap() );
+ else
+ p = qChoosePixmap( this, QPixmap() );
+ if ( !p.isNull() ) {
+ setPixmap( p );
+ emit changed();
+ }
+ */
+ } break;
+ default:
+ break;
+ }
+}
+
+void StyledButton::mousePressEvent(QMouseEvent* e)
+{
+ QButton::mousePressEvent(e);
+ mousePressed = TRUE;
+ pressPos = e->pos();
+}
+
+void StyledButton::mouseMoveEvent(QMouseEvent* e)
+{
+ QButton::mouseMoveEvent( e );
+#ifndef QT_NO_DRAGANDDROP
+ if ( !mousePressed )
+ return;
+ if ( ( pressPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) {
+ if ( edit == ColorEditor ) {
+ QColorDrag *drg = new QColorDrag( col, this );
+ QPixmap pix( 25, 25 );
+ pix.fill( col );
+ QPainter p( &pix );
+ p.drawRect( 0, 0, pix.width(), pix.height() );
+ p.end();
+ drg->setPixmap( pix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+ else if ( edit == PixmapEditor && pix && !pix->isNull() ) {
+ QImage img = pix->convertToImage();
+ QImageDrag *drg = new QImageDrag( img, this );
+ if(spix)
+ drg->setPixmap( *spix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+ }
+#endif
+}
+
+#ifndef QT_NO_DRAGANDDROP
+void StyledButton::dragEnterEvent( QDragEnterEvent *e )
+{
+ setFocus();
+ if ( edit == ColorEditor && QColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void StyledButton::dragLeaveEvent( QDragLeaveEvent * )
+{
+ if ( hasFocus() )
+ parentWidget()->setFocus();
+}
+
+void StyledButton::dragMoveEvent( QDragMoveEvent *e )
+{
+ if ( edit == ColorEditor && QColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void StyledButton::dropEvent( QDropEvent *e )
+{
+ if ( edit == ColorEditor && QColorDrag::canDecode( e ) ) {
+ QColor color;
+ QColorDrag::decode( e, color );
+ setColor(color);
+ emit changed();
+ e->accept();
+ }
+ else if ( edit == PixmapEditor && QImageDrag::canDecode( e ) ) {
+ QImage img;
+ QImageDrag::decode( e, img );
+ QPixmap pm;
+ pm.convertFromImage(img);
+ setPixmap(pm);
+ emit changed();
+ e->accept();
+ } else {
+ e->ignore();
+ }
+}
+#endif // QT_NO_DRAGANDDROP
diff --git a/examples/demo/dnd/styledbutton.h b/examples/demo/dnd/styledbutton.h
new file mode 100644
index 0000000..5f23c40
--- /dev/null
+++ b/examples/demo/dnd/styledbutton.h
@@ -0,0 +1,106 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Designer.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef STYLEDBUTTON_H
+#define STYLEDBUTTON_H
+
+#include <qbutton.h>
+#include <qpixmap.h>
+
+class QColor;
+class QBrush;
+
+class StyledButton : public QButton
+{
+ Q_OBJECT
+
+ Q_PROPERTY( QColor color READ color WRITE setColor )
+ Q_PROPERTY( QPixmap pixmap READ pixmap WRITE setPixmap )
+ Q_PROPERTY( EditorType editor READ editor WRITE setEditor )
+ Q_PROPERTY( bool scale READ scale WRITE setScale )
+
+ Q_ENUMS( EditorType )
+
+public:
+ enum EditorType { ColorEditor, PixmapEditor };
+
+ StyledButton( QWidget* parent = 0, const char* name = 0 );
+ StyledButton( const QBrush& b, QWidget* parent = 0, const char* name = 0, WFlags f = 0 );
+ ~StyledButton();
+
+ void setEditor( EditorType );
+ EditorType editor() const;
+
+ void setColor( const QColor& );
+ void setPixmap( const QPixmap& );
+
+ QPixmap* pixmap() const;
+ QColor color() const;
+
+ void setScale( bool );
+ bool scale() const;
+
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+public slots:
+ virtual void onEditor();
+
+signals:
+ void changed();
+
+protected:
+ void mousePressEvent(QMouseEvent*);
+ void mouseMoveEvent(QMouseEvent*);
+#ifndef QT_NO_DRAGANDDROP
+ void dragEnterEvent ( QDragEnterEvent * );
+ void dragMoveEvent ( QDragMoveEvent * );
+ void dragLeaveEvent ( QDragLeaveEvent * );
+ void dropEvent ( QDropEvent * );
+#endif // QT_NO_DRAGANDDROP
+ void drawButton( QPainter* );
+ void drawButtonLabel( QPainter* );
+ void resizeEvent( QResizeEvent* );
+ void scalePixmap();
+
+private:
+ QPixmap* pix;
+ QPixmap* spix; // the pixmap scaled down to fit into the button
+ QColor col;
+ EditorType edit;
+ bool s;
+ QPoint pressPos;
+ bool mousePressed;
+};
+
+#endif //STYLEDBUTTON_H
diff --git a/examples/demo/frame.cpp b/examples/demo/frame.cpp
new file mode 100644
index 0000000..30277d8
--- /dev/null
+++ b/examples/demo/frame.cpp
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "frame.h"
+
+#include <qapplication.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qaccel.h>
+#include <qtoolbox.h>
+#include <qpainter.h>
+#include <qwidgetstack.h>
+#include <qstylefactory.h>
+#include <qaction.h>
+#include <qsignalmapper.h>
+#include <qdict.h>
+#include <qdir.h>
+#include <qtextcodec.h>
+#include <stdlib.h>
+#include <qbuttongroup.h>
+#include <qtoolbutton.h>
+
+static QTranslator *translator = 0;
+static QTranslator *qt_translator = 0;
+
+Frame::Frame( QWidget *parent, const char *name )
+ : QMainWindow( parent, name )
+{
+ QMenuBar *mainMenu = menuBar();
+ QPopupMenu *fileMenu = new QPopupMenu( this, "file" );
+ fileMenu->insertItem( tr( "&Exit" ), this, SLOT( close() ),
+ QAccel::stringToKey( tr( "Ctrl+Q" ) ) );
+
+ QPopupMenu *styleMenu = new QPopupMenu( this, "style" );
+ styleMenu->setCheckable( TRUE );
+ QActionGroup *ag = new QActionGroup( this, 0 );
+ ag->setExclusive( TRUE );
+ QSignalMapper *styleMapper = new QSignalMapper( this );
+ connect( styleMapper, SIGNAL( mapped( const QString& ) ),
+ this, SLOT( setStyle( const QString& ) ) );
+
+ QStringList list = QStyleFactory::keys();
+ list.sort();
+ QDict<int> stylesDict( 17, FALSE );
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
+ QString style = *it;
+ QString styleAccel = style;
+ if ( stylesDict[styleAccel.left(1)] ) {
+ for ( uint i = 0; i < styleAccel.length(); i++ ) {
+ if ( !stylesDict[styleAccel.mid( i, 1 )] ) {
+ stylesDict.insert(styleAccel.mid( i, 1 ), (const int *)1);
+ styleAccel = styleAccel.insert( i, '&' );
+ break;
+ }
+ }
+ } else {
+ stylesDict.insert(styleAccel.left(1), (const int *)1);
+ styleAccel = "&"+styleAccel;
+ }
+ QAction *a = new QAction( style, QIconSet(),
+ styleAccel, 0, ag, 0, ag->isExclusive() );
+ connect( a, SIGNAL( activated() ), styleMapper, SLOT(map()) );
+ styleMapper->setMapping( a, a->text() );
+ }
+ ag->addTo( styleMenu );
+
+ mainMenu->insertItem( tr( "&File" ), fileMenu );
+ mainMenu->insertItem( tr( "St&yle" ), styleMenu );
+
+ stack = new QWidgetStack( this );
+
+ setCentralWidget( stack );
+}
+
+void Frame::setCategories( const QPtrList<CategoryInterface> &l )
+{
+ categories = l;
+ QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
+ dw->setResizeEnabled( TRUE );
+ dw->setVerticalStretchable( TRUE );
+ addDockWindow( dw, DockLeft );
+ setDockEnabled( dw, DockTop, FALSE );
+ setDockEnabled( dw, DockBottom, FALSE );
+ dw->setCloseMode( QDockWindow::Always );
+
+ toolBox = new QToolBox( dw );
+ dw->setWidget( toolBox );
+
+ dw->setCaption( tr( "Demo Categories" ) );
+
+ for ( int i = 0; i < categories.count(); ++i )
+ toolBox->addItem( createCategoryPage( categories.at(i) ),
+ categories.at(i)->icon(),
+ categories.at(i)->name() );
+
+ categories.first()->setCurrentCategory( 0 );
+}
+
+QWidget *Frame::createCategoryPage( CategoryInterface *c )
+{
+ QButtonGroup *g = new QButtonGroup( 1, Horizontal, toolBox );
+ g->setFrameStyle( QFrame::NoFrame );
+ g->setEraseColor(green);
+ g->setBackgroundMode(PaletteBase);
+ for ( int i = 0; i < c->numCategories(); ++i ) {
+ QToolButton *b = new QToolButton( g );
+ b->setBackgroundMode(PaletteBase);
+ b->setTextLabel( c->categoryName( i ) );
+ b->setIconSet( c->categoryIcon( i ) );
+ b->setAutoRaise( TRUE );
+ b->setTextPosition( QToolButton::Right );
+ b->setUsesTextLabel( TRUE );
+ g->insert( b, i + c->categoryOffset() );
+ connect( g, SIGNAL( clicked( int ) ), c, SLOT( setCurrentCategory( int ) ) );
+ }
+ return g;
+}
+
+void Frame::setStyle( const QString& style )
+{
+ QStyle *s = QStyleFactory::create( style );
+ if ( s )
+ QApplication::setStyle( s );
+}
+
+void Frame::updateTranslators()
+{
+ if ( !qt_translator ) {
+ qt_translator = new QTranslator( qApp );
+ translator = new QTranslator( qApp );
+ qApp->installTranslator( qt_translator );
+ qApp->installTranslator( translator );
+ }
+
+ QString base = QDir("../../translations").absPath();
+ qt_translator->load( QString( "qt_%1" ).arg( QTextCodec::locale() ), base );
+ translator->load( QString( "translations/demo_%1" ).arg( QTextCodec::locale() ) );
+}
+
+bool Frame::event( QEvent *e )
+{
+ if ( e->type() == QEvent::LocaleChange )
+ updateTranslators();
+
+ return QMainWindow::event( e );
+}
diff --git a/examples/demo/frame.h b/examples/demo/frame.h
new file mode 100644
index 0000000..cb98048
--- /dev/null
+++ b/examples/demo/frame.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qmainwindow.h>
+#include <qintdict.h>
+#include "categoryinterface.h"
+
+class QToolBox;
+class QStyle;
+class QWidgetStack;
+
+class Frame : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ Frame( QWidget *parent=0, const char *name=0 );
+ void setCategories( const QPtrList<CategoryInterface> &l );
+
+ static void updateTranslators();
+
+ QWidgetStack *widgetStack() const { return stack; }
+
+private slots:
+ void setStyle( const QString& );
+
+protected:
+ bool event( QEvent *e );
+
+private:
+ QWidget *createCategoryPage( CategoryInterface *c );
+
+private:
+ QToolBox *toolBox;
+ QWidgetStack *stack;
+ QIntDict<QWidget> categoryPages;
+ QPtrList<CategoryInterface> categories;
+
+};
diff --git a/examples/demo/graph.cpp b/examples/demo/graph.cpp
new file mode 100644
index 0000000..f41fa3b
--- /dev/null
+++ b/examples/demo/graph.cpp
@@ -0,0 +1,445 @@
+#include "graph.h"
+#include <qcanvas.h>
+#include <stdlib.h>
+#include <qdatetime.h>
+#include <qhbox.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+const int bounce_rtti = 1234;
+
+// We use a global variable to save memory - all the brushes and pens in
+// the mesh are shared.
+static QBrush *tb = 0;
+static QPen *tp = 0;
+
+class EdgeItem;
+class NodeItem;
+class FigureEditor;
+typedef QValueList<NodeItem*> NodeItemList;
+typedef QValueList<EdgeItem*> EdgeItemList;
+
+#define SPEED2ADVANCE(x) (301-x)
+
+class GraphWidgetPrivate
+{
+public:
+ GraphWidgetPrivate() {
+ moving = 0;
+ speed = 275;
+ }
+ ~GraphWidgetPrivate() {
+ delete canvas;
+ }
+ NodeItemList nodeItems;
+ FigureEditor* editor;
+ QCanvas* canvas;
+ QCanvasItem* moving;
+ int speed;
+};
+
+class EdgeItem: public QCanvasLine
+{
+public:
+ EdgeItem( NodeItem*, NodeItem*, QCanvas* );
+ void setFromPoint( int x, int y ) ;
+ void setToPoint( int x, int y );
+ void moveBy(double dx, double dy);
+
+ NodeItem* from;
+ NodeItem* to;
+};
+
+
+
+class NodeItem: public QCanvasEllipse
+{
+public:
+ NodeItem( GraphWidgetPrivate* g );
+ ~NodeItem() {}
+
+ void addInEdge( EdgeItem *edge ) { inList.append( edge ); }
+ void addOutEdge( EdgeItem *edge ) { outList.append( edge ); }
+
+ void moveBy(double dx, double dy);
+
+ void calcForce();
+ void advance( int stage );
+
+private:
+ GraphWidgetPrivate* graph;
+ EdgeItemList inList;
+ EdgeItemList outList;
+};
+
+
+
+void EdgeItem::moveBy(double, double)
+{
+ //nothing
+}
+
+EdgeItem::EdgeItem( NodeItem *fromItem, NodeItem *toItem, QCanvas *canvas )
+ : QCanvasLine( canvas )
+{
+ from = fromItem;
+ to = toItem;
+ setPen( *tp );
+ setBrush( *tb );
+ from->addOutEdge( this );
+ to->addInEdge( this );
+ setPoints( int(from->x()), int(from->y()), int(to->x()), int(to->y()) );
+ setZ( 127 );
+}
+
+void EdgeItem::setFromPoint( int x, int y )
+{
+ setPoints( x,y, endPoint().x(), endPoint().y() );
+}
+
+void EdgeItem::setToPoint( int x, int y )
+{
+ setPoints( startPoint().x(), startPoint().y(), x, y );
+}
+
+
+void NodeItem::moveBy(double dx, double dy)
+{
+ double nx = x() + dx;
+ double ny = y() + dy;
+ if ( graph->moving != this ) {
+ nx = QMAX( width()/2, nx );
+ ny = QMAX( height()/2, ny );
+ nx = QMIN( canvas()->width() - width()/2, nx );
+ ny = QMIN( canvas()->height() - height()/2, ny );
+ }
+ QCanvasEllipse::moveBy( nx-x(), ny-y() );
+ EdgeItemList::Iterator it;
+ for ( it = inList.begin(); it != inList.end(); ++it )
+ (*it)->setToPoint( int(x()), int(y()) );
+ for ( it = outList.begin(); it != outList.end(); ++it )
+ (*it)->setFromPoint( int(x()), int(y()) );
+}
+
+NodeItem::NodeItem( GraphWidgetPrivate* g )
+ : QCanvasEllipse( 32, 32, g->canvas )
+{
+ graph = g;
+ graph->nodeItems.append( this );
+ setPen( *tp );
+ setBrush( *tb );
+ setZ( 128 );
+}
+
+void NodeItem::advance( int stage ) {
+ switch ( stage ) {
+ case 0:
+ calcForce();
+ break;
+ case 1:
+ QCanvasItem::advance(stage);
+ break;
+ }
+}
+
+void NodeItem::calcForce() {
+ if ( graph->moving == this ) {
+ setVelocity( 0, 0 );
+ return;
+ }
+ double xvel = 0;
+ double yvel = 0;
+ for ( NodeItemList::Iterator it = graph->nodeItems.begin(); it != graph->nodeItems.end(); ++it ) {
+ NodeItem* n = (*it);
+ if ( n == this )
+ continue;
+ double dx = x() - n->x();
+ double dy = y() - n->y();
+ double l = 2 * ( dx * dx + dy * dy );
+ if ( l > 0 ) {
+ xvel = xvel + dx*260 / l;
+ yvel = yvel + dy*260 / l;
+ }
+ }
+ double w = 1 + outList.count() + inList.count();
+ w *= 10;
+ EdgeItemList::Iterator it2;
+ EdgeItem * e;
+ NodeItem* n;
+ for ( it2 = outList.begin(); it2 != outList.end(); ++it2 ) {
+ e = (*it2);
+ n = e->to;
+ xvel = xvel - ( x() - n->x() ) / w;
+ yvel = yvel - ( y() - n->y() ) / w;
+ }
+ for ( it2 = inList.begin(); it2 != inList.end(); ++it2 ) {
+ e = (*it2);
+ n = e->from;
+ xvel = xvel - ( x() - n->x() ) / w;
+ yvel = yvel - ( y() - n->y() ) / w;
+ }
+ if ( QABS( xvel ) < .1 && QABS( yvel ) < .1 )
+ xvel = yvel = 0;
+ setVelocity( xvel, yvel );
+}
+
+
+class FigureEditor : public QCanvasView {
+public:
+ FigureEditor( GraphWidgetPrivate *g, QWidget* parent=0, const char* name=0, WFlags f=0);
+
+ QSize sizeHint() const;
+
+
+protected:
+ void contentsMousePressEvent(QMouseEvent*);
+ void contentsMouseReleaseEvent(QMouseEvent*);
+ void contentsMouseMoveEvent(QMouseEvent*);
+
+
+ void resizeEvent( QResizeEvent* );
+ void showEvent( QShowEvent* );
+ void hideEvent( QHideEvent* e);
+
+private:
+ void initialize();
+ QPoint moving_start;
+ GraphWidgetPrivate* graph;
+};
+
+
+FigureEditor::FigureEditor(
+ GraphWidgetPrivate* g, QWidget* parent,
+ const char* name, WFlags f) :
+ QCanvasView(g->canvas, parent,name,f)
+{
+ graph = g;
+}
+
+void FigureEditor::contentsMousePressEvent(QMouseEvent* e)
+{
+ QCanvasItemList l=canvas()->collisions(e->pos());
+ for (QCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) {
+ if ((*it)->rtti()==bounce_rtti )
+ continue;
+ graph->moving = *it;
+ moving_start = e->pos();
+ return;
+ }
+ graph->moving = 0;
+}
+
+void FigureEditor::contentsMouseReleaseEvent(QMouseEvent* )
+{
+ if ( graph->moving )
+ graph->moving = 0;
+}
+
+void FigureEditor::contentsMouseMoveEvent(QMouseEvent* e)
+{
+ if ( graph->moving ) {
+ graph->moving->moveBy(e->pos().x() - moving_start.x(),
+ e->pos().y() - moving_start.y());
+ moving_start = e->pos();
+ canvas()->update();
+ }
+}
+
+class BouncyText : public QCanvasText {
+ void initPos();
+ void initSpeed();
+public:
+ int rtti() const;
+ BouncyText(const QString&, QFont, QCanvas*);
+ void advance(int);
+};
+
+BouncyText::BouncyText( const QString& text, QFont f, QCanvas* canvas) :
+ QCanvasText(text, f, canvas)
+{
+ setAnimated(TRUE);
+ initPos();
+}
+
+
+int BouncyText::rtti() const
+{
+ return bounce_rtti;
+}
+
+void BouncyText::initPos()
+{
+ initSpeed();
+ int trial=1000;
+ do {
+ move(rand()%(canvas()->width()-boundingRect().width()),
+ rand()%(canvas()->height()-boundingRect().height()));
+ advance(0);
+ } while (trial-- && xVelocity()==0.0 && yVelocity()==0.0);
+}
+
+void BouncyText::initSpeed()
+{
+ const double speed = 2.0;
+ double d = (double)(rand()%1024) / 1024.0;
+ double e = (double)(rand()%1024) / 1024.0;
+
+ if ( d < .5 )
+ d = -1 - d;
+ else
+ d = d + 1;
+ if ( e < .5 )
+ e = -1 - e;
+ else
+ e = e + 1;
+
+ setVelocity( d*speed, e * speed );
+}
+
+void BouncyText::advance( int stage )
+{
+ switch ( stage ) {
+ case 0: {
+ double vx = xVelocity();
+ double vy = yVelocity();
+
+ if ( vx == 0.0 && vy == 0.0 ) {
+ // stopped last turn
+ initSpeed();
+ vx = xVelocity();
+ vy = yVelocity();
+ }
+
+ QRect r = boundingRect();
+ r.moveBy( int(vx), int(vy) );
+
+ if ( r.left() < 0 || r.right() > canvas()->width() )
+ vx = -vx;
+ if ( r.top() < 0 || r.bottom() > canvas()->height() )
+ vy = -vy;
+
+ r = boundingRect();
+ r.moveBy( int(vx), int(vy) );
+ if ( r.left() < 0 || r.right() > canvas()->width() )
+ vx = 0;
+ if ( r.top() < 0 || r.bottom() > canvas()->height() )
+ vy = 0;
+
+ setVelocity( vx, vy );
+ } break;
+ case 1:
+ QCanvasItem::advance( stage );
+ break;
+ }
+}
+
+GraphWidget::GraphWidget( QWidget *parent, const char *name)
+ : QWidget( parent, name )
+{
+ d = new GraphWidgetPrivate;
+ d->canvas = 0;
+ QVBoxLayout* vb = new QVBoxLayout( this, 11, 6 );
+ d->editor = new FigureEditor( d, this );
+ vb->addWidget( d->editor );
+ QHBoxLayout* hb = new QHBoxLayout( vb );
+ hb->addWidget( new QLabel("Slow", this ) );
+ QSlider* slider = new QSlider( 0, 300, 25, d->speed, Horizontal, this );
+ connect( slider, SIGNAL( valueChanged(int) ), this, SLOT( setSpeed(int) ) );
+ hb->addWidget( slider );
+ hb->addWidget( new QLabel("Fast", this ) );
+ hb->addSpacing( 10 );
+ QPushButton* btn = new QPushButton( "Shuffle Nodes", this );
+ connect( btn, SIGNAL( clicked() ), this, SLOT( shuffle() ) );
+ hb->addWidget( btn );
+}
+
+
+GraphWidget::~GraphWidget()
+{
+ delete d;
+}
+
+void GraphWidget::setSpeed(int s)
+{
+ d->speed = s;
+ if ( isVisible() && d->canvas )
+ d->canvas->setAdvancePeriod( SPEED2ADVANCE( s ) );
+}
+
+void GraphWidget::shuffle()
+{
+
+ for ( NodeItemList::Iterator it = d->nodeItems.begin(); it != d->nodeItems.end(); ++it ) {
+ NodeItem* ni = (*it);
+ ni->move(rand()%(d->canvas->width()-ni->width()),rand()%(d->canvas->height()-ni->height()));
+ }
+}
+
+
+QSize FigureEditor::sizeHint() const
+{
+ return QSize( 600, 400 );
+}
+
+void FigureEditor::resizeEvent( QResizeEvent* e )
+{
+ if ( canvas() )
+ canvas()->resize( contentsRect().width(), contentsRect().height() );
+ QCanvasView::resizeEvent( e );
+}
+
+void FigureEditor::showEvent( QShowEvent* )
+{
+ initialize();
+ canvas()->setAdvancePeriod( SPEED2ADVANCE(graph->speed) );
+}
+
+void FigureEditor::hideEvent( QHideEvent* )
+{
+ initialize();
+ canvas()->setAdvancePeriod( -10 );
+}
+
+void FigureEditor::initialize()
+{
+ if ( canvas() )
+ return;
+ resize( sizeHint() );
+ graph->canvas = new QCanvas( contentsRect().width(), contentsRect().height() );
+ if ( !tb ) tb = new QBrush( Qt::red );
+ if ( !tp ) tp = new QPen( Qt::black );
+ srand( QTime::currentTime().msec() );
+ int nodecount = 0;
+
+ int rows = 3;
+ int cols = 3;
+
+ QMemArray<NodeItem*> lastRow(cols);
+ for ( int r = 0; r < rows; r++ ) {
+ NodeItem *prev = 0;
+ for ( int c = 0; c < cols; c++ ) {
+ NodeItem *ni = new NodeItem( graph );
+ ni->setAnimated( TRUE );
+ nodecount++;
+ ni->move(rand()%(graph->canvas->width()-ni->width()),rand()%(graph->canvas->height()-ni->height()));
+
+ if ( r > 0 )
+ (new EdgeItem( lastRow[c], ni, graph->canvas ))->show();
+ if ( prev )
+ (new EdgeItem( prev, ni, graph->canvas ))->show();
+ prev = ni;
+ lastRow[c] = ni;
+ ni->show();
+ }
+ }
+
+ graph->canvas->advance();
+
+ QCanvasItem* i = new BouncyText( tr( "Drag the nodes around!" ), QFont("helvetica", 24), graph->canvas);
+ i->show();
+ setCanvas( graph->canvas );
+ setMinimumSize( 600, 400 );
+ setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
+}
diff --git a/examples/demo/graph.h b/examples/demo/graph.h
new file mode 100644
index 0000000..10b04d6
--- /dev/null
+++ b/examples/demo/graph.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qwidget.h>
+class QStyle;
+class QListBox;
+class QListBoxItem;
+class QWidgetStack;
+
+class GraphWidgetPrivate;
+
+class GraphWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ GraphWidget( QWidget *parent=0, const char *name=0 );
+ ~GraphWidget();
+
+private slots:
+ void shuffle();
+ void setSpeed(int);
+
+private:
+ GraphWidgetPrivate* d;
+};
diff --git a/examples/demo/i18n/en.po b/examples/demo/i18n/en.po
new file mode 100644
index 0000000..32980ce
--- /dev/null
+++ b/examples/demo/i18n/en.po
@@ -0,0 +1,848 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: none:0
+msgid "--language--"
+msgstr "English"
+
+#: none:0
+msgid "&File"
+msgstr "&File"
+
+#: none:0
+msgid "New"
+msgstr "New"
+
+#: none:0
+msgid "&New..."
+msgstr "&New..."
+
+#: none:0
+msgid "Open"
+msgstr "Open"
+
+#: none:0
+msgid "&Open..."
+msgstr "&Open.."
+
+#: none:0
+msgid "Save As"
+msgstr "Save As"
+
+#: none:0
+msgid "Save &As..."
+msgstr "Save &As..."
+
+#: none:0
+msgid "Save"
+msgstr "Save"
+
+#: none:0
+msgid "&Save..."
+msgstr "&Save..."
+
+#: none:0
+msgid "Print"
+msgstr "Print"
+
+#: none:0
+msgid "&Print..."
+msgstr "&Print..."
+
+#: none:0
+msgid "&Close"
+msgstr "&Close"
+
+#: none:0
+msgid "&Edit"
+msgstr "&Edit"
+
+#: none:0
+msgid "&Undo"
+msgstr "&Undo"
+
+#: none:0
+msgid "Undo"
+msgstr "Undo"
+
+#: none:0
+msgid "&Redo"
+msgstr "&Redo"
+
+#: none:0
+msgid "Redo"
+msgstr "Redo"
+
+#: none:0
+msgid "Cut"
+msgstr "Cut"
+
+#: none:0
+msgid "&Cut"
+msgstr "&Cut"
+
+#: none:0
+msgid "C&opy"
+msgstr "C&opy"
+
+#: none:0
+msgid "Copy"
+msgstr "Copy"
+
+#: none:0
+msgid "Paste"
+msgstr "Paste"
+
+#: none:0
+msgid "&Paste"
+msgstr "&Paste"
+
+#: none:0
+msgid "Clear"
+msgstr "Clear"
+
+#: none:0
+msgid "Select All"
+msgstr "Select All"
+
+#: none:0
+msgid "Line up"
+msgstr "Line up"
+
+#: none:0
+msgid "For&mat"
+msgstr "For&mat"
+
+#: none:0
+msgid "Bold"
+msgstr "Bold"
+
+#: none:0
+msgid "&Bold"
+msgstr "&Bold"
+
+#: none:0
+msgid "Italic"
+msgstr "Italic"
+
+#: none:0
+msgid "&Italic"
+msgstr "&Itatlic"
+
+#: none:0
+msgid "Underline"
+msgstr "Underline"
+
+#: none:0
+msgid "&Underline"
+msgstr "&Underline"
+
+#: none:0
+msgid "Left"
+msgstr "Left"
+
+#: none:0
+msgid "&Left"
+msgstr "&Left"
+
+#: none:0
+msgid "Center"
+msgstr "Center"
+
+#: none:0
+msgid "C&enter"
+msgstr "C&enter"
+
+#: none:0
+msgid "Right"
+msgstr "Right"
+
+#: none:0
+msgid "&Right"
+msgstr "&Right"
+
+#: none:0
+msgid "Justify"
+msgstr "Justify"
+
+#: none:0
+msgid "&Justify"
+msgstr "&Justify"
+
+#: none:0
+msgid "Color"
+msgstr "Color"
+
+#: none:0
+msgid "&Color..."
+msgstr "&Color..."
+
+#: none:0
+msgid "Standard"
+msgstr "Standard"
+
+#: none:0
+msgid "Bullet List (Disc)"
+msgstr "Bullet List (Disc)"
+
+#: none:0
+msgid "Bullet List (Circle)"
+msgstr "Bullet List (Circle)"
+
+#: none:0
+msgid "Bullet List (Square)"
+msgstr "Bullet List (Square)"
+
+#: none:0
+msgid "Ordered List (Decimal)"
+msgstr "Ordered List (Decimal)"
+
+#: none:0
+msgid "Ordered List (Alpha lower)"
+msgstr "(Ordered List (Alpha lower)"
+
+#: none:0
+msgid "Ordered List (Alpha upper)"
+msgstr "Ordered List (Alpha upper)"
+
+#: none:0
+msgid "OK"
+msgstr "OK"
+
+#: none:0
+msgid "Cancel"
+msgstr "Cancel"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"locally connected"
+msgstr ""
+"_: QPrintDialog\n"
+"locally connected"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Aliases: "
+msgstr ""
+"_: QPrintDialog\n"
+"Aliases: "
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"unknown"
+msgstr ""
+"_: QPrintDialog\n"
+"unknown"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Unknown Location"
+msgstr ""
+"_: QPrintDialog\n"
+"Unknown Location"
+
+#: none:0
+msgid "Printer settings"
+msgstr "Printer settings"
+
+#: none:0
+msgid "Print in color if available"
+msgstr "Print in color if available"
+
+#: none:0
+msgid "Print in grayscale"
+msgstr "Print in grayscale"
+
+#: none:0
+msgid "Print destination"
+msgstr "Print destination"
+
+#: none:0
+msgid "Print to printer:"
+msgstr "Print to printer:"
+
+#: none:0
+msgid "Printer"
+msgstr "Printer"
+
+#: none:0
+msgid "Host"
+msgstr "Host"
+
+#: none:0
+msgid "Comment"
+msgstr "Comment"
+
+#: none:0
+msgid "Print to file:"
+msgstr "Print to file:"
+
+#: none:0
+msgid "Browse..."
+msgstr "Browse..."
+
+#: none:0
+msgid "Options"
+msgstr "Options"
+
+#: none:0
+msgid "Print all"
+msgstr "Print all"
+
+#: none:0
+msgid "Print range"
+msgstr "Print range"
+
+#: none:0
+msgid "From page:"
+msgstr "From page:"
+
+#: none:0
+msgid "To page:"
+msgstr "To page:"
+
+#: none:0
+msgid "Print first page first"
+msgstr "Print first page first"
+
+#: none:0
+msgid "Print last page first"
+msgstr "Print last page first"
+
+#: none:0
+msgid "Number of copies:"
+msgstr "Number of copies:""
+
+#: none:0
+msgid "Paper format"
+msgstr "Paper format"
+
+#: none:0
+msgid "Portrait"
+msgstr "Portrait"
+
+#: none:0
+msgid "Landscape"
+msgstr "Landscape"
+
+#: none:0
+msgid "A0 (841 x 1189 mm)"
+msgstr "A0 (841 x 1189 mm)"
+
+#: none:0
+msgid "A1 (594 x 841 mm)"
+msgstr "A1 (594 x 841 mm)"
+
+#: none:0
+msgid "A2 (420 x 594 mm)"
+msgstr "A2 (420 x 594 mm)"
+
+#: none:0
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: none:0
+msgid "A4 (210x297 mm, 8.26x11.7 inches)"
+msgstr "A4 (210x297 mm, 8.26x11.7 inches)"
+
+#: none:0
+msgid "A5 (148 x 210 mm)"
+msgstr "A5 (148 x 210 mm)"
+
+#: none:0
+msgid "A6 (105 x 148 mm)"
+msgstr "A6 (105 x 148 mm)"
+
+#: none:0
+msgid "A7 (74 x 105 mm)"
+msgstr "A7 (74 x 105 mm)"
+
+#: none:0
+msgid "A8 (52 x 74 mm)"
+msgstr "A8 (52 x 74 mm)"
+
+#: none:0
+msgid "A9 (37 x 52 mm)"
+msgstr "A9 (37 x 52 mm)"
+
+#: none:0
+msgid "B0 (1030 x 1456 mm)"
+msgstr "B0 (1030 x 1456 mm)"
+
+#: none:0
+msgid "B1 (728 x 1030 mm)"
+msgstr "B1 (728 x 1030 mm)"
+
+#: none:0
+msgid "B10 (32 x 45 mm)"
+msgstr "B10 (32 x 45 mm)"
+
+#: none:0
+msgid "B2 (515 x 728 mm)"
+msgstr "B2 (515 x 728 mm)"
+
+#: none:0
+msgid "B3 (364 x 515 mm)"
+msgstr "B3 (364 x 515 mm)"
+
+#: none:0
+msgid "B4 (257 x 364 mm)"
+msgstr "B4 (257 x 364 mm)"
+
+#: none:0
+msgid "B5 (182x257 mm, 7.17x10.13 inches)"
+msgstr "B5 (182x257 mm, 7.17x10.13 inches)"
+
+#: none:0
+msgid "B6 (128 x 182 mm)"
+msgstr "B6 (128 x 182 mm)"
+
+#: none:0
+msgid "B7 (91 x 128 mm)"
+msgstr "B7 (91 x 128 mm)"
+
+#: none:0
+msgid "B8 (64 x 91 mm)"
+msgstr "B8 (64 x 91 mm)"
+
+#: none:0
+msgid "B9 (45 x 64 mm)"
+msgstr "B9 (45 x 64 mm)"
+
+#: none:0
+msgid "C5E (163 x 229 mm)"
+msgstr "C5E (163 x 229 mm)"
+
+#: none:0
+msgid "DLE (110 x 220 mm)"
+msgstr "DLE (110 x 220 mm)"
+
+#: none:0
+msgid "Executive (7.5x10 inches, 191x254 mm)"
+msgstr "Executive (7.5x10 inches, 191x254 mm)"
+
+#: none:0
+msgid "Folio (210 x 330 mm)"
+msgstr "Folio (210 x 330 mm)"
+
+#: none:0
+msgid "Ledger (432 x 279 mm)"
+msgstr "Ledger (432 x 279 mm)"
+
+#: none:0
+msgid "Legal (8.5x14 inches, 216x356 mm)"
+msgstr "Legal (8.5x14 inches, 216x356 mm)"
+
+#: none:0
+msgid "Letter (8.5x11 inches, 216x279 mm)"
+msgstr "Letter (8.5x11 inches, 216x279 mm)"
+
+#: none:0
+msgid "Tabloid (279 x 432 mm)"
+msgstr "Tabloid (279 x 432 mm)"
+
+#: none:0
+msgid "US Common #10 Envelope (105 x 241 mm)"
+msgstr "US Common #10 Envelope (105 x 241 mm)"
+
+#: none:0
+msgid "Setup Printer"
+msgstr "Setup Printer"
+
+#: none:0
+msgid "Postscript files (*.ps);;All files (*)"
+msgstr "Postscript files (*.ps);;All files (*)"
+
+#: none:0
+msgid "Hu&e:"
+msgstr "Hu&e:"
+
+#: none:0
+msgid "&Sat:"
+msgstr "&Sat:"
+
+#: none:0
+msgid "&Val:"
+msgstr "&Val:"
+
+#: none:0
+msgid "&Red:"
+msgstr "&Red:"
+
+#: none:0
+msgid "&Green:"
+msgstr "&Green:"
+
+#: none:0
+msgid "Bl&ue:"
+msgstr "Bl&ue:"
+
+#: none:0
+msgid "A&lpha channel:"
+msgstr "A&lpha channel:"
+
+#: none:0
+msgid "&Basic colors"
+msgstr "&Basic colors"
+
+#: none:0
+msgid "&Custom colors"
+msgstr "&Custom colors"
+
+#: none:0
+msgid "&Define Custom Colors >>"
+msgstr "&Define Custom Colors >>"
+
+#: none:0
+msgid "&Add To Custom Colors"
+msgstr "&Add To Custom Colors"
+
+#: none:0
+msgid "Select color"
+msgstr "Select color"
+
+#: none:0
+msgid "Copy or Move a File"
+msgstr "Copy or Move a File"
+
+#: none:0
+msgid "Read: %1"
+msgstr "Read: %1"
+
+#: none:0
+msgid "Write: %1"
+msgstr "Write: %1"
+
+#: none:0
+msgid "&Cancel"
+msgstr "&Cancel"
+
+#: none:0
+msgid "All files (*)"
+msgstr "All files (*)"
+
+#: none:0
+msgid "Name"
+msgstr "Name"
+
+#: none:0
+msgid "Size"
+msgstr "Size"
+
+#: none:0
+msgid "Type"
+msgstr "Type"
+
+#: none:0
+msgid "Date"
+msgstr "Date"
+
+#: none:0
+msgid "Attributes"
+msgstr "Attributes"
+
+#: none:0
+msgid "Look &in:"
+msgstr "Look &in:"
+
+#: none:0
+msgid "File &name:"
+msgstr "File &name:"
+
+#: none:0
+msgid "File &type:"
+msgstr "File &type:"
+
+#: none:0
+msgid "Back"
+msgstr "Back"
+
+#: none:0
+msgid "One directory up"
+msgstr "One directory up"
+
+#: none:0
+msgid "Create New Folder"
+msgstr "Create New Folder"
+
+#: none:0
+msgid "List View"
+msgstr "List View"
+
+#: none:0
+msgid "Detail View"
+msgstr "Detail View"
+
+#: none:0
+msgid "Preview File Info"
+msgstr "Preview File Info"
+
+#: none:0
+msgid "Preview File Contents"
+msgstr "Preview File Contents"
+
+#: none:0
+msgid "Read-write"
+msgstr "Read-write"
+
+#: none:0
+msgid "Read-only"
+msgstr "Read-only"
+
+#: none:0
+msgid "Write-only"
+msgstr "Write-only"
+
+#: none:0
+msgid "Inaccessible"
+msgstr "Inaccessible"
+
+#: none:0
+msgid "Symlink to File"
+msgstr "Symlink to File"
+
+#: none:0
+msgid "Symlink to Directory"
+msgstr "Symlink to Directory"
+
+#: none:0
+msgid "Symlink to Special"
+msgstr "Symlink to Special"
+
+#: none:0
+msgid "File"
+msgstr "File"
+
+#: none:0
+msgid "Dir"
+msgstr "Dir"
+
+#: none:0
+msgid "Special"
+msgstr "Special"
+
+#: none:0
+msgid "Save as"
+msgstr "Save as"
+
+#: none:0
+msgid "&Open"
+msgstr "&Open"
+
+#: none:0
+msgid "&Save"
+msgstr "&Save"
+
+#: none:0
+msgid "&Rename"
+msgstr "&Rename"
+
+#: none:0
+msgid "&Delete"
+msgstr "&Delete"
+
+#: none:0
+msgid "R&eload"
+msgstr "R&eload"
+
+#: none:0
+msgid "Sort by &Name"
+msgstr "Sort by &Name"
+
+#: none:0
+msgid "Sort by &Size"
+msgstr "Sort by &Size"
+
+#: none:0
+msgid "Sort by &Date"
+msgstr "Sort by &Date"
+
+#: none:0
+msgid "&Unsorted"
+msgstr "&Unsorted"
+
+#: none:0
+msgid "Sort"
+msgstr "Sort"
+
+#: none:0
+msgid "Show &hidden files"
+msgstr "Show &hidden files"
+
+#: none:0
+msgid "the file"
+msgstr "the file"
+
+#: none:0
+msgid "the directory"
+msgstr "the directory"
+
+#: none:0
+msgid "the symlink"
+msgstr "the symlink"
+
+#: none:0
+msgid "Delete %1"
+msgstr "Delete %1"
+
+#: none:0
+msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>"
+msgstr "<qt>Do you really want to delete %1 \"%2\"?</qt>"
+
+#: none:0
+msgid "&Yes"
+msgstr "&Yes"
+
+#: none:0
+msgid "&No"
+msgstr "&No"
+
+#: none:0
+msgid "New Folder 1"
+msgstr "New Folder 1"
+
+#: none:0
+msgid "New Folder"
+msgstr "New Folder"
+
+#: none:0
+msgid "New Folder %1"
+msgstr "New Folder %1"
+
+#: none:0
+msgid "Find Directory"
+msgstr "Find Directory"
+
+#: none:0
+msgid "Directories"
+msgstr "Directories"
+
+#: none:0
+msgid "Error"
+msgstr "Error"
+
+#: none:0
+msgid ""
+"%1\n"
+"File not found.\n"
+"Check path and filename."
+msgstr ""
+"%1\n"
+"File not found.\n"
+"Check path and filename."
+
+#: none:0
+msgid "ERROR"
+msgstr "ERROR"
+
+#: none:0
+msgid "&Font"
+msgstr "&Font"
+
+#: none:0
+msgid "Font st&yle"
+msgstr "Font st&yle"
+
+#: none:0
+msgid "&Size"
+msgstr "&Size"
+
+#: none:0
+msgid "Effects"
+msgstr "Effects"
+
+#: none:0
+msgid "Stri&keout"
+msgstr "Stri&keout"
+
+#: none:0
+msgid "&Color"
+msgstr "&Color"
+
+#: none:0
+msgid "Sample"
+msgstr "Sample"
+
+#: none:0
+msgid "Scr&ipt"
+msgstr "Scr&ipt"
+
+#: none:0
+msgid "Apply"
+msgstr "Apply"
+
+#: none:0
+#: none:0
+msgid "Close"
+msgstr "Close"
+
+#: none:0
+msgid "Select Font"
+msgstr "Select Font"
+
+#: none:0
+msgid "&OK"
+msgstr "&OK"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"OK"
+msgstr "OK"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Yes"
+msgstr "Yes"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"No"
+msgstr "No"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Abort"
+msgstr "Abort"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Retry"
+msgstr "Retry"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Ignore"
+msgstr "Ignore"
+
+#: none:0
+msgid ""
+"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI "
+"toolkit from Trolltech. Qt provides single-source portability across Windows "
+"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11"
+".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>"
+msgstr ""
+"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI "
+"toolkit from Trolltech. Qt provides single-source portability across Windows "
+"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11"
+".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>"
+
+#: none:0
+msgid "Minimize"
+msgstr "Minimize"
+
+#: none:0
+msgid "Maximize"
+msgstr "Maximize"
diff --git a/examples/demo/i18n/en.qm b/examples/demo/i18n/en.qm
new file mode 100644
index 0000000..eccc5fd
--- /dev/null
+++ b/examples/demo/i18n/en.qm
Binary files differ
diff --git a/examples/demo/i18n/i18n.cpp b/examples/demo/i18n/i18n.cpp
new file mode 100644
index 0000000..41d866d
--- /dev/null
+++ b/examples/demo/i18n/i18n.cpp
@@ -0,0 +1,253 @@
+#include "i18n.h"
+#include "wrapper.h"
+#include "../textdrawing/textedit.h"
+
+#include <qaction.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qworkspace.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpixmap.h>
+#include <qiconset.h>
+#include <qapplication.h>
+#include <qwidgetlist.h>
+#include <qlabel.h>
+#include <qtextedit.h>
+
+
+static int windowIdNumber = 5000;
+static bool firstShow = TRUE;
+
+
+I18nDemo::I18nDemo(QWidget *parent, const char *name)
+ : QMainWindow(parent, name, 0), lastwrapper(0)
+{
+ initActions();
+ initMenuBar();
+
+ QVBox *box = new QVBox(this);
+ box->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ box->setMargin( 1 );
+ box->setLineWidth( 1 );
+
+ workspace = new QWorkspace(box);
+ connect(workspace, SIGNAL(windowActivated(QWidget *)),
+ SLOT(windowActivated(QWidget *)));
+ workspace->setBackgroundMode(PaletteMid);
+
+ setCentralWidget(box);
+}
+
+
+I18nDemo::~I18nDemo()
+{
+}
+
+
+void I18nDemo::initActions()
+{
+ actionClose = new QAction(tr("Close the current window."),
+ tr("Close"),
+ CTRL + Key_F4,
+ this);
+ connect(actionClose, SIGNAL(activated()), SLOT(closeSlot()));
+
+ actionCloseAll = new QAction(tr("Close all opened windows."),
+ tr("Close All"),
+ 0,
+ this);
+ connect(actionCloseAll, SIGNAL(activated()), SLOT(closeAllSlot()));
+
+ actionTile = new QAction(tr("Tile opened windows."),
+ tr("Tile"),
+ 0,
+ this);
+ connect(actionTile, SIGNAL(activated()), SLOT(tileSlot()));
+
+ actionCascade = new QAction(tr("Cascade opened windows."),
+ tr("Cascade"),
+ 0,
+ this);
+ connect(actionCascade, SIGNAL(activated()), SLOT(cascadeSlot()));
+}
+
+
+void I18nDemo::initMenuBar()
+{
+ newMenu = new QPopupMenu(this);
+ connect(newMenu, SIGNAL(activated(int)), SLOT(newSlot(int)));
+
+ newMenu->insertItem("&English", 0);
+ newMenu->insertItem("&Japanese", 1);
+ newMenu->insertItem("&Korean", 2);
+ newMenu->insertItem("&Norwegian", 3);
+
+ windowMenu = new QPopupMenu(this);
+ connect(windowMenu, SIGNAL(activated(int)), SLOT(windowSlot(int)));
+
+ windowMenu->setCheckable(TRUE);
+
+ actionClose->addTo(windowMenu);
+ actionCloseAll->addTo(windowMenu);
+ windowMenu->insertSeparator();
+ actionTile->addTo(windowMenu);
+ actionCascade->addTo(windowMenu);
+ windowMenu->insertSeparator();
+
+ menuBar()->insertItem(tr("&New"), newMenu);
+ menuBar()->insertItem(tr("&Window"), windowMenu);
+}
+
+
+void I18nDemo::newSlot(int id)
+{
+ QString qmfile;
+ switch (id) {
+ default:
+ case 0: qmfile = "i18n/en.qm"; break;
+ case 1: qmfile = "i18n/ja.qm"; break;
+ case 2: qmfile = "i18n/ko.qm"; break;
+ case 3: qmfile = "i18n/no.qm"; break;
+ }
+
+ if (lastwrapper) {
+ qApp->removeTranslator(&lastwrapper->translator);
+ lastwrapper = 0;
+ }
+
+ Wrapper *wrapper = new Wrapper(workspace, windowIdNumber);
+ wrapper->translator.load(qmfile, ".");
+
+ qApp->installTranslator(&wrapper->translator);
+
+ connect(wrapper, SIGNAL(destroyed()), SLOT(wrapperDead()));
+ wrapper->setCaption(tr("--language--"));
+
+ TextEdit *te = new TextEdit(wrapper);
+ te->layout()->setResizeMode( QLayout::FreeResize );
+ te->setMinimumSize(500, 400);
+ te->fileNew();
+ te->currentEditor()->
+ setText(tr("<h3>About Qt</h3>"
+ "<p>This program uses Qt version %1, a multiplatform C++ "
+ "GUI toolkit from Trolltech. Qt provides single-source "
+ "portability across Windows 95/98/NT/2000, Mac OS X, Linux, Solaris, "
+ "HP-UX and many other versions of Unix with X11.</p>"
+ "<p>See <tt>http://www.trolltech.com/qt/</tt> for more "
+ "information.</p>").arg(QT_VERSION_STR));
+
+ qApp->removeTranslator(&wrapper->translator);
+
+ te->show();
+ wrapper->show();
+
+ windowMenu->insertItem(wrapper->caption(), wrapper->id);
+ windowMenu->setItemChecked(wrapper->id, TRUE);
+ lastwrapper = wrapper;
+
+ windowIdNumber++;
+}
+
+
+void I18nDemo::windowSlot(int id)
+{
+ if (id < 5000)
+ return;
+
+ QWidgetList list = workspace->windowList();
+ Wrapper *wrapper = (Wrapper *) list.first();
+ while (wrapper) {
+ if (wrapper->id == id) {
+ wrapper->setFocus();
+ break;
+ }
+
+ wrapper = (Wrapper *) list.next();
+ }
+}
+
+
+void I18nDemo::windowActivated(QWidget *w)
+{
+ if (lastwrapper) {
+ qApp->removeTranslator(&lastwrapper->translator);
+ windowMenu->setItemChecked(lastwrapper->id, FALSE);
+ }
+
+ if (! w) {
+ lastwrapper = 0;
+ return;
+ }
+
+ Wrapper *wrapper = (Wrapper *) w;
+
+ windowMenu->setItemChecked(wrapper->id, TRUE);
+ lastwrapper = wrapper;
+}
+
+
+void I18nDemo::closeSlot()
+{
+ QWidget *w = workspace->activeWindow();
+ delete w;
+}
+
+
+void I18nDemo::closeAllSlot()
+{
+ QWidget *w;
+ while ((w = workspace->activeWindow()))
+ w->close(TRUE);
+}
+
+
+void I18nDemo::tileSlot()
+{
+ workspace->tile();
+}
+
+
+void I18nDemo::cascadeSlot()
+{
+ workspace->cascade();
+}
+
+
+void I18nDemo::wrapperDead()
+{
+ Wrapper *w = (Wrapper *) sender();
+
+ if (w == lastwrapper) {
+ qApp->removeTranslator(&w->translator);
+ lastwrapper = 0;
+ }
+
+ windowMenu->removeItem(w->id);
+}
+
+
+void I18nDemo::showEvent(QShowEvent *)
+{
+ if (firstShow) {
+ newSlot(1);
+ firstShow = FALSE;
+ return;
+ }
+
+ if (! lastwrapper)
+ return;
+
+ qApp->installTranslator(&lastwrapper->translator);
+}
+
+
+void I18nDemo::hideEvent(QHideEvent *)
+{
+ if (! lastwrapper)
+ return;
+
+ qApp->removeTranslator(&lastwrapper->translator);
+}
diff --git a/examples/demo/i18n/i18n.h b/examples/demo/i18n/i18n.h
new file mode 100644
index 0000000..aca836b
--- /dev/null
+++ b/examples/demo/i18n/i18n.h
@@ -0,0 +1,44 @@
+#ifndef I18N_H
+#define I18N_H
+
+#include <qmainwindow.h>
+
+class QWorkspace;
+class QAction;
+class QPopupMenu;
+class Wrapper;
+
+
+class I18nDemo : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ I18nDemo(QWidget *, const char * = 0);
+ ~I18nDemo();
+
+ void initActions();
+ void initMenuBar();
+
+ void showEvent(QShowEvent *);
+ void hideEvent(QHideEvent *);
+
+ QWorkspace *workspace;
+ QAction *actionClose, *actionCloseAll, *actionTile, *actionCascade;
+ QPopupMenu *windowMenu, *newMenu;
+ Wrapper *lastwrapper;
+
+
+public slots:
+ void newSlot(int);
+ void windowSlot(int);
+ void windowActivated(QWidget *);
+ void closeSlot();
+ void closeAllSlot();
+ void tileSlot();
+ void cascadeSlot();
+ void wrapperDead();
+};
+
+
+#endif // I18N_H
diff --git a/examples/demo/i18n/ja.po b/examples/demo/i18n/ja.po
new file mode 100644
index 0000000..c61d213
--- /dev/null
+++ b/examples/demo/i18n/ja.po
@@ -0,0 +1,847 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: none:0
+msgid "--language--"
+msgstr "日本語"
+
+#: none:0
+msgid "&File"
+msgstr "ファイル (&F)"
+
+#: none:0
+msgid "New"
+msgstr "æ–°è¦"
+
+#: none:0
+msgid "&New..."
+msgstr "æ–°è¦(&N)..."
+
+#: none:0
+msgid "Open"
+msgstr "é–‹ã"
+
+#: none:0
+msgid "&Open..."
+msgstr "é–‹ã(&O)..."
+
+#: none:0
+msgid "Save As"
+msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜"
+
+#: none:0
+msgid "Save &As..."
+msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜(&A)..."
+
+#: none:0
+msgid "Save"
+msgstr "ä¿å­˜"
+
+#: none:0
+msgid "&Save..."
+msgstr "ä¿å­˜(&S)..."
+
+#: none:0
+msgid "Print"
+msgstr "å°åˆ·"
+
+#: none:0
+msgid "&Print..."
+msgstr "å°åˆ·(&P)..."
+
+#: none:0
+msgid "&Close"
+msgstr "é–‰ã˜ã‚‹(&C)"
+
+#: none:0
+msgid "&Edit"
+msgstr "編集(&E)"
+
+#: none:0
+msgid "&Undo"
+msgstr "å…ƒã«æˆ»ã™(&U)"
+
+#: none:0
+msgid "Undo"
+msgstr "å…ƒã«æˆ»ã™"
+
+#: none:0
+msgid "&Redo"
+msgstr "ã‚„ã‚Šç›´ã—(&R)"
+
+#: none:0
+msgid "Redo"
+msgstr "ã‚„ã‚Šç›´ã—"
+
+#: none:0
+msgid "Cut"
+msgstr "切りå–ã‚Š"
+
+#: none:0
+msgid "&Cut"
+msgstr "切りå–ã‚Š(&C)"
+
+#: none:0
+msgid "C&opy"
+msgstr "コピー(&O)"
+
+#: none:0
+msgid "Copy"
+msgstr "コピー"
+
+#: none:0
+msgid "Paste"
+msgstr "貼り付ã‘"
+
+#: none:0
+msgid "&Paste"
+msgstr "貼り付ã‘(&P)"
+
+#: none:0
+msgid "Clear"
+msgstr "クリア"
+
+#: none:0
+msgid "Select All"
+msgstr "å…¨ã¦é¸æŠž"
+
+#: none:0
+msgid "Line up"
+msgstr "ツールãƒãƒ¼ã‚’ラインアップ"
+
+#: none:0
+msgid "For&mat"
+msgstr "フォーマット(&M)"
+
+#: none:0
+msgid "Bold"
+msgstr "ボールド"
+
+#: none:0
+msgid "&Bold"
+msgstr "ボールド(&B)"
+
+#: none:0
+msgid "Italic"
+msgstr "イタリック"
+
+#: none:0
+msgid "&Italic"
+msgstr "イタリック(&I)"
+
+#: none:0
+msgid "Underline"
+msgstr "下線"
+
+#: none:0
+msgid "&Underline"
+msgstr "下線(&U)"
+
+#: none:0
+msgid "Left"
+msgstr "å·¦"
+
+#: none:0
+msgid "&Left"
+msgstr "å·¦(&L)"
+
+#: none:0
+msgid "Center"
+msgstr "中央"
+
+#: none:0
+msgid "C&enter"
+msgstr "中央(&E)"
+
+#: none:0
+msgid "Right"
+msgstr "å³"
+
+#: none:0
+msgid "&Right"
+msgstr "å³(&R)"
+
+#: none:0
+msgid "Justify"
+msgstr "ブロックæƒãˆ"
+
+#: none:0
+msgid "&Justify"
+msgstr "ブロックæƒãˆ(&J)"
+
+#: none:0
+msgid "Color"
+msgstr "色"
+
+#: none:0
+msgid "&Color..."
+msgstr "色(&C)..."
+
+#: none:0
+msgid "Standard"
+msgstr "普通"
+
+#: none:0
+msgid "Bullet List (Disc)"
+msgstr "ビュレットリスト (円 å¡—ã‚Šã¤ã¶ã—)"
+
+#: none:0
+msgid "Bullet List (Circle)"
+msgstr "ビュレットリスト (円)"
+
+#: none:0
+msgid "Bullet List (Square)"
+msgstr "ビュレットリスト (正方形)"
+
+#: none:0
+msgid "Ordered List (Decimal)"
+msgstr "列挙リスト (10進法)"
+
+#: none:0
+msgid "Ordered List (Alpha lower)"
+msgstr "列挙リスト (å°æ–‡å­—ã«)"
+
+#: none:0
+msgid "Ordered List (Alpha upper)"
+msgstr "列挙リスト (大文字ã«)"
+
+#: none:0
+msgid "OK"
+msgstr "ã¯ã„"
+
+#: none:0
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"locally connected"
+msgstr "ローカルã«æŽ¥ç¶šä¸­"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Aliases: "
+msgstr "エイリアス"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"unknown"
+msgstr "未知"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Unknown Location"
+msgstr "未知ã®å ´æ‰€"
+
+#: none:0
+msgid "Printer settings"
+msgstr "プリンターã®è¨­å®š"
+
+#: none:0
+msgid "Print in color if available"
+msgstr "å¯èƒ½ãªã‚‰ã‚«ãƒ©ãƒ¼ã§å°åˆ·"
+
+#: none:0
+msgid "Print in grayscale"
+msgstr "白黒ã§å°åˆ·"
+
+#: none:0
+msgid "Print destination"
+msgstr "å°åˆ·å¯¾è±¡"
+
+#: none:0
+msgid "Print to printer:"
+msgstr "å°åˆ·ã™ã‚‹ãƒ—リンタ:"
+
+#: none:0
+msgid "Printer"
+msgstr "プリンタ"
+
+#: none:0
+msgid "Host"
+msgstr "ホスト"
+
+#: none:0
+msgid "Comment"
+msgstr "コメント"
+
+#: none:0
+msgid "Print to file:"
+msgstr "ファイルã«å‡ºåŠ›:"
+
+#: none:0
+msgid "Browse..."
+msgstr "ブラウズ..."
+
+#: none:0
+msgid "Options"
+msgstr "オプション"
+
+#: none:0
+msgid "Print all"
+msgstr "å…¨ã¦å°åˆ·"
+
+#: none:0
+msgid "Print range"
+msgstr "å°åˆ·ç¯„囲"
+
+#: none:0
+msgid "From page:"
+msgstr "開始ページ:"
+
+#: none:0
+msgid "To page:"
+msgstr "終了ページ:"
+
+#: none:0
+msgid "Print first page first"
+msgstr "最åˆã®ãƒšãƒ¼ã‚¸ã‹ã‚‰å°åˆ·"
+
+#: none:0
+msgid "Print last page first"
+msgstr "最後ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰å°åˆ·"
+
+#: none:0
+msgid "Number of copies:"
+msgstr "コピーã®æ•°:"
+
+#: none:0
+msgid "Paper format"
+msgstr "ページャフォーマット"
+
+#: none:0
+msgid "Portrait"
+msgstr "縦長"
+
+#: none:0
+msgid "Landscape"
+msgstr "横長"
+
+#: none:0
+msgid "A0 (841 x 1189 mm)"
+msgstr "A0 (841 x 1189 mm)"
+
+#: none:0
+msgid "A1 (594 x 841 mm)"
+msgstr "A1 (594 x 841 mm)"
+
+#: none:0
+msgid "A2 (420 x 594 mm)"
+msgstr "A2 (420 x 594 mm)"
+
+#: none:0
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: none:0
+msgid "A4 (210x297 mm, 8.26x11.7 inches)"
+msgstr "A4 (210x297 mm, 8.26x11.7 inch)"
+
+#: none:0
+msgid "A5 (148 x 210 mm)"
+msgstr "A5 (148 x 210 mm)"
+
+#: none:0
+msgid "A6 (105 x 148 mm)"
+msgstr "A6 (105 x 148 mm)"
+
+#: none:0
+msgid "A7 (74 x 105 mm)"
+msgstr "A7 (74 x 105 mm)"
+
+#: none:0
+msgid "A8 (52 x 74 mm)"
+msgstr "A8 (52 x 74 mm)"
+
+#: none:0
+msgid "A9 (37 x 52 mm)"
+msgstr "A9 (37 x 52 mm)"
+
+#: none:0
+msgid "B0 (1030 x 1456 mm)"
+msgstr "B0 (1030 x 1456 mm"
+
+#: none:0
+msgid "B1 (728 x 1030 mm)"
+msgstr "B1 (728 x 1030 mm)"
+
+#: none:0
+msgid "B10 (32 x 45 mm)"
+msgstr "B10 (32 x 45 mm)"
+
+#: none:0
+msgid "B2 (515 x 728 mm)"
+msgstr "B2 (515 x 728 mm)"
+
+#: none:0
+msgid "B3 (364 x 515 mm)"
+msgstr "B3 (364 x 515 mm)"
+
+#: none:0
+msgid "B4 (257 x 364 mm)"
+msgstr "B4 (257 x 364 mm)"
+
+#: none:0
+msgid "B5 (182x257 mm, 7.17x10.13 inches)"
+msgstr "B5 (182x257 mm, 7.17x10.13 inch)"
+
+#: none:0
+msgid "B6 (128 x 182 mm)"
+msgstr "B6 (128 x 182 mm)"
+
+#: none:0
+msgid "B7 (91 x 128 mm)"
+msgstr "B7 (91 x 128 mm)"
+
+#: none:0
+msgid "B8 (64 x 91 mm)"
+msgstr "B8 (64 x 91 mm)"
+
+#: none:0
+msgid "B9 (45 x 64 mm)"
+msgstr "B9 (45 x 64 mm)"
+
+#: none:0
+msgid "C5E (163 x 229 mm)"
+msgstr "C5E (163 x 229 mm)"
+
+#: none:0
+msgid "DLE (110 x 220 mm)"
+msgstr "DLE (110 x 220 mm)"
+
+#: none:0
+msgid "Executive (7.5x10 inches, 191x254 mm)"
+msgstr "Executive (7.5x10 inch, 191x254 mm)"
+
+#: none:0
+msgid "Folio (210 x 330 mm)"
+msgstr "Folio (210 x 330 mm)"
+
+#: none:0
+msgid "Ledger (432 x 279 mm)"
+msgstr "Ledger (432 x 279 mm)"
+
+#: none:0
+msgid "Legal (8.5x14 inches, 216x356 mm)"
+msgstr "Legal (8.5x14 inch, 216x356 mm)"
+
+#: none:0
+msgid "Letter (8.5x11 inches, 216x279 mm)"
+msgstr "Letter (8.5x11 inch, 216x279 mm)"
+
+#: none:0
+msgid "Tabloid (279 x 432 mm)"
+msgstr "タブロイド (279 x 432 mm)"
+
+#: none:0
+msgid "US Common #10 Envelope (105 x 241 mm)"
+msgstr "US 一般 #10 å°ç­’ (105 x 241 mm)"
+
+#: none:0
+msgid "Setup Printer"
+msgstr "プリンタã®è¨­å®š"
+
+#: none:0
+msgid "Postscript files (*.ps);;All files (*)"
+msgstr "Postscript files (*.ps);;All files (*)"
+
+#: none:0
+msgid "Hu&e:"
+msgstr "色調(&e):"
+
+#: none:0
+msgid "&Sat:"
+msgstr "彩度(&S):"
+
+#: none:0
+msgid "&Val:"
+msgstr "値(&V):"
+
+#: none:0
+msgid "&Red:"
+msgstr "赤(&R):"
+
+#: none:0
+msgid "&Green:"
+msgstr "ç·‘(&G):"
+
+#: none:0
+msgid "Bl&ue:"
+msgstr "é’(&u):"
+
+#: none:0
+msgid "A&lpha channel:"
+msgstr "アルファãƒãƒ£ãƒ³ãƒãƒ«(&l):"
+
+#: none:0
+msgid "&Basic colors"
+msgstr "基本色(&B)"
+
+#: none:0
+msgid "&Custom colors"
+msgstr "カスタム色(&C)"
+
+#: none:0
+msgid "&Define Custom Colors >>"
+msgstr "カスタム色を定義(&D) >>"
+
+#: none:0
+msgid "&Add To Custom Colors"
+msgstr "カスタム色ã«è¿½åŠ (&A)"
+
+#: none:0
+msgid "Select color"
+msgstr "色をé¸æŠž"
+
+#: none:0
+msgid "Copy or Move a File"
+msgstr "ファイルをコピーã€ç§»å‹•"
+
+#: none:0
+#, c-format
+msgid "Read: %1"
+msgstr "読ã¿è¾¼ã¿: %1"
+
+#: none:0
+#, c-format
+msgid "Write: %1"
+msgstr "書ãè¾¼ã¿: %1"
+
+#: none:0
+msgid "&Cancel"
+msgstr "キャンセル(&C)"
+
+#: none:0
+msgid "All files (*)"
+msgstr "å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« (*)"
+
+#: none:0
+msgid "Name"
+msgstr "åå‰"
+
+#: none:0
+msgid "Size"
+msgstr "サイズ"
+
+#: none:0
+msgid "Type"
+msgstr "タイプ"
+
+#: none:0
+msgid "Date"
+msgstr "日付"
+
+#: none:0
+msgid "Attributes"
+msgstr "属性"
+
+#: none:0
+msgid "Look &in:"
+msgstr "Look &in:"
+
+#: none:0
+msgid "File &name:"
+msgstr "ファイルå(&n):"
+
+#: none:0
+msgid "File &type:"
+msgstr "ファイルタイプ(&t):"
+
+#: none:0
+msgid "Back"
+msgstr "戻る"
+
+#: none:0
+msgid "One directory up"
+msgstr "ディレクトリを一ã¤ä¸Šã«"
+
+#: none:0
+msgid "Create New Folder"
+msgstr "æ–°ã—ã„フォルダを作æˆ"
+
+#: none:0
+msgid "List View"
+msgstr "リストビュー"
+
+#: none:0
+msgid "Detail View"
+msgstr "詳細ãªãƒ“ュー"
+
+#: none:0
+msgid "Preview File Info"
+msgstr "ファイル情報をプレビュー"
+
+#: none:0
+msgid "Preview File Contents"
+msgstr "ファイルã®ä¸­èº«ã‚’プレビュー"
+
+#: none:0
+msgid "Read-write"
+msgstr "読ã¿è¾¼ã¿ 書ãè¾¼ã¿"
+
+#: none:0
+msgid "Read-only"
+msgstr "読ã¿è¾¼ã¿ã®ã¿"
+
+#: none:0
+msgid "Write-only"
+msgstr "書ãè¾¼ã¿ã®ã¿"
+
+#: none:0
+msgid "Inaccessible"
+msgstr "アクセスä¸å¯"
+
+#: none:0
+msgid "Symlink to File"
+msgstr "ファイルã«ã‚·ãƒ ãƒªãƒ³ã‚¯"
+
+#: none:0
+msgid "Symlink to Directory"
+msgstr "ディレクトリã«ã‚·ãƒ ãƒªãƒ³ã‚¯"
+
+#: none:0
+msgid "Symlink to Special"
+msgstr "特殊ã«ã‚·ãƒ ãƒªãƒ³ã‚¯"
+
+#: none:0
+msgid "File"
+msgstr "ファイル"
+
+#: none:0
+msgid "Dir"
+msgstr "ディレクトリ"
+
+#: none:0
+msgid "Special"
+msgstr "特殊"
+
+#: none:0
+msgid "Save as"
+msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜"
+
+#: none:0
+msgid "&Open"
+msgstr "é–‹ã(&O)"
+
+#: none:0
+msgid "&Save"
+msgstr "ä¿å­˜(&S)"
+
+#: none:0
+msgid "&Rename"
+msgstr "åå‰å¤‰æ›´(&R)"
+
+#: none:0
+msgid "&Delete"
+msgstr "削除(&D)"
+
+#: none:0
+msgid "R&eload"
+msgstr "å†èª­ã¿è¾¼ã¿(&e)"
+
+#: none:0
+msgid "Sort by &Name"
+msgstr "åå‰ã§ã‚½ãƒ¼ãƒˆ(&N)"
+
+#: none:0
+msgid "Sort by &Size"
+msgstr "サイズã§ã‚½ãƒ¼ãƒˆ(&S)"
+
+#: none:0
+msgid "Sort by &Date"
+msgstr "日付ã§ã‚½ãƒ¼ãƒˆ(&D)"
+
+#: none:0
+msgid "&Unsorted"
+msgstr "ソートãªã—(&U)"
+
+#: none:0
+msgid "Sort"
+msgstr "ソート"
+
+#: none:0
+msgid "Show &hidden files"
+msgstr "éš ã—ファイルを表示(&h)"
+
+#: none:0
+msgid "the file"
+msgstr "ファイル"
+
+#: none:0
+msgid "the directory"
+msgstr "ディレクトリ"
+
+#: none:0
+msgid "the symlink"
+msgstr "シムリンク"
+
+#: none:0
+#, c-format
+msgid "Delete %1"
+msgstr "%1 を削除"
+
+#: none:0
+msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>"
+msgstr "<qt>本当㫠%1 \"%2\" を削除ã—ã¾ã™ã‹?</qt>"
+
+#: none:0
+msgid "&Yes"
+msgstr "ã¯ã„(&Y)"
+
+#: none:0
+msgid "&No"
+msgstr "ã„ã„ãˆ(&N)"
+
+#: none:0
+msgid "New Folder 1"
+msgstr "æ–°è¦ãƒ•ã‚©ãƒ«ãƒ€ 1"
+
+#: none:0
+msgid "New Folder"
+msgstr "æ–°è¦ãƒ•ã‚©ãƒ«ãƒ€"
+
+#: none:0
+#, c-format
+msgid "New Folder %1"
+msgstr "æ–°è¦ãƒ•ã‚©ãƒ«ãƒ€ %1"
+
+#: none:0
+msgid "Find Directory"
+msgstr "ディレクトリを検索"
+
+#: none:0
+msgid "Directories"
+msgstr "ディレクトリ"
+
+#: none:0
+msgid "Error"
+msgstr "エラー"
+
+#: none:0
+msgid ""
+"%1\n"
+"File not found.\n"
+"Check path and filename."
+msgstr ""
+"%1\n"
+"ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+"パスã¨ãƒ•ã‚¡ã‚¤ãƒ«åã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ä¸‹ã•ã„。"
+
+#: none:0
+msgid "ERROR"
+msgstr "エラー"
+
+#: none:0
+msgid "&Font"
+msgstr "フォント(&F)"
+
+#: none:0
+msgid "Font st&yle"
+msgstr "フォントスタイル(&y)"
+
+#: none:0
+#: none:0
+msgid "&Size"
+msgstr "サイズ(&S)"
+
+#: none:0
+msgid "Effects"
+msgstr "効果"
+
+#: none:0
+msgid "Stri&keout"
+msgstr "Stri&keout"
+
+#: none:0
+msgid "&Color"
+msgstr "色(&C)"
+
+#: none:0
+msgid "Sample"
+msgstr "例"
+
+#: none:0
+msgid "Scr&ipt"
+msgstr "スクリプト(&i)"
+
+#: none:0
+msgid "Apply"
+msgstr "é©ç”¨"
+
+#: none:0
+#: none:0
+msgid "Close"
+msgstr "é–‰ã˜ã‚‹"
+
+#: none:0
+msgid "Select Font"
+msgstr "フォントをé¸æŠž"
+
+#: none:0
+msgid "&OK"
+msgstr "ã¯ã„(&O)"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"OK"
+msgstr "ã¯ã„"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Yes"
+msgstr "ã¯ã„"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"No"
+msgstr "ã„ã„ãˆ"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Abort"
+msgstr "中止"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Retry"
+msgstr "å†è©¦è¡Œ"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Ignore"
+msgstr "無視"
+
+#: none:0
+msgid ""
+"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI "
+"toolkit from Trolltech. Qt provides single-source portability across Windows "
+"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11"
+".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>"
+msgstr ""
+"<h3>Qt ã«ã¤ã„ã¦</h3><p>ã“ã®ãƒ—ログラム㯠Trolltech社ã®ãƒžãƒ«ãƒ"
+"プラットフォームC++ GUI ツールキットQt ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %1 ã‚’"
+"使用ã—ã¦ã„ã¾ã™ã€‚Qt ã¯Windows 95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX "
+"ä»–X11ã¨Unixã®å¤šãã®ç‰ˆã§ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰äº’æ›ã‚’実ç¾ã—ã¾ã™ã€‚<"
+"/p><p>詳細ã¯<tt>http://www.trolltech.com/qt/</tt>ã‚’å‚ç…§ã—ã¦ãã ã•"
+"ã„。</p>"
+
+#: none:0
+msgid "Minimize"
+msgstr "最å°åŒ–"
+
+#: none:0
+msgid "Maximize"
+msgstr "最大化"
diff --git a/examples/demo/i18n/ja.qm b/examples/demo/i18n/ja.qm
new file mode 100644
index 0000000..788888e
--- /dev/null
+++ b/examples/demo/i18n/ja.qm
Binary files differ
diff --git a/examples/demo/i18n/ko.po b/examples/demo/i18n/ko.po
new file mode 100644
index 0000000..81a3ec7
--- /dev/null
+++ b/examples/demo/i18n/ko.po
@@ -0,0 +1,847 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: none:0
+msgid "--language--"
+msgstr "한국어"
+
+#: none:0
+msgid "&File"
+msgstr "íŒŒì¼ ì°¾ê¸° (&F)"
+
+#: none:0
+msgid "New"
+msgstr "새"
+
+#: none:0
+msgid "&New..."
+msgstr "새 (&N)..."
+
+#: none:0
+msgid "Open"
+msgstr "열기"
+
+#: none:0
+msgid "&Open..."
+msgstr "열기 (&O)..."
+
+#: none:0
+msgid "Save As"
+msgstr "다른 ì´ë¦„으로 저장"
+
+#: none:0
+msgid "Save &As..."
+msgstr "다른 ì´ë¦„으로 저장 (&A)..."
+
+#: none:0
+msgid "Save"
+msgstr "저장"
+
+#: none:0
+msgid "&Save..."
+msgstr "저장 (&S)..."
+
+#: none:0
+msgid "Print"
+msgstr "ì¸ì‡„"
+
+#: none:0
+msgid "&Print..."
+msgstr "ì¸ì‡„ (&P)..."
+
+#: none:0
+msgid "&Close"
+msgstr "닫기 (&C)"
+
+#: none:0
+msgid "&Edit"
+msgstr "편집 (&E)"
+
+#: none:0
+msgid "&Undo"
+msgstr "실행취소 (&U)"
+
+#: none:0
+msgid "Undo"
+msgstr "실행취소"
+
+#: none:0
+msgid "&Redo"
+msgstr "다시 실행 (&R)"
+
+#: none:0
+msgid "Redo"
+msgstr "다시 실행"
+
+#: none:0
+msgid "Cut"
+msgstr "ìžë¥´ê¸°"
+
+#: none:0
+msgid "&Cut"
+msgstr "ìžë¥´ê¸° (&C)"
+
+#: none:0
+msgid "C&opy"
+msgstr "복사 (&O)"
+
+#: none:0
+msgid "Copy"
+msgstr "복사"
+
+#: none:0
+msgid "Paste"
+msgstr "붙여넣기"
+
+#: none:0
+msgid "&Paste"
+msgstr "붙여넣기 (&P)"
+
+#: none:0
+msgid "Clear"
+msgstr "지움"
+
+#: none:0
+msgid "Select All"
+msgstr "ëª¨ë‘ ê³ ë¥´ê¸°"
+
+#: none:0
+msgid "Line up"
+msgstr "ë„구줄 올리기"
+
+#: none:0
+msgid "For&mat"
+msgstr "í˜•ì‹ (&M)"
+
+#: none:0
+msgid "Bold"
+msgstr "볼드"
+
+#: none:0
+msgid "&Bold"
+msgstr "볼드 (&B)"
+
+#: none:0
+msgid "Italic"
+msgstr "ì´íƒ¤ë¦­"
+
+#: none:0
+msgid "&Italic"
+msgstr "ì´íƒ¤ë¦­ (&I)"
+
+#: none:0
+msgid "Underline"
+msgstr "밑줄"
+
+#: none:0
+msgid "&Underline"
+msgstr "밑줄 (&U)"
+
+#: none:0
+msgid "Left"
+msgstr "왼쪽"
+
+#: none:0
+msgid "&Left"
+msgstr "왼쪽 (&L)"
+
+#: none:0
+msgid "Center"
+msgstr "중앙"
+
+#: none:0
+msgid "C&enter"
+msgstr "중앙 (&E)"
+
+#: none:0
+msgid "Right"
+msgstr "오른쪽"
+
+#: none:0
+msgid "&Right"
+msgstr "오른쪽 (&R)"
+
+#: none:0
+msgid "Justify"
+msgstr "ì°½ ë„ˆë¹„ì— ë§žì¶¤"
+
+#: none:0
+msgid "&Justify"
+msgstr "ì°½ ë„ˆë¹„ì— ë§žì¶¤ (&J)"
+
+#: none:0
+msgid "Color"
+msgstr "색ìƒ"
+
+#: none:0
+msgid "&Color..."
+msgstr "ìƒ‰ìƒ (&C)..."
+
+#: none:0
+msgid "Standard"
+msgstr "Standard"
+
+#: none:0
+msgid "Bullet List (Disc)"
+msgstr "Bullet List (Disc)"
+
+#: none:0
+msgid "Bullet List (Circle)"
+msgstr "Bullet List (Circle)"
+
+#: none:0
+msgid "Bullet List (Square)"
+msgstr "Bullet List (Square)"
+
+#: none:0
+msgid "Ordered List (Decimal)"
+msgstr "Ordered List (Decimal)"
+
+#: none:0
+msgid "Ordered List (Alpha lower)"
+msgstr "Ordered List (Alpha lower)"
+
+#: none:0
+msgid "Ordered List (Alpha upper)"
+msgstr "Ordered List (Alpha upper)"
+
+#: none:0
+msgid "OK"
+msgstr "확ì¸"
+
+#: none:0
+msgid "Cancel"
+msgstr "취소"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"locally connected"
+msgstr "로컬로 ì ‘ì†ë¨"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Aliases: "
+msgstr "Aliases: "
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"unknown"
+msgstr "ì•Œ 수 없는 í¬ë§·"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Unknown Location"
+msgstr "Unknown Location"
+
+#: none:0
+msgid "Printer settings"
+msgstr "프린터 설정"
+
+#: none:0
+msgid "Print in color if available"
+msgstr "ë  ìˆ˜ 있으면 ìƒ‰ì„ ê°™ì´ ì¸ì‡„"
+
+#: none:0
+msgid "Print in grayscale"
+msgstr "회색으로 ì¸ì‡„"
+
+#: none:0
+msgid "Print destination"
+msgstr "프린트 대ìƒ"
+
+#: none:0
+msgid "Print to printer:"
+msgstr "프린터로 ì¸ì‡„"
+
+#: none:0
+msgid "Printer"
+msgstr "프린터"
+
+#: none:0
+msgid "Host"
+msgstr "호스트"
+
+#: none:0
+msgid "Comment"
+msgstr "설명"
+
+#: none:0
+msgid "Print to file:"
+msgstr "파ì¼ë¡œ 안쇄"
+
+#: none:0
+msgid "Browse..."
+msgstr "브ë¼ìš°ì¦ˆ..."
+
+#: none:0
+msgid "Options"
+msgstr "옵션"
+
+#: none:0
+msgid "Print all"
+msgstr "ëª¨ë‘ ì¸ì‡„"
+
+#: none:0
+msgid "Print range"
+msgstr "ì¸ì‡„í•  범위"
+
+#: none:0
+msgid "From page:"
+msgstr "쪽ì—ì„œ:"
+
+#: none:0
+msgid "To page:"
+msgstr "쪽까지:"
+
+#: none:0
+msgid "Print first page first"
+msgstr "순서대로 ì¸ì‡„"
+
+#: none:0
+msgid "Print last page first"
+msgstr "역순서로 ì¸ì‡„"
+
+#: none:0
+msgid "Number of copies:"
+msgstr "ì¸ì‡„부수:"
+
+#: none:0
+msgid "Paper format"
+msgstr "용지 í¬ë§·"
+
+#: none:0
+msgid "Portrait"
+msgstr "묘사"
+
+#: none:0
+msgid "Landscape"
+msgstr "í’ê²½"
+
+#: src/dialogs/qprintdialog.cpp:1069
+msgid "A0 (841 x 1189 mm)"
+msgstr "A0 (841 x 1189 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1070
+msgid "A1 (594 x 841 mm)"
+msgstr "A1 (594 x 841 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1071
+msgid "A2 (420 x 594 mm)"
+msgstr "A2 (420 x 594 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1072
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1073
+msgid "A4 (210x297 mm, 8.26x11.7 inches)"
+msgstr "A4 (210x297 mm, 8.26x11.7 inches)"
+
+#: src/dialogs/qprintdialog.cpp:1074
+msgid "A5 (148 x 210 mm)"
+msgstr "A5 (148 x 210 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1075
+msgid "A6 (105 x 148 mm)"
+msgstr "A6 (105 x 148 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1076
+msgid "A7 (74 x 105 mm)"
+msgstr "A7 (74 x 105 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1077
+msgid "A8 (52 x 74 mm)"
+msgstr "A8 (52 x 74 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1078
+msgid "A9 (37 x 52 mm)"
+msgstr "A9 (37 x 52 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1079
+msgid "B0 (1030 x 1456 mm)"
+msgstr "B0 (1030 x 1456 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1080
+msgid "B1 (728 x 1030 mm)"
+msgstr "B1 (728 x 1030 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1081
+msgid "B10 (32 x 45 mm)"
+msgstr "B10 (32 x 45 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1082
+msgid "B2 (515 x 728 mm)"
+msgstr "B2 (515 x 728 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1083
+msgid "B3 (364 x 515 mm)"
+msgstr "B3 (364 x 515 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1084
+msgid "B4 (257 x 364 mm)"
+msgstr "B4 (257 x 364 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1085
+msgid "B5 (182x257 mm, 7.17x10.13 inches)"
+msgstr "B5 (182x257 mm, 7.17x10.13 inches)"
+
+#: src/dialogs/qprintdialog.cpp:1086
+msgid "B6 (128 x 182 mm)"
+msgstr "B6 (128 x 182 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1087
+msgid "B7 (91 x 128 mm)"
+msgstr "B7 (91 x 128 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1088
+msgid "B8 (64 x 91 mm)"
+msgstr "B8 (64 x 91 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1089
+msgid "B9 (45 x 64 mm)"
+msgstr "B9 (45 x 64 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1090
+msgid "C5E (163 x 229 mm)"
+msgstr "C5E (163 x 229 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1091
+msgid "DLE (110 x 220 mm)"
+msgstr "DLE (110 x 220 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1092
+msgid "Executive (7.5x10 inches, 191x254 mm)"
+msgstr "Executive (7.5x10 inches, 191x254 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1094
+msgid "Folio (210 x 330 mm)"
+msgstr "Folio (210 x 330 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1095
+msgid "Ledger (432 x 279 mm)"
+msgstr "Ledger (432 x 279 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1096
+msgid "Legal (8.5x14 inches, 216x356 mm)"
+msgstr "Legal (8.5x14 inches, 216x356 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1097
+msgid "Letter (8.5x11 inches, 216x279 mm)"
+msgstr "Letter (8.5x11 inches, 216x279 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1098
+msgid "Tabloid (279 x 432 mm)"
+msgstr "Tabloid (279 x 432 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1099
+msgid "US Common #10 Envelope (105 x 241 mm)"
+msgstr "US Common #10 Envelope (105 x 241 mm)"
+
+#: none:0
+msgid "Setup Printer"
+msgstr "Setup Printer"
+
+#: none:0
+msgid "Postscript files (*.ps);;All files (*)"
+msgstr "í¬ìŠ¤íŠ¸ìŠ¤í¬ë¦½í™”ì¼ (*.ps);;모든 íŒŒì¼ (*)"
+
+#: none:0
+msgid "Hu&e:"
+msgstr "색ìƒ: (&e)"
+
+#: none:0
+msgid "&Sat:"
+msgstr "시작 (&S)"
+
+#: none:0
+msgid "&Val:"
+msgstr "ê°’ (&V)"
+
+#: none:0
+msgid "&Red:"
+msgstr "ì ìƒ‰: (&R)"
+
+#: none:0
+msgid "&Green:"
+msgstr "녹색:(&G)"
+
+#: none:0
+msgid "Bl&ue:"
+msgstr "청색:(&u)"
+
+#: none:0
+msgid "A&lpha channel:"
+msgstr "알파체ë„:(&l)"
+
+#: none:0
+msgid "&Basic colors"
+msgstr "기본 색ìƒ(&B)"
+
+#: none:0
+msgid "&Custom colors"
+msgstr "ì‚¬ìš©ìž ìƒ‰(&C)"
+
+#: none:0
+msgid "&Define Custom Colors >>"
+msgstr "ì‚¬ìš©ìž ìƒ‰ ì •ì˜ >>(&D)"
+
+#: none:0
+msgid "&Add To Custom Colors"
+msgstr "색 ì •ì˜ì— 추가(&A)"
+
+#: none:0
+msgid "Select color"
+msgstr "색 ì„ íƒ"
+
+#: none:0
+msgid "Copy or Move a File"
+msgstr "íŒŒì¼ ì´ë™/복사"
+
+#: none:0
+msgid "Read: %1"
+msgstr "ì½ê¸°: %1"
+
+#: none:0
+msgid "Write: %1"
+msgstr "쓰기: %1"
+
+#: none:0
+msgid "&Cancel"
+msgstr "취소(&C)"
+
+#: none:0
+msgid "All files (*)"
+msgstr "모든 íŒŒì¼ (*)"
+
+#: none:0
+msgid "Name"
+msgstr "ì´ë¦„"
+
+#: none:0
+msgid "Size"
+msgstr "í¬ê¸°"
+
+#: none:0
+msgid "Type"
+msgstr "형ì‹"
+
+#: none:0
+msgid "Date"
+msgstr "날짜"
+
+#: none:0
+msgid "Attributes"
+msgstr "ì†ì„±"
+
+#: none:0
+msgid "Look &in:"
+msgstr "찾기:(&i)"
+
+#: none:0
+msgid "File &name:"
+msgstr "íŒŒì¼ ì´ë¦„(&n):"
+
+#: none:0
+msgid "File &type:"
+msgstr "íŒŒì¼ í˜•ì‹(&t):"
+
+#: none:0
+msgid "Back"
+msgstr "뒤로"
+
+#: none:0
+msgid "One directory up"
+msgstr "í•œê°œì˜ ë””ë ‰í† ë¦¬"
+
+#: none:0
+msgid "Create New Folder"
+msgstr "새 í´ë” 만들기"
+
+#: none:0
+msgid "List View"
+msgstr "ëª©ë¡ ë³´ê¸°"
+
+#: none:0
+msgid "Detail View"
+msgstr "ìžì„¸ížˆ 보기"
+
+#: none:0
+msgid "Preview File Info"
+msgstr "íŒŒì¼ ì •ë³´ 미리보기"
+
+#: none:0
+msgid "Preview File Contents"
+msgstr "íŒŒì¼ ë‚´ìš© 미리보기"
+
+#: none:0
+msgid "Read-write"
+msgstr "ì½ê¸°-쓰기ì½ê¸° ì „ìš©"
+
+#: none:0
+msgid "Read-only"
+msgstr "ì½ê¸° ì „ìš©"
+
+#: none:0
+msgid "Write-only"
+msgstr "쓰기 전용:"
+
+#: none:0
+msgid "Inaccessible"
+msgstr "접근할 수 없는"
+
+#: none:0
+msgid "Symlink to File"
+msgstr "íŒŒì¼ ì—°ê²°"
+
+#: none:0
+msgid "Symlink to Directory"
+msgstr "-"
+
+#: none:0
+msgid "Symlink to Special"
+msgstr "디렉토리 연결"
+
+#: none:0
+msgid "File"
+msgstr "파ì¼"
+
+#: none:0
+msgid "Dir"
+msgstr "디렉토리"
+
+#: none:0
+msgid "Special"
+msgstr "특정"
+
+#: none:0
+msgid "Save as"
+msgstr "다른 ì´ë¦„으로 저장"
+
+#: none:0
+msgid "&Open"
+msgstr "열기(&O)"
+
+#: none:0
+msgid "&Save"
+msgstr "저장(&S)"
+
+#: none:0
+msgid "&Rename"
+msgstr "ì´ë¦„ 바꾸기(&R)"
+
+#: none:0
+msgid "&Delete"
+msgstr "지우기(&D)"
+
+#: none:0
+msgid "R&eload"
+msgstr "다시 불러오기(&e)"
+
+#: none:0
+msgid "Sort by &Name"
+msgstr "ì´ë¦„으로 ì •ë ¬(&N)"
+
+#: none:0
+msgid "Sort by &Size"
+msgstr "íŒŒì¼ í¬ê¸°ë¡œ ì •ë ¬(&S)"
+
+#: none:0
+msgid "Sort by &Date"
+msgstr "날짜로 정렬(&D)"
+
+#: none:0
+msgid "&Unsorted"
+msgstr "정렬 안함(&U)"
+
+#: none:0
+msgid "Sort"
+msgstr "ì •ë ¬"
+
+#: none:0
+msgid "Show &hidden files"
+msgstr "숨겨진 íŒŒì¼ ë³´ê¸°(&h)"
+
+#: none:0
+msgid "the file"
+msgstr "파ì¼"
+
+#: none:0
+msgid "the directory"
+msgstr "ìžë£Œë°©"
+
+#: none:0
+msgid "the symlink"
+msgstr "ì—°ê²°"
+
+#: none:0
+msgid "Delete %1"
+msgstr "지우기: %1"
+
+#: none:0
+msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>"
+msgstr "<qt>ì •ë§ë¡œ 삭제하시길 ì›í•˜ì‹­ë‹ˆê¹Œ? %1 \"%2\"?</qt>"
+
+#: none:0
+msgid "&Yes"
+msgstr "예(&Y)"
+
+#: none:0
+msgid "&No"
+msgstr "아니오(&N)"
+
+#: none:0
+msgid "New Folder 1"
+msgstr "새í´ë” 1"
+
+#: none:0
+msgid "New Folder"
+msgstr "새 í´ë”"
+
+#: none:0
+msgid "New Folder %1"
+msgstr "새 í´ë” %1"
+
+#: none:0
+msgid "Find Directory"
+msgstr "ìžë£Œë°© 찾기"
+
+#: none:0
+msgid "Directories"
+msgstr "ìžë£Œë°©"
+
+#: none:0
+msgid "Error"
+msgstr "오류"
+
+#: none:0
+msgid ""
+"%1\n"
+"File not found.\n"
+"Check path and filename."
+msgstr ""
+"%1\n"
+"파ì¼ì„ 발견할 수 없습니다.\n"
+"파ì¼ëª…ê³¼ 경로를 확ì¸í•´ 주시길 ë°”ëžë‹ˆë‹¤."
+
+#: none:0
+msgid "ERROR"
+msgstr "오류"
+
+#: none:0
+msgid "&Font"
+msgstr "글꼴(&F)"
+
+#: none:0
+msgid "Font st&yle"
+msgstr "글꼴 스타ì¼(&y)"
+
+#: none:0
+msgid "&Size"
+msgstr "í¬ê¸°(&S)"
+
+#: none:0
+msgid "Effects"
+msgstr "효과"
+
+#: none:0
+msgid "Stri&keout"
+msgstr "삼진(&k)"
+
+#: none:0
+msgid "&Color"
+msgstr "색깔(&C)"
+
+#: none:0
+msgid "Sample"
+msgstr "견본"
+
+#: none:0
+msgid "Scr&ipt"
+msgstr "스í¬ë¦½íŠ¸(&p)"
+
+#: none:0
+msgid "Apply"
+msgstr "ì ìš©"
+
+#: none:0
+#: none:0
+msgid "Close"
+msgstr "닫기"
+
+#: none:0
+msgid "Select Font"
+msgstr "글꼴 고르기"
+
+#: none:0
+msgid "&OK"
+msgstr "예(&O)"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"OK"
+msgstr "확ì¸"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Cancel"
+msgstr "취소"
+
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Yes"
+msgstr "확ì¸"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"No"
+msgstr "취소"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Abort"
+msgstr "중지"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Retry"
+msgstr "재시ë„"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Ignore"
+msgstr "무시"
+
+#: none:0
+msgid "Minimize"
+msgstr "가장 작게"
+
+#: none:0
+msgid "Maximize"
+msgstr "가장 í¬ê²Œ"
+
+#: none:0
+msgid ""
+"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI "
+"toolkit from Trolltech. Qt provides single-source portability across Windows "
+"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11"
+".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>"
+msgstr ""
+"<h3>Qtì— ëŒ€í•˜ì—¬</h3><p>ì´ í”„ë¡œê·¸ëž¨ì€ Qt version %1ì„ ì‚¬ìš©í•©ë‹ˆë‹¤, 트롤í…ì‚¬ì˜ "
+"ë‹¤ì¤‘í”Œë ›í¼ C++ GUI 툴킷.Qt는 윈ë„우즈 95/98/NT/2000, X11ì´ ê°€ëŠ¥í•œ Mac OS X, Linux, "
+"Solaris, HP-UXì—ì´ì „가능한 싱글소스를 제공합니다. </p><p>좀 ë” ë§Žì€ ì •ë³´ë¥¼ "
+"ì›í•˜ì‹œë©´ <tt>http://www.trolltech.com/qt/</tt>ì„방문해 주시길 ë°”ëžë‹ˆë‹¤.</p>"
diff --git a/examples/demo/i18n/ko.qm b/examples/demo/i18n/ko.qm
new file mode 100644
index 0000000..028e8b5
--- /dev/null
+++ b/examples/demo/i18n/ko.qm
Binary files differ
diff --git a/examples/demo/i18n/no.po b/examples/demo/i18n/no.po
new file mode 100644
index 0000000..1aaffb7
--- /dev/null
+++ b/examples/demo/i18n/no.po
@@ -0,0 +1,847 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: none:0
+msgid "--language--"
+msgstr "Norsk"
+
+#: none:0
+msgid "&File"
+msgstr "&Fil"
+
+#: none:0
+msgid "New"
+msgstr "Ny"
+
+#: none:0
+msgid "&New..."
+msgstr "&Ny..."
+
+#: none:0
+msgid "Open"
+msgstr "Ã…pne"
+
+#: none:0
+msgid "&Open..."
+msgstr "&Ã…pne..."
+
+#: none:0
+msgid "Save As"
+msgstr "Lagre som"
+
+#: none:0
+msgid "Save &As..."
+msgstr "L&agre som..."
+
+#: none:0
+msgid "Save"
+msgstr "Lagre"
+
+#: none:0
+msgid "&Save..."
+msgstr "&Lagre..."
+
+#: none:0
+msgid "Print"
+msgstr "Skriv ut"
+
+#: none:0
+msgid "&Print..."
+msgstr "&Skriv ut..."
+
+#: none:0
+msgid "&Close"
+msgstr "Lu&kk"
+
+#: none:0
+msgid "&Edit"
+msgstr "&Rediger"
+
+#: none:0
+msgid "&Undo"
+msgstr "&Angre"
+
+#: none:0
+msgid "Undo"
+msgstr "Angre"
+
+#: none:0
+msgid "&Redo"
+msgstr "&Gjør om"
+
+#: none:0
+msgid "Redo"
+msgstr "Gjør om"
+
+#: none:0
+msgid "Cut"
+msgstr "Klipp ut"
+
+#: none:0
+msgid "&Cut"
+msgstr "&Klipp ut"
+
+#: none:0
+msgid "C&opy"
+msgstr "K&opier"
+
+#: none:0
+msgid "Copy"
+msgstr "Kopier"
+
+#: none:0
+msgid "Paste"
+msgstr "Lim inn"
+
+#: none:0
+msgid "&Paste"
+msgstr "&Lim inn"
+
+#: none:0
+msgid "Clear"
+msgstr "Tøm"
+
+#: none:0
+msgid "Select All"
+msgstr "Velg Alle"
+
+#: none:0
+msgid "Line up"
+msgstr "Ordne"
+
+#: none:0
+msgid "For&mat"
+msgstr "For&mat"
+
+#: none:0
+msgid "Bold"
+msgstr "Uthevet"
+
+#: none:0
+msgid "&Bold"
+msgstr "&Uthevet"
+
+#: none:0
+msgid "Italic"
+msgstr "Kursiv"
+
+#: none:0
+msgid "&Italic"
+msgstr "&Kursiv"
+
+#: none:0
+msgid "Underline"
+msgstr "Understreket"
+
+#: none:0
+msgid "&Underline"
+msgstr "&Understreket"
+
+#: none:0
+msgid "Left"
+msgstr "Venstre"
+
+#: none:0
+msgid "&Left"
+msgstr "&Venstre"
+
+#: none:0
+msgid "Center"
+msgstr "Senter"
+
+#: none:0
+msgid "C&enter"
+msgstr "S&enter"
+
+#: none:0
+msgid "Right"
+msgstr "Høyre"
+
+#: none:0
+msgid "&Right"
+msgstr "&Høyre"
+
+#: none:0
+msgid "Justify"
+msgstr "Justert"
+
+#: none:0
+msgid "&Justify"
+msgstr "&Justert"
+
+#: none:0
+msgid "Color"
+msgstr "Farge"
+
+#: none:0
+msgid "&Color..."
+msgstr "&Farge..."
+
+#: none:0
+msgid "Standard"
+msgstr "Vanlig tekst"
+
+#: none:0
+msgid "Bullet List (Disc)"
+msgstr "Liste (kule)"
+
+#: none:0
+msgid "Bullet List (Circle)"
+msgstr "Liste (sirkel)"
+
+#: none:0
+msgid "Bullet List (Square)"
+msgstr "Liste (firkant)"
+
+#: none:0
+msgid "Ordered List (Decimal)"
+msgstr "Sortert liste (tall)"
+
+#: none:0
+msgid "Ordered List (Alpha lower)"
+msgstr "Sortert liste (små bokstaver)"
+
+#: none:0
+msgid "Ordered List (Alpha upper)"
+msgstr "Sortert liste (store bokstaver)"
+
+#: none:0
+msgid "OK"
+msgstr "OK"
+
+#: none:0
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"locally connected"
+msgstr ""
+"_: QPrintDialog\n"
+"lokalt tilkoblet"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Aliases: "
+msgstr ""
+"_: QPrintDialog\n"
+"Aliaser: "
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"unknown"
+msgstr ""
+"_: QPrintDialog\n"
+"ukjent"
+
+#: none:0
+msgid ""
+"_: QPrintDialog\n"
+"Unknown Location"
+msgstr ""
+"_: QPrintDialog\n"
+"Ukjent sted"
+
+#: none:0
+msgid "Printer settings"
+msgstr "Skriverinnstillinger"
+
+#: none:0
+msgid "Print in color if available"
+msgstr "Skriv ut i farger hvis mulig"
+
+#: none:0
+msgid "Print in grayscale"
+msgstr "Skriv ut i gråtoner"
+
+#: none:0
+msgid "Print destination"
+msgstr "Utskriftsmål"
+
+#: none:0
+msgid "Print to printer:"
+msgstr "Skriv ut til:"
+
+#: none:0
+msgid "Printer"
+msgstr "Skriver"
+
+#: none:0
+msgid "Host"
+msgstr "Vert"
+
+#: none:0
+msgid "Comment"
+msgstr "Kommentar"
+
+#: none:0
+msgid "Print to file:"
+msgstr "Skriv til fil:"
+
+#: none:0
+msgid "Browse..."
+msgstr "Bla gjennom..."
+
+#: none:0
+msgid "Options"
+msgstr "Valg"
+
+#: none:0
+msgid "Print all"
+msgstr "Skriv ut alt"
+
+#: none:0
+msgid "Print range"
+msgstr "Skriv ut i området"
+
+#: none:0
+msgid "From page:"
+msgstr "Fra side:"
+
+#: none:0
+msgid "To page:"
+msgstr "Til side:"
+
+#: none:0
+msgid "Print first page first"
+msgstr "Skriv ut første side først"
+
+#: none:0
+msgid "Print last page first"
+msgstr "Skriv ut siste side først"
+
+#: none:0
+msgid "Number of copies:"
+msgstr "Antall kopier"
+
+#: none:0
+msgid "Paper format"
+msgstr "Papirformat"
+
+#: none:0
+msgid "Portrait"
+msgstr "Stående"
+
+#: none:0
+msgid "Landscape"
+msgstr "Sidelengs"
+
+#: src/dialogs/qprintdialog.cpp:1069
+msgid "A0 (841 x 1189 mm)"
+msgstr "A0 (841 x 1189 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1070
+msgid "A1 (594 x 841 mm)"
+msgstr "A1 (594 x 841 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1071
+msgid "A2 (420 x 594 mm)"
+msgstr "A2 (420 x 594 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1072
+msgid "A3 (297 x 420 mm)"
+msgstr "A3 (297 x 420 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1073
+msgid "A4 (210x297 mm, 8.26x11.7 inches)"
+msgstr "A4 (210x297 mm, 8,26x11,7 tommer)"
+
+#: src/dialogs/qprintdialog.cpp:1074
+msgid "A5 (148 x 210 mm)"
+msgstr "A5 (148 x 210 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1075
+msgid "A6 (105 x 148 mm)"
+msgstr "A6 (105 x 148 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1076
+msgid "A7 (74 x 105 mm)"
+msgstr "A7 (74 x 105 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1077
+msgid "A8 (52 x 74 mm)"
+msgstr "A8 (52 x 74 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1078
+msgid "A9 (37 x 52 mm)"
+msgstr "A9 (37 x 52 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1079
+msgid "B0 (1030 x 1456 mm)"
+msgstr "B0 (1030 x 1456 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1080
+msgid "B1 (728 x 1030 mm)"
+msgstr "B1 (728 x 1030 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1081
+msgid "B10 (32 x 45 mm)"
+msgstr "B10 (32 x 45 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1082
+msgid "B2 (515 x 728 mm)"
+msgstr "B2 (515 x 728 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1083
+msgid "B3 (364 x 515 mm)"
+msgstr "B3 (364 x 515 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1084
+msgid "B4 (257 x 364 mm)"
+msgstr "B4 (257 x 364 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1085
+msgid "B5 (182x257 mm, 7.17x10.13 inches)"
+msgstr "B5 (182x257 mm, 7,17x10,13 tommer)"
+
+#: src/dialogs/qprintdialog.cpp:1086
+msgid "B6 (128 x 182 mm)"
+msgstr "B6 (128 x 182 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1087
+msgid "B7 (91 x 128 mm)"
+msgstr "B7 (91 x 128 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1088
+msgid "B8 (64 x 91 mm)"
+msgstr "B8 (64 x 91 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1089
+msgid "B9 (45 x 64 mm)"
+msgstr "B9 (45 x 64 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1090
+msgid "C5E (163 x 229 mm)"
+msgstr "C5E (163 x 229 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1091
+msgid "DLE (110 x 220 mm)"
+msgstr "DLE (110 x 220 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1092
+msgid "Executive (7.5x10 inches, 191x254 mm)"
+msgstr "Executive (7,5x10 tommer, 191x254 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1094
+msgid "Folio (210 x 330 mm)"
+msgstr "Folio (210 x 330 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1095
+msgid "Ledger (432 x 279 mm)"
+msgstr "Ledger (432 x 279 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1096
+msgid "Legal (8.5x14 inches, 216x356 mm)"
+msgstr "Legal (8,5x14 tommer, 216x356 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1097
+msgid "Letter (8.5x11 inches, 216x279 mm)"
+msgstr "Brev (8.5x11 tommer, 216x279 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1098
+msgid "Tabloid (279 x 432 mm)"
+msgstr "Tabloid (279 x 432 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1099
+msgid "US Common #10 Envelope (105 x 241 mm)"
+msgstr "Standard US-#10-konvolutt (105 x 241 mm)"
+
+#: src/dialogs/qprintdialog.cpp:1123
+msgid "Setup Printer"
+msgstr "Oppsett av skriver"
+
+#: src/dialogs/qprintdialog.cpp:1201
+msgid "Postscript files (*.ps);;All files (*)"
+msgstr "Postskript-filer (*.ps);;Alle filer (*)"
+
+#: none:0
+msgid "Hu&e:"
+msgstr "Hu&e:"
+
+#: none:0
+msgid "&Sat:"
+msgstr "&Sat:"
+
+#: none:0
+msgid "&Val:"
+msgstr "&Val:"
+
+#: none:0
+msgid "&Red:"
+msgstr "&Rød:"
+
+#: none:0
+msgid "&Green:"
+msgstr "&Grønn:"
+
+#: none:0
+msgid "Bl&ue:"
+msgstr "B&lå:"
+
+#: none:0
+msgid "A&lpha channel:"
+msgstr "A&lfakanal:"
+
+#: none:0
+msgid "&Basic colors"
+msgstr "&Standardfarger"
+
+#: none:0
+msgid "&Custom colors"
+msgstr "&Brukerdefinerte farger""
+
+#: none:0
+msgid "&Define Custom Colors >>"
+msgstr "&Definer egne farger >>""
+
+#: none:0
+msgid "&Add To Custom Colors"
+msgstr "&Føy til egendefinerte farger"
+
+#: none:0
+msgid "Select color"
+msgstr "Velg farge"
+
+#: none:0
+msgid "Copy or Move a File"
+msgstr "Kopier eller flytt en fil"
+
+#: none:0
+msgid "Read: %1"
+msgstr "Lese: %1"
+
+#: none:0
+msgid "Write: %1"
+msgstr "Skrive: %1"
+
+#: none:0
+msgid "&Cancel"
+msgstr "&Avbryt"
+
+#: none:0
+msgid "All files (*)"
+msgstr "Alle filer (*)"
+
+#: none:0
+msgid "Name"
+msgstr "Navn"
+
+#: none:0
+msgid "Size"
+msgstr "Størrelse"
+
+#: none:0
+msgid "Type"
+msgstr "Type"
+
+#: none:0
+msgid "Date"
+msgstr "Dato"
+
+#: none:0
+msgid "Attributes"
+msgstr "Attributter"
+
+#: none:0
+msgid "Look &in:"
+msgstr "Se &i:"
+
+#: none:0
+msgid "File &name:"
+msgstr "Fil&navn:"
+
+#: none:0
+msgid "File &type:"
+msgstr "Fil&type:"
+
+#: none:0
+msgid "Back"
+msgstr "Tilbake"
+
+#: none:0
+msgid "One directory up"
+msgstr "En katalog opp"
+
+#: none:0
+msgid "Create New Folder"
+msgstr "Lag ny mappe"
+
+#: none:0
+msgid "List View"
+msgstr "Listevisning"
+
+#: none:0
+msgid "Detail View"
+msgstr "Detaljertvisning"
+
+#: none:0
+msgid "Preview File Info"
+msgstr "Forhåndsvis filinformasjon"
+
+#: none:0
+msgid "Preview File Contents"
+msgstr "Forhåndsvis innhold"
+
+#: none:0
+msgid "Read-write"
+msgstr "Lese-skrive"
+
+#: none:0
+msgid "Read-only"
+msgstr "Bare lese"
+
+#: none:0
+msgid "Write-only"
+msgstr "Bare skrive"
+
+#: none:0
+msgid "Inaccessible"
+msgstr "Utilgjenglig"
+
+#: none:0
+msgid "Symlink to File"
+msgstr "Symbolsk lenke til fil"
+
+#: none:0
+msgid "Symlink to Directory"
+msgstr "Symbolsk lenke til katalog"
+
+#: none:0
+msgid "Symlink to Special"
+msgstr "Symbolsk lenke til spesial"
+
+#: none:0
+msgid "File"
+msgstr "Fil"
+
+#: none:0
+msgid "Dir"
+msgstr "Katalog"
+
+#: none:0
+msgid "Special"
+msgstr "Spesial"
+
+#: none:0
+msgid "Save as"
+msgstr "Lagre som""
+
+#: none:0
+msgid "&Open"
+msgstr "&Ã…pne"
+
+#: none:0
+msgid "&Save"
+msgstr "&Lagre"
+
+#: none:0
+msgid "&Rename"
+msgstr "&Endre navn""
+
+#: none:0
+msgid "&Delete"
+msgstr "&Slett"
+
+#: none:0
+msgid "R&eload"
+msgstr "Last &på nytt"
+
+#: none:0
+msgid "Sort by &Name"
+msgstr "Sorter etter &navn"
+
+#: none:0
+msgid "Sort by &Size"
+msgstr "Sorter etter &størrelse"
+
+#: none:0
+msgid "Sort by &Date"
+msgstr "Sorter etter &dato"
+
+#: none:0
+msgid "&Unsorted"
+msgstr "&Usortert"
+
+#: none:0
+msgid "Sort"
+msgstr "Sorter"
+
+#: none:0
+msgid "Show &hidden files"
+msgstr "Vis &skjulte filer"
+
+#: none:0
+msgid "the file"
+msgstr "filen"
+
+#: none:0
+msgid "the directory"
+msgstr "katalogen"
+
+#: none:0
+msgid "the symlink"
+msgstr "den symbolske lenken"
+
+#: none:0
+msgid "Delete %1"
+msgstr "Slett %1"
+
+#: none:0
+msgid "<qt>Do you really want to delete %1 \"%2\"?</qt>"
+msgstr "<qt>Vil du virkelig slette %1 \"%2\"?</qt>"
+
+#: none:0
+msgid "&Yes"
+msgstr "&Ja"
+
+#: none:0
+msgid "&No"
+msgstr "&Nei"
+
+#: none:0
+msgid "New Folder 1"
+msgstr "Ny mappe 1"
+
+#: none:0
+msgid "New Folder"
+msgstr "Ny mappe"
+
+#: none:0
+msgid "New Folder %1"
+msgstr "Ny mappe %1"
+
+#: none:0
+msgid "Find Directory"
+msgstr "Finn katalog"
+
+#: none:0
+msgid "Directories"
+msgstr "Kataloger"
+
+#: none:0
+msgid "Error"
+msgstr "Feil"
+
+#: none:0
+msgid ""
+"%1\n"
+"File not found.\n"
+"Check path and filename."
+msgstr "
+"%1\n"
+"Fil ikke funnet.\n"
+"Sjekk sti og filnavn."
+
+#: none:0
+msgid "ERROR"
+msgstr "FEIL"
+
+#: none:0
+msgid "&Font"
+msgstr "&Skrifttype"
+
+#: none:0
+msgid "Font st&yle"
+msgstr "S&kriftstil"
+
+#: none:0
+msgid "&Size"
+msgstr "&Størrelse"
+
+#: none:0
+msgid "Effects"
+msgstr "Effekter"
+
+#: none:0
+msgid "Stri&keout"
+msgstr "Strek &over"
+
+#: none:0
+msgid "&Color"
+msgstr "&Farge"
+
+#: none:0
+msgid "Sample"
+msgstr "Eksempel"
+
+#: none:0
+msgid "Scr&ipt"
+msgstr "Skr&ipt"
+
+#: none:0
+msgid "Apply"
+msgstr "Bruk"
+
+#: none:0
+msgid "Close"
+msgstr "Lukk"
+
+#: none:0
+msgid "Select Font"
+msgstr "Velg skrifttype"
+
+#: none:0
+msgid "&OK"
+msgstr "&OK"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"OK"
+msgstr "OK"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Yes"
+msgstr "Ja"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"No"
+msgstr "Nei"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Abort"
+msgstr "Avbryt"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Retry"
+msgstr "Prøv igjen"
+
+#: none:0
+msgid ""
+"_: QMessageBox\n"
+"Ignore"
+msgstr "Ignorer"
+
+#: none:0
+msgid ""
+"<h3>About Qt</h3><p>This program uses Qt version %1, a multiplatform C++ GUI "
+"toolkit from Trolltech. Qt provides single-source portability across Windows "
+"95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11"
+".</p><p>See <tt>http://www.trolltech.com/qt/</tt> for more information.</p>"
+msgstr ""
+"<h3>Om Qt</h3><p>Dette programmet bruker Qt versjon %1, et multiplatform C++ "
+"GUI-verktøy fra Trolltech. Kode skrevet for Qt gir portabel kode for Windows 9"
+"5/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX og mange andre versjoner av Unix med X11."
+"</p><p>Se <tt>http://www.trolltech.com/qt/</tt> for mer informasjon.</p>"
+
+#: none:0
+msgid "Minimize"
+msgstr "Minimer"
+
+#: none:0
+msgid "Maximize"
+msgstr "Maksimer"
diff --git a/examples/demo/i18n/no.qm b/examples/demo/i18n/no.qm
new file mode 100644
index 0000000..05482a8
--- /dev/null
+++ b/examples/demo/i18n/no.qm
Binary files differ
diff --git a/examples/demo/i18n/wrapper.h b/examples/demo/i18n/wrapper.h
new file mode 100644
index 0000000..ed5c98b
--- /dev/null
+++ b/examples/demo/i18n/wrapper.h
@@ -0,0 +1,21 @@
+#ifndef WRAPPER_H
+#define WRAPPER_H
+
+#include <qvbox.h>
+#include <qtranslator.h>
+
+
+class Wrapper : public QVBox
+{
+public:
+ Wrapper(QWidget *parent, int i, const char *name = 0)
+ : QVBox(parent, name, WDestructiveClose), translator(this), id(i)
+ {
+ }
+
+ QTranslator translator;
+ int id;
+};
+
+
+#endif // WRAPPER_H
diff --git a/examples/demo/icons.h b/examples/demo/icons.h
new file mode 100644
index 0000000..3217768
--- /dev/null
+++ b/examples/demo/icons.h
@@ -0,0 +1,1938 @@
+/* XPM */
+const char *widgeticon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 64 1",
+" c #e7e7e7",
+". c Gray59",
+"X c #e9d3b7",
+"o c #a79783",
+"O c #968775",
+"+ c #cfbba2",
+"@ c #bbbbbb",
+"# c Gray70",
+"$ c #6f6557",
+"% c #838383",
+"& c #7b7b7b",
+"* c #baa891",
+"= c #837666",
+"- c #a2a2a2",
+"; c #c9b59d",
+": c Gray54",
+"> c Gray67",
+", c Gray42",
+"< c #e4ceb2",
+"1 c #cbcbcb",
+"2 c #f9f9f9",
+"3 c #c1c1c1",
+"4 c #070706",
+"5 c #4a443b",
+"6 c #3c3731",
+"7 c #dac5ab",
+"8 c #dddddd",
+"9 c #d2d2d2",
+"0 c #484848",
+"q c #b6a58f",
+"w c #2c2823",
+"e c #f1f1f1",
+"r c #38332d",
+"t c #555454",
+"y c #665d51",
+"u c #5b5348",
+"i c #433d36",
+"p c #ddc8ad",
+"a c #c0ad96",
+"s c #534b41",
+"d c #d3bfa6",
+"f c #867f76",
+"g c #9e9d9c",
+"h c #d7c3a9",
+"j c #a8a198",
+"k c #e0caaf",
+"l c #312d29",
+"z c #9f8f7c",
+"x c #919090",
+"c c #8e8d8c",
+"v c #7f7263",
+"b c #af9e89",
+"n c #edd7bd",
+"m c #b7b7b6",
+"M c #796d5e",
+"N c #e0cbb2",
+"B c #8d7f6e",
+"V c #252220",
+"C c #191714",
+"Z c #a7a7a7",
+"A c #bdb3a7",
+"S c #afafb0",
+"D c Gray53",
+"F c None",
+/* pixels */
+"FFFFFFFe81S.%,t06li FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"F28@g&t0irr666rrrlV,2FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+">,t005ii50tt,%xg-ZS#mFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"#.,y,&x->m313S-.x%&9SFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"91191@>-gxD&&&&&&&,S@2FFFFFFFFFFFFFFFFFFFFFFFFFF",
+"129-D%DD:ccc:D%%%%,Sm2FFFFFFFFFFFFFFFFFFFFFFFFFF",
+"3e@-.xcc:DDD%%%%%&,mm2FFFFFFFFFFFFFFFFFFFFFFFFFF",
+"3 >.cc::::&&%%%%%&,@#FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"@ Zxcc::D%t0:%%%&&,3#FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"m Zxc:::%,0tc%%%%&,1#FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"# Zxc::D%c05tlw6y&&9SFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"S Zx::DD%:ilrV444V, #FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"Ze-c:DDD%%,$t0lC44V.&@ FFFFFFFFFFFFFFFFFFFFFFFFF",
+"ge-:DDD%%%%O=y5VCwwwwVw8FFFFFFFFFFFFFFFFFFFFFFFF",
+"ge-D%D%%%%&Bbzv$v==$uiCC.2FFFFFFFFFFFFFFFFFFFFFF",
+"g -%%%%D:cxco;*bbbbzvy5l4,eFFFFFFFFFFFFFFFFFFFFF",
+"Z #.g-Z>SS#Sj*;**aaqzB$s6Ct FFFFFFFFFFFFFFFFFFFF",
+"Z81333@@mmm#Sjbob*;+aoB$siCl1FFFFFFF29>1FF89eFFF",
+">89913@@mmSg>S-cfzod+*zBys6C4D8FFFF>t6wV,tC4V,9F",
+"#91 13@@@-t0tS>Z-gDqh+qOMs6V444t3 %5ssirC44CC44g",
+"@93 13@@@,,StcSZZ-%chh;bBys56VC4C665ss5irV44CC44",
+"11@ 13@@@,%3,,SZ--D:jddaoOOvy5wwwlr6i5s5i6lC4444",
+"91# 93@@@,&3&,SZ--c%3Ad;*a;qO$iwwwlr6i555i6wC44C",
+"83S893@m@&t@,,SZ--.&8 q++hph*Bu6rrrr6ii55i6rwC4C",
+"em#983@mm>0tt->Z-g.& F3a7kkd*zvys5i66666ii66rlCC",
+"F>#@8@@mmm>.Z>>ZZ>-&FFFgkkpdaoBvyus5i6666666rlwV",
+"FmSZ83@mmmmm#>-.cD.3FFFmdkkdabO=M$yu5i66rr66rlwl",
+"FeS1 1@@S-.xxg#1 2FFFFF8*Nkh;qoB=M$yusi6rrrrllwl",
+"FF9SZx.Z#1 2FFFFFFFFFFF2jNN7+abzB=M$yysirrrrlwVl",
+"FFFFFFFFFFFFFFFFFFFFFFFFmdNpd;*bzB=vM$yu56rllwVl",
+"FFFFFFFFFFFFFFFFFFFFFFFF q<k7+aqozO=vM$yu56rlwVl",
+"FFFFFFFFFFFFFFFFFFFFFFFFFjkkph+aqbzOBvM$yusirwwl",
+"FFFFFFFFFFFFFFFFFFFFFFFFF1;kk7d;aqozOB=M$yusirwr",
+"FFFFFFFFFFFFFFFFFFFFFFFFF2q7kph+;*bozOB=M$yusirr",
+"FFFFFFFFFFFFFFFFFFFFFFFFF f+kkph+a*bozOB=M$yus5i",
+"FFFFFFFFFFFFFFFFFFFFFF2g,lwopkk7d;a*bozOB=M$yuss",
+"FFFFFFFFFFFFFFFFFFFFFFxM5V4ydkNk7d;a*bozOB=M$yuu",
+"FFFFFFFFFFFFFFFFFFFFF>OBsC4w*k<<k7d;aqbozOB=M$yy",
+"FFFFFFFFFFFFFFFFFFFFeO*z$w44vp<<<k7d;aqbozOB=M$$",
+"FFFFFFFFFFFFFFFFFFFF8b;bB5C4s7<<<<k7d;aqbozOB=MM",
+"FFFFFFFFFFFFFFFFFFFF8*dao$r4id<<XX<k7+;aqbozOB==",
+"FFFFFFFFFFFFFFFFFFFFeb7;qBuVi+<<XXX<k7d;aqbozOBB",
+"FFFFFFFFFFFFFFFFFFFFFgp+;o=5s;N<XXXX<N7d;aqbozOO",
+"FFFFFFFFFFFFFFFFFFFFF1;d+*zM=;k<XXXXX<N7d;aqbozz",
+"FFFFFFFFFFFFFFFFFFFFFFj7+abo*+7<XXXXXXXN7d;a*boo",
+"FFFFFFFFFFFFFFFFFFFFFF@+d;aa;d7<XXXXnnXXN7d;a*bb",
+"FFFFFFFFFFFFFFFFFFFFFF2oh;+;+hp<<XXXnnnnX<pd+a*q",
+"FFFFFFFFFFFFFFFFFFFFFFF@;dhhhpN<XXnnnnnnnnXN7+;;"
+};
+
+/* XPM */
+const char *widgeticon_sel[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 64 1",
+" c #706557",
+". c #818181",
+"X c #100f0e",
+"o c Gray73",
+"O c #797979",
+"+ c #e9d3b7",
+"@ c #c9b59d",
+"# c #cfbba2",
+"$ c #847766",
+"% c Gray91",
+"& c Gray84",
+"* c Gray64",
+"= c #b4b4b4",
+"- c #8b8b8b",
+"; c #baa891",
+": c #e3cdb2",
+"> c Gray42",
+", c #a9a9a9",
+"< c #3b3732",
+"1 c #dac5ab",
+"2 c #4c443b",
+"3 c #c1c1c1",
+"4 c #b7a58f",
+"5 c #2b2823",
+"6 c #9a9a9b",
+"7 c #464646",
+"8 c #cbcbcb",
+"9 c Gray33",
+"0 c #38332c",
+"q c #928472",
+"w c #665d51",
+"e c #929292",
+"r c #9d8d7a",
+"t c #5c5348",
+"y c #aa9985",
+"u c #433d35",
+"i c #ddc8ad",
+"p c #c0ae96",
+"a c #a59581",
+"s c #544b41",
+"d c #d3bfa5",
+"f c #e0caaf",
+"g c #a2927e",
+"h c #847c73",
+"j c #ae9d88",
+"k c #928d86",
+"l c #302d29",
+"z c #796d5e",
+"x c #7f7263",
+"c c #b1a08a",
+"v c #252320",
+"b c #d7c2a8",
+"n c #8c7e6d",
+"m c #968775",
+"M c #dfcab1",
+"N c #1d1b19",
+"B c #a6a099",
+"V c #9e907d",
+"C c #9a8a78",
+"Z c #a79782",
+"A c Gray94",
+"S c #afafaf",
+"D c #868686",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFXXXNvNNXFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFXXXN5l0<<<<00lvlFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"N77777uu7799>.e6*,S=0FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"66>w>Oe*So383S*6eDO&OFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"388&8o,*6eD.O.OO..>SDFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"3A&*DDDD-----DD...>S.FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"*Ao*ee---DDDD.....>=.FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"6%,e------.OD....O>oOFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"6%,e----D.97-D...O>3>FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+".%,e----.>79-..D..>8>FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"O%*e---DD-779l5<wOO&>FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"O%*e--DDD-ul0vXFFv>%9FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"9A*--DDDDD> 97lXFFve7XXFFFFFFFFFFFFFFFFFFFFFFFFF",
+"7A*-DDDDD..m$w2vN5555vXXFFFFFFFFFFFFFFFFFFFFFFFF",
+"<A*DDDD....qcgx x$$ tuNXNFFFFFFFFFFFFFFFFFFFFFFF",
+"l%*.DDDD--eky@;yjjjrxw2lXNFFFFFFFFFFFFFFFFFFFFFF",
+"5%Se6**,SS=SB;@;;pp4gn s<XNXFFFFFFFFFFFFFFFFFFFF",
+"v%8333ooo===SBcyj;p#;an suNXNFFFFFFFFXXXFFXXFFFF",
+"N&&&83ooooS*,S*khVyd#;gnws<NFNXFFFFl<05NXXXFXNXF",
+"X&8%83ooo*979S,,*6D4b#4Czs<NFFFXNX<2ssu0XFFXXFFN",
+"X&3%83oo3>>S9-S,**Dkbb@ynws2<vXXNl<2ss2u0vXXXXFF",
+"X8o%83ooo>.3>>S,**DDhddpamCxw25vvl0<u2s2u<lNXXFF",
+"F3=%83ooo>O3O>S***-ONzd@;p@4q u555l0<u222u<5NXFF",
+"F=S&&3oooO9o>>S***eOXFm##bib;nt<0000<uu22u<05NXF",
+"F6=8&3ooo,799*,***6>FFN;1ffd;Cxw22u<<<<uuuu<0lNF",
+"F9=3&ooo==,6,S,,,,*<FFF2ffidpaqxwts2u<<<<<<<0l5X",
+"FNS*&3ooo==o=,*eO90FFFFXdffdpjC$z wt2u<<00<<0l5N",
+"FF-8%8ooS6.w<NXFFFFFFFFFc:fb@4gq$z wtsu<0000ll5v",
+"FFFN97<NXFFFFFFFFFFFFFFF ::1#pcgq$z wwsu0000l5vN",
+"FFFFFFFFFFFFFFFFFFFFFFFF5d:id@;jVq$xz wt2<0ll5vN",
+"FFFFFFFFFFFFFFFFFFFFFFFFFg:f1#p4yVq$xz wt2<0l5vN",
+"FFFFFFFFFFFFFFFFFFFFFFFFFuffib#p4jgqnxz wt2u055v",
+"FFFFFFFFFFFFFFFFFFFFFFFFFX@ff1d@p4yrmn$z wtsu05v",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFq1fib#@;cZVmn$z wtsu05",
+"FFFFFFFFFFFFFFFFFFFFFFFFFXs#ffib#p;cygmn$z wtsu0",
+"FFFFFFFFFFFFFFFFFFFFFFFXNv5yiff1d@p;cyVmn$z wtsu",
+"FFFFFFFFFFFFFFFFFFFFFFvz2NXwdf:f1d@p;cZVmn$z wt2",
+"FFFFFFFFFFFFFFFFFFFFFXCnsXFv4f::f1d@p4jZrmn$z ws",
+"FFFFFFFFFFFFFFFFFFFFF ;g 5FFxi:::f1d@p4jarmn$z t",
+"FFFFFFFFFFFFFFFFFFFFFZ@cn2XFs1::::f1d@p4jarqn$zw",
+"FFFFFFFFFFFFFFFFFFFFFcdpa 0Fud::++:f1d@p4jarqn$ ",
+"FFFFFFFFFFFFFFFFFFFFF$1@4qtNu#::+++:f1d@p4jarmnz",
+"FFFFFFFFFFFFFFFFFFFFF<i#@y$2s@::++++:M1d@p4jZVm$",
+"FFFFFFFFFFFFFFFFFFFFFX@d#;rz$@f:++++++:1d@p4jZVn",
+"FFFFFFFFFFFFFFFFFFFFFFt1#pcy;#1:+++++++:1d@p;cZm",
+"FFFFFFFFFFFFFFFFFFFFFFX#d@pp@d1:++++++++:1d@p;cV",
+"FFFFFFFFFFFFFFFFFFFFFFF b@#@#bi:+++++++++:id#p;y",
+"FFFFFFFFFFFFFFFFFFFFFFFXcp@@@@#d11iiMMMMMib#@p;a"
+};
+
+/* XPM */
+const char *dbicon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 128 2",
+" c #9b8471",
+". c #c4a48e",
+"X c #ab806c",
+"o c #93918c",
+"O c #6a534a",
+"+ c #9c7d69",
+"@ c #a27d69",
+"# c #b4a69a",
+"$ c #a4816d",
+"% c #6f6d6d",
+"& c #b1826e",
+"* c #91816d",
+"= c #a59687",
+"- c #c5baaf",
+"; c #8e7e6a",
+": c #94816e",
+"> c #a28571",
+", c #e8e7e5",
+"< c #ad4e34",
+"1 c #99806c",
+"2 c Gray99",
+"3 c #393534",
+"4 c #dad9d8",
+"5 c #cbc6c1",
+"6 c #9e816d",
+"7 c #c5937d",
+"8 c #ba8a75",
+"9 c #c8c1ba",
+"0 c #f4f3f2",
+"q c #ab8974",
+"w c #b38672",
+"e c #d6927d",
+"r c #4a6299",
+"t c #d19b85",
+"y c #595754",
+"u c #292828",
+"i c #aa8470",
+"p c #abb9d7",
+"a c #917d6a",
+"s c #8c6856",
+"d c #874c32",
+"f c #7a472d",
+"g c #967d69",
+"h c #b89a86",
+"j c #b98671",
+"k c #915c44",
+"l c #c38974",
+"z c #744a31",
+"x c #a87f6b",
+"c c #b28975",
+"v c #ba937e",
+"b c #9f4c31",
+"n c #52453d",
+"m c #6e462d",
+"M c #9598b1",
+"N c #73758b",
+"B c #907f6c",
+"V c #bbb3ab",
+"C c #7586b4",
+"Z c #897b77",
+"A c #c58d79",
+"S c #bcbcbc",
+"D c #934a30",
+"F c #7c5f51",
+"G c #9b7b67",
+"H c #8e7f6c",
+"J c #bd8d78",
+"K c #8d7966",
+"L c #93715e",
+"P c #cc8e79",
+"I c #e1deda",
+"U c #81472e",
+"Y c #c45035",
+"T c #9f8d7e",
+"R c #85624c",
+"E c #b8836f",
+"W c #926c5b",
+"Q c #bbaca0",
+"! c #647aab",
+"~ c #d0ccc7",
+"^ c #654931",
+"/ c #927864",
+"( c #adabb7",
+") c #8d8477",
+"_ c #423c3a",
+"` c #a79f95",
+"' c #e0a690",
+"] c #a27666",
+"[ c #98624c",
+"{ c #8b7d6a",
+"} c #a58773",
+"| c #d8d4e3",
+" . c #a55941",
+".. c #7e7164",
+"X. c #a27b67",
+"o. c #2f2e2e",
+"O. c #ac8e79",
+"+. c #927b68",
+"@. c #947f74",
+"#. c #d7d4cf",
+"$. c #333130",
+"%. c #947f6c",
+"&. c #181715",
+"*. c #f8f7f7",
+"=. c #af806c",
+"-. c #8d7c68",
+";. c #835941",
+":. c #2d2f34",
+">. c #c98c77",
+",. c #cf907b",
+"<. c #a89180",
+"1. c #ab7a68",
+"2. c #c5c4d8",
+"3. c #9ea4bf",
+"4. c #e49f88",
+"5. c #eeedeb",
+"6. c #8a7564",
+"7. c #817d84",
+"8. c #a05f48",
+"9. c #c08873",
+"0. c #977462",
+"q. c #9b705d",
+"w. c #8b7e6f",
+"e. c #74543d",
+"r. c #98836f",
+"t. c #586997",
+"y. c #8e806c",
+"u. c None",
+/* pixels */
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.*.I 5 Q # = <.<.h # V 5 I *.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.*.#.# > G G X.X.@ @ @ @ X.X.X.+ T Q #.*.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.*.9 T G G + @ @ @ @ @ @ @ @ @ @ @ @ + + G T 9 0 u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.2 5 T G G + + + @ @ @ x x x x x x @ @ @ @ + + G G > - 0 u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.5.` g G G G + @ @ @ @ x x x X X X X x x @ @ @ + + + + G <.I u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u., T g g g + + + @ @ @ x x X X X X X X X x x x @ @ + + + g g g - 2 u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.4 +.g g g + + + @ @ $ x X =.=.=.=.=.=.X X X x x @ @ + + g g g +.# *.u.u.u.u.u.u.u.",
+"u.u.u.u.u.I : +.+.g g g + + 6 $ $ x X =.=.=.=.& & =.X X X X x $ 6 + + 1 g g +.+.` *.u.u.u.u.u.u.",
+"u.u.u.u.0 T +.a a g g g + 1 6 $ $ x X X =.=.& & & =.=.X X x $ $ 6 6 1 1 g g a a -.# 2 u.u.u.u.u.",
+"u.u.u.u.V K a a a a g g 1 1 6 6 $ $ x X =.=.& & & & =.X X x $ $ 6 6 1 1 g g a a a -.- u.u.u.u.u.",
+"u.u.u.#.K -.; a a %.%.%.1 6 6 6 6 $ x X X & & & & & =.X x $ $ 6 6 6 1 1 %.%.a a ; ; -.4 u.u.u.u.",
+"u.u.2 = -.; ; ; a a %.%.1 1 1 6 6 $ $ x X =.& & & & =.X x $ $ 6 6 1 1 1 1 %.a a ; ; -.= *.u.u.u.",
+"u.u.#.-.-.; ; ; B B %.%.1 1 1 1 6 6 $ $ X & w & E w & X $ $ 6 6 1 1 %.%.%.%.B a ; ; ; -.9 u.u.u.",
+"u.u.` -.{ ; ; ; B B B %.%.%.1 1 1 6 $ i $ L R F F s X.i $ 6 6 1 1 %.%.%.%.%.B B ; ; ; ; r.5.u.u.",
+"u.5.y.{ { ; ; ; H B B B B %.%.%.1 1 6 L e.^ m U U m z [ + 6 1 1 %.%.%.B B B B B ; ; ; ; -.9 u.u.",
+"u.~ { { { { ; H B B B B B B B * %.r.W z m D b < Y b U f ;.g 1 %.%.B B B B B B B H ; ; ; ; = 2 u.",
+"u.V { { { ; H H B B B B B B B B * K d m f d < Y Y < d U f k : %.* B B B B B H H H H H ; ; ; I u.",
+"u.` { { { ; H H B H H H B B B B * W U ^ z d d d D D d z ^ d q.* B B B H H H H H H H H H H { 9 u.",
+"u.= ; ; H H H H H y.y.y.y.y.y.y.y.8.U ^ z z n m U ^ m m z f 8.y.H H H H H H H H H H H H H ; Q u.",
+"u.T H H H H H H y.y.y.y.y.y.y.y.y. .U ^ z ^ m f d ^ ^ m ^ m .B y.y.y.y.H H H y.y.y.y.H H H ` u.",
+"u.T y.H H y.y.y.y.y.y.y.y.y.y.y.y.[ D z z m b < Y < z m ^ f .y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.= u.",
+"u.) y.y.y.y.y.y.y.y.y.y.y.B B B * s b U z f d < Y b f z ^ D [ * y.y.y.y.y.y.y.y.y.y.y.y.y.y.= u.",
+"u.w.: B B B B B B B B B * * * * : * ;.b D d d b b D D d D b / * * B B B y.y.B y.y.y.y.y.* * = u.",
+"u.w.: * * * * * * * B * * : : : : / d D b < < < < < < D s r.: : : * * * * * B * * * * * * ` u.",
+"u.o : * * * : : : : * : : : : 1 1 6 > G ;.f D b < b D d s 6 r.1 : : : : : * * * * * * * * * Q u.",
+"u.` -.: : : : : : : : : 1 1 1 1 6 6 $ i i q.R ;.;.;.s X.i $ 6 1 1 1 1 : : : : : : * : : : : 9 u.",
+"u.9 ..r.r.r.: : : : r.w.Z 1 6 6 6 $ $ i & w j E E j j & i $ $ 6 6 1 1 1 1 : : : : r.: : r.r.I u.",
+"u., ..1 r.r.r.r.r.r. @.t.t.Z $ i i i X & & E E E E E & X i $ $ $ 6 6 1 1 1 r.r.r.r.r.r.r.<.*.u.",
+"u.u.o K r. 6 @.t.r 7.6.G w & & & E E E E E & & i i $ $ $ 6 6 6 6 r.r.r.r.r.r.r.9 u.u.",
+"u.u.~ ..6 6 > Z N % :.3 F w j E E E E E E E & & i i $ $ $ 6 6 6 <.5.u.u.",
+"u.u.*.) K } > > > > > > q ..:.u u o.n 0.9.j E E E E E & & & i i $ $ > > > > > > 9 u.u.u.",
+"u.u.u.~ ..6 } } } } } } i q 0.o.u O X.n $.O 1.l j E E E E & & & i i i > > > } > > > > = 0 u.u.u.",
+"u.u.u.u.` 6.> q q q q q i i c R u s J 8 ] n $.F E l E E E & & i i i i i i } } } } } } ~ u.u.u.u.",
+"u.u.u.u., { K q q q q c c w c 8 O o.X.9.9.9.s 3 _ W l j j E w w w w w q q q q q q q h *.u.u.u.u.",
+"u.u.u.u.u.~ K g c c c c c c c 8 j _ n 9.9.9.>.E O $.O =.l 8 j j w w c c c c c q c } 4 u.u.u.u.u.",
+"u.u.u.u.u.u.9 +.1 c J 8 8 8 8 8 A =.3 F >.l l l P 1.O _ F 9.A 8 8 8 8 8 c c c J } 5 u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.9 1 6 q J J J J J A ,.q.u W ,.>.>.>.P P ] n n ] P A J J J 8 J v q - u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.5 > } O.7 7 A A A A ,.O o.1.e >.>.>.>.,.P F $.O j ,.7 A 7 7 O.V u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.I ` q O.v 7 t ,.P ,.,.O 3 9.e ,.,.,.,.,.e 1.3 3 F 7 t v <.~ u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.*.9 O.v v h t t t t ,._ O e e e e e e e 4.] u u _ y o , u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u., V h h h . . . ' v 3 s ' ' ' ' t ' 7 O u o.u u ` u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u., 9 Q . . . . . _ u O > O.> ..n &.&.$.o.o.o.% 4 u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.2 , ~ - - T u u u 3 y y % o 9 y u $.o.o.o.u $.V u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0 % u o.o.o 5.2 u.u.7.u o.u o.3 $.u u S u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u., n u o.o.y % % y 3 o.3 N M 3.( 7._ $.4 u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.4 3 u $.o.o.o.o.o.3 M C t.r ! 2.( 3 y *.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.S u o.$.$.$.$.u % M r r ! ! 3.| 7.u 5 u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.` $._ _ _ _ 3 7.C r t.p p C | ( 3 o u.u.u.u.u."
+};
+
+/* XPM */
+const char *dbicon_sel[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 128 2",
+" c #a3816d",
+". c #2a2929",
+"X c #b1826e",
+"o c #91816d",
+"O c #796a5b",
+"+ c #8e7e6a",
+"@ c #4b433b",
+"# c #94816d",
+"$ c #9d8571",
+"% c #ad4e34",
+"& c #9a816d",
+"* c #a28571",
+"= c #9e816d",
+"- c #0b0b0a",
+"; c #756c73",
+": c #c4937d",
+"> c #3a3633",
+", c #ad816d",
+"< c #ba8a75",
+"1 c #ab8974",
+"2 c #574d44",
+"3 c #cdc9da",
+"4 c #b38672",
+"5 c #876858",
+"6 c #d6927d",
+"7 c #d19984",
+"8 c #aa8570",
+"9 c #917d6a",
+"0 c #a9816d",
+"q c #4b6399",
+"w c #874c32",
+"e c #63574c",
+"r c #7a472d",
+"t c #957d69",
+"y c #b98671",
+"u c #a17d6a",
+"i c #915c44",
+"p c #c38974",
+"a c #9a7d6a",
+"s c #744a31",
+"d c #aa7f6b",
+"f c #b28975",
+"g c #9d7d69",
+"h c #9f4c31",
+"j c #6e462d",
+"k c #b8937e",
+"l c #8491ba",
+"z c #a57e6a",
+"x c #907f6c",
+"c c #c58d79",
+"v c #735749",
+"b c #c5a28c",
+"n c #934a30",
+"m c #6b7397",
+"M c #bd9b85",
+"N c #9a7a66",
+"B c #897b77",
+"V c #8e7f6c",
+"C c #647aa9",
+"Z c #9da9c6",
+"A c #bd8d78",
+"S c #8d7966",
+"D c #817261",
+"F c #93705e",
+"G c #cc8e79",
+"H c #2f2d2c",
+"J c #81472e",
+"K c #353230",
+"L c #c45035",
+"P c #88644d",
+"I c #433c37",
+"U c #927864",
+"Y c #b8836f",
+"T c #8a7361",
+"R c #916958",
+"E c #5a6c98",
+"W c #795e52",
+"Q c #654930",
+"! c #dba993",
+"~ c #43598f",
+"^ c #c5a892",
+"/ c #daa28b",
+"( c #e4a58f",
+") c #a27666",
+"_ c #98624c",
+"` c #8b7d6a",
+"' c #645d52",
+"] c #a55941",
+"[ c #a58773",
+"{ c #a37a66",
+"} c #adaab7",
+"| c #ab8e78",
+" . c #907b68",
+".. c #947f74",
+"X. c #947f6c",
+"o. c #634d45",
+"O. c #232120",
+"+. c #b0806c",
+"@. c #a47a68",
+"#. c #6e6358",
+"$. c #a5806c",
+"%. c #9e7b68",
+"&. c #8d7c68",
+"*. c #835941",
+"=. c #2d2f34",
+"-. c #c98c77",
+";. c #997c68",
+":. c #cf907b",
+">. c #99836f",
+",. c #a27c69",
+"<. c #9c9bab",
+"1. c #31302f",
+"2. c #ab7a68",
+"3. c #e49f88",
+"4. c #987f6c",
+"5. c #967561",
+"6. c #7b5f4a",
+"7. c #9ca1bb",
+"8. c #807c84",
+"9. c #a05f48",
+"0. c #987262",
+"q. c #181816",
+"w. c #96836f",
+"e. c #c08873",
+"r. c #947b68",
+"t. c #9b705d",
+"y. c #8e806c",
+"u. c None",
+/* pixels */
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.- O.I 2 e W O W W e 2 > O.- u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.- . e T %.%.%.,.,.,.,.,.,.,.%.g 5 o.H - u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.- > O N %.%.,.,.u u ,.z z z z ,.,.,.%.%.N 5 I - u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.> O ;.;.g %.g u ,.z z z z z z z z z z u g g ;.;.T @ - u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.q.e r.;.;.;.g u u z z z d d d d d d d z z ,.u g g a a ;.O O.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.q.O r.t ;.a g g u u z z d d d , , , d d d z z u u g g a t t r.@ u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.. D r.r.t t a g u u z $.0 d , , +.+.+., , , d d z u u g a ;.;.t r.e - u.u.u.u.u.u.u.",
+"u.u.u.u.u.O.T .r.r.t t a g = $.0 d , +.+.+.+.+.+., , d d $. = g a a a t 9 .e - u.u.u.u.u.u.",
+"u.u.u.u.- O .9 t t t 4.a a = 0 d , +.+.+.X X +., , d 0 $. = = a a 4.t t 9 .e u.u.u.u.u.u.",
+"u.u.u.u.2 . . .9 9 t t 4.& = = $.0 , , +.X X X +., , d $.$. = = 4.4.4.t 9 9 9 &.2 u.u.u.u.u.",
+"u.u.u.. S &.+ 9 9 X.X.X.4.= = = = $.d , +.X X X +., , 0 $.$.= = = & 4.X.X.9 9 + + &.H u.u.u.u.",
+"u.u.u.#.&.+ + + 9 9 X.X.4.& & = = $.0 , +.X X X +., , $.$. = = 4.4.4.4.X.9 9 + + &.O - u.u.u.",
+"u.u.H &.&.+ + + x x X.X.4.4.4.& = = $., X 4 X Y 4 X 0 $. = = & 4.X.X.X.X.x 9 + + + &.@ u.u.u.",
+"u.u.' &.` + + + x x x X.X.X.4.4.& & 0 $.F P 6.6.R @.8 = & & 4.X.X.X.X.X.x x + + + + D q.u.u.",
+"u.q.D ` ` + + + V x x x x X.X.X.4.4.= F v Q j J J j s _ g = & 4.X.X.X.x x x x x + + + + &.@ u.u.",
+"u.K ` ` ` ` + V x x x x x x x o X.w.F s j n h % L h J r *.;.& X.X.x x x x x x x V + + + + O - u.",
+"u.2 ` ` ` + V V x x x x x x x x o .w j r w % L L % w J r i # X.o x x x x x V V V V V + + + O.u.",
+"u.e ` ` ` + V V x V V V x x x x o R J Q s w w w n n w s Q w t.o x x x V V V V V V V V V V ` @ u.",
+"u.#.+ + V V V V V y.y.y.y.y.y.y.y.9.J Q s s @ j J Q j j s r 9.y.V V V V V V V V V V V V V + e u.",
+"u.O V V V V V V y.y.y.y.y.y.y.y.y.] J Q s Q j r w Q Q j Q j ] x y.y.y.y.V V V y.y.y.y.V V V #.u.",
+"u.O y.V V y.y.y.y.y.y.y.y.y.y.y.y._ n s s j h % L % s j Q r ] y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.O u.",
+"u.O y.y.y.y.y.y.y.y.y.y.y.x x x o 5 h J s r w % L h r s Q n _ o y.y.y.y.y.y.y.y.y.y.y.y.y.y.D u.",
+"u.#.# x x x x x x x x x o o o o # o *.h n w w h h n n w n h U o o x x x y.y.x y.y.y.y.y.o o O u.",
+"u.' # o o o o o o o x o o # # # # >.U w n h % % % % % % n R w.# # # o o o o o x o o o o o o #.u.",
+"u.2 # o o o # # # # o # # # # # & & * N *.r n h % h n w R = & & # # # # # o o o o o o o o o e u.",
+"u.@ &.w.# # # # # # # # & # & & & = 8 , t.P *.*.*.P { 8 = & & & # # # # # # # o # # # # 2 u.",
+"u.1.D >.w.w.w.w.w.w.>.B B & = & = 0 , 4 y Y Y y y X 0 = = & & & # # # # # w.# # w.w.H u.",
+"u.q.O & >.>.>.>.>.>.>...E E B 8 8 0 , X X Y Y Y Y Y X , 0 = & & & & w.w.w.w.w.w.w.T - u.",
+"u.u.e S $ >.>.>.$ $ >.= ..q q 8.T %.4 X X X Y Y Y Y Y X X , 0 = = & & >.>.>.>.>.>.>.2 u.u.",
+"u.u.1.O & $ $ $ $ $ $ = * B m ; =.K W 4 y Y Y Y Y Y Y Y X X , 8 0 = = = $ $ $ $ $ $ t q.u.u.",
+"u.u.- ' S [ $ * * * * * * 8 ; =.. . H @ 0.e.y Y Y Y Y Y X X X , 0 * * * * * $ $ $ $ 2 u.u.u.",
+"u.u.u.H D & [ [ [ [ [ [ 8 1 5.H . v { o.K o.2.p y Y Y Y Y X X X 8 8 8 * * * [ * * * * U - u.u.u.",
+"u.u.u.u.e T * 1 1 1 1 1 8 8 f 5 . 5 A < ) 2 K W Y p Y Y Y X X 8 8 8 8 8 8 8 [ [ [ [ [ I u.u.u.u.",
+"u.u.u.u.q.D S 1 1 1 1 f f 4 f < o.H @.e.e.e.R > I F p y y Y 4 4 4 4 4 1 1 1 1 1 1 1 T - u.u.u.u.",
+"u.u.u.u.u.> S t f f f f f f f < y I @ e.e.e.-.Y v K o.+.p < y y 4 4 f f f f f 1 f [ H u.u.u.u.u.",
+"u.u.u.u.u.u.I .& f A < < < < < c +.> v -.p p p G 2.o.I W e.c < < < < < f f f A [ I u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.> & = 1 A A A A A c :.t.. R :.-.-.-.G G ) @ @ ) G c A A A < A A 1 @ u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.> = [ | : : c c c c :.v H 2.6 -.-.-.-.:.G W 1.e y :.c c : : | 2 u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.O.O 1 | k : 7 :.G :.:.o.> e.6 :.:.:.:.:.6 2.K > 5 : 7 k >.> u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.- @ 1 k k M b 7 7 7 :.I o.6 6 6 6 6 6 6 3.) . . I ' 2 q.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.q.#.k M M b b b ! k > 5 ( ( ( / / ! : v . H . . . u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.q.2 X.M b ^ ^ ^ I . e * | $ >.D 2 - O.1.H H H 1.q.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.q.@ #.$ ` . . . > @ @ I K O.q.O.1.1.H H . H O.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.- 1.. H 1.. - u.u.u.. . H O.1.> K . . O.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.q.H . H H 1.. O.H 1.H > 8.<.7.} 8.I . O.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.O.H . 1.1.1.1.1.H K <.l E q C 3 } > 1.- u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.. . H 1.1.1.1.. #.l ~ q C C Z 3 8.. O.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.H . H H H H . ; E ~ ~ Z Z C 3 <.K H u.u.u.u.u."
+};
+
+/* XPM */
+const char *internicon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 32 1",
+" c #54706a",
+". c #32494f",
+"X c #a5b6b0",
+"o c #1f6796",
+"O c #56758a",
+"+ c #273133",
+"@ c #465450",
+"# c #173547",
+"$ c #5e7968",
+"% c #7192af",
+"& c #6e8c86",
+"* c #112836",
+"= c #688370",
+"- c #2d5161",
+"; c #5885a9",
+": c #134c6e",
+"> c #53605e",
+", c #080f14",
+"< c #656860",
+"1 c #405c65",
+"2 c #2e3f44",
+"3 c #131b21",
+"4 c #44677a",
+"5 c #17425c",
+"6 c #8e9185",
+"7 c #3f4944",
+"8 c #3979a3",
+"9 c #797770",
+"0 c #202527",
+"q c #363936",
+"w c #7e9c93",
+"e c None",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeee%&&OOOO&eeeeeeeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeeeewOO 4OOOO4411..9eeeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeX&OOwwO4OOOO411-.2q2@9eeeeeeeeeeeee",
+"eeeeeeeeeeee;OO%XXwO444411.22.qqq+07eeeeeeeeeeee",
+"eeeeeeeeeewO;%XXX&O4411--..222q2++000>eeeeeeeeee",
+"eeeeeeeee%;;XXXwOO444411-..222qq++00+0qeeeeeeeee",
+"eeeeeeee%;;%%%%OOOOO4411-..22++++0000q3+eeeeeeee",
+"eeeeeee8%;;;%%%OOOOO4>>11-.77q+++003300,3eeeeeee",
+"eeeeee8%%;;;%%;OOOO4>><>>@@77qqq++000000,3eeeeee",
+"eeeee88%%;;%%;;OOO>>>>>>>>@77q+q+0000+033,0eeeee",
+"eeee%8%%%;%%;;OOOO $411>>@777qq++000q2+033,<eeee",
+"eeee88;;;%%;;;OOO4O 4>>>@@7722qqq+++7q++033,eeee",
+"eee8o88;%;;%;OOOO <>@@77777qqqqq++q0q+00,0eee",
+"eeXooo8%;;;;;OO <<>>@@@@7@7qqqqq+077q+q03,9ee",
+"ee;o8;%;8;;;8O4411>>>1@@>@7@77qqqq++q@70+703,0ee",
+"eeoo88888;;&;&44>>><<>>>>@772#22+++q77307q0,,,ee",
+"e%ooo88888;= &$>$>>>@@@.5.2##22+++21+07q0003,@e",
+"e8ooo88888&&44OOO>---.555#5@7##2+++2-.77+00+3,3e",
+"eoooo8oooo4444O4----.---..@@72*22++2.2@q0+000,,e",
+"e8;oooooo8OOO=4-:-:-5->@@@@@.2#22+2.*0q7q++003,e",
+"%88oooooo $&6=$ ::::5:-..@@@@7722+220330000003,>",
+";oooooo8O =&==&$-:::55555@@7@.722+0++000300303,7",
+"8ooooo;w&&&w&&&= 1: 1-:5-@@777.7.++++000300333,+",
+"8oooo8w66=&w&&=$$ =$$ 11@@@@7#22+2+**0000033,,0",
+"8oooo;www&ww= $$ $$$$>-.@@772###****0000033,,0",
+"8oooo&XXXwww= $= $$$$$ .5..77722.+***3++0033,,0",
+";oooo&XXXw&=$$$$$$>$$ $ @5-.777777+***00q0033,,+",
+"%o4O4&66&&&==$$$$1@$$$$ >25.277@77+****0+03033,@",
+"eo4OO&996===$ === $$$ @#5277@7#****00000333,9",
+"eo4ooO=99$$=$==$=$$$$$$ >>.5-772******+000003,,e",
+"e4::::4$ > $=$$$===$$ <>><2-7###****++00003,,3e",
+"e%::::-141>>>> $9999<<>>@<>22#52#***+++0003,3,7e",
+"ee:::::-1111>-199<<9<<@><<@77272******0003333,9e",
+"ee45:::::-11111><<<<>@>><@@q2q7###+++**0333333ee",
+"eee5::::::-111--1>11>-@>@..+227##22+++*033,3,<ee",
+"eee455:5555------1-1>@@@...22222222++**33,,,3eee",
+"eeee5555555555-11-1><<>@..2.2.2.772+**33,,,,&eee",
+"eeee%#555-5555--@@><<<>@-.q2.22222+***3333,7eeee",
+"eeeee1#555--555--@@@>@.7.7q22###2#***3333,,eeeee",
+"eeeeee.#555--555-....@@.7772####*****333,,6eeeee",
+"eeeeeee-##55--55-......77772####*****33,,9eeeeee",
+"eeeeeeee-*##555--....222.772###+****03,,6eeeeeee",
+"eeeeeeeee1####5......2222222#2+*****3,3eeeeeeeee",
+"eeeeeeeeee 2###55.77..2++##222+****3,0eeeeeeeeee",
+"eeeeeeeeeeee@####2.772.+#####+++0033>eeeeeeeeeee",
+"eeeeeeeeeeeeew@###2@@72+**#****330>eeeeeeeeeeeee",
+"eeeeeeeeeeeeeeee>2##++q2#****0+79eeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeeeeeee$>@27722@>eeeeeeeeeeeeeeeeeee"
+};
+
+/* XPM */
+const char *internicon_sel[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 32 1",
+" c #526f6b",
+". c #2d4750",
+"X c #226a98",
+"o c #a7b7ae",
+"O c #293233",
+"+ c #53748a",
+"@ c #44534e",
+"# c #1c3848",
+"$ c #112a39",
+"% c #2e5263",
+"& c #5d7a67",
+"* c #688472",
+"= c #688cae",
+"- c #457fa9",
+"; c #6f9383",
+": c #144c6e",
+"> c #506462",
+", c #0e1419",
+"< c #686c63",
+"1 c #405c65",
+"2 c #313d3f",
+"3 c #151e23",
+"4 c #16425c",
+"5 c #43667d",
+"6 c #617f93",
+"7 c #8f8d7a",
+"8 c #3d4844",
+"9 c #829e9a",
+"0 c #7f7769",
+"q c #212728",
+"w c #575c58",
+"e c None",
+/* pixels */
+"eeeeeeeeeeeeeeeeeee@1 66+6>8eeeeeeeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeeee +6+5+6++5551.2Oeeeeeeeeeeeeeeee",
+"eeeeeeeeeeeee>+6699+5+6++511%.282O3eeeeeeeeeeeee",
+"eeeeeeeeeeee+669oo96555511..282222Oqeeeeeeeeeeee",
+"eeeeeeeeee6669ooo6+5511%%...2222OOqqO3eeeeeeeeee",
+"eeeeeeeee6==ooo96+55551%%..222OOOOqqOq,eeeeeeeee",
+"eeeeeeee6=-=9==6++++551%%...2OOOOqq3qOq3eeeeeeee",
+"eeeeeee-=======6++++5>>11%8882OOqqq33qq3,eeeeeee",
+"eeeeeeX=======6+++5>>>>www@8822OOqq3qqq33,eeeeee",
+"eeeeeX-======66+++>>>>>www@882OOOqqqqOq33,,eeeee",
+"eeee%-=======6++++ <511ww@8882OOOqqq22qq,,,,eeee",
+"eeeeX-=======6+++++ 5>>w@@@82222OOqO82qO33,,eeee",
+"eeeXXX--=-===++++ <w@@@@8882222OOOOqOqq3,3eee",
+"eeeXXX-=--==-++ <<>w@@@@8@82222OqO88OO2q,,eee",
+"ee5X--=------+5511>>>1@@w@8@88222OOq2@8322q3,,ee",
+"eeXXX------666 >>><<wwww@882#22OOO2@23q8Oq,,,ee",
+"e%XXXXX---6* *&><>>>@@@.4.2##.2OOq2@qq82qq3,,3e",
+"e:XXXXX-XX;* 5+++>%%%.444#.@8##2OOO2%288qqqO3,,e",
+"eXXXXXXXXX5555+5%%%1..%%.%@@82$22OO2.2@OqOqq3,,e",
+"eX=XXXXXXX++6*5%:%:%4%w@1@@@.2#.2O2.$q28OOqq3,,e",
+"e--XXXXXX ;7*& ::::4:...@@@@8822O22q33qqqqq33,e",
+"%XXXXXX-+ *;**;&%:::44444@@@@@822OqOO3q33qq33,,,",
+":XXXXX-9;;;;;;;* 1% 1%:4%@@888.82OOOOqqq3qq33,,,",
+"5XXXXX99;**;;**&& +*&&>1>@@@@8#.2O2$$qqqqqq3,,,,",
+"5XXXX-99;;9;* &&> &&&&>..@@@82$##$$33qqqqq3,,,,",
+"1XXXX6ooo99;* &* &&&&&>.4.8@888.2$$$33Oqqq3,,,,",
+"%XXXX6ooo9;*&&&&&&>&& & @4%8888@88O$$$3qOq33,,,,",
+"eX5+5677;;;**&&&&1>&&&& >.4.888@88O$$$qqOq333,,e",
+"eX5++6*07***& &** &&& @#.28@@2$$$$$qqqq33,,,e",
+"e%55X5*00<&&&**&*&&&&&& >>.4%8@2$$$$$qOqqqq3,,,e",
+"e%::::5& > &*&&&**&&& >www#%8#$$$$$$OOqqq3,,,,e",
+"e1:::::1>>>>>> &0000<<www<w2.#.2$$$$OOOq33,,3,,e",
+"ee:::::%1111>%1<0<<0<w@w<<@88282$$$$$qq333,33,ee",
+"ee%::::::%11>11><<<<wwww<w@2228#$##OOqq33333,,ee",
+"eee::::::4%%11%%1>11>%@w@..O228##22OOq333,,3,,ee",
+"eee.44::444%%%%%%1%1>@@@8..22222222OO$33,,,,,eee",
+"eeee4444444444%11%1>www@%8282..8882$$$3,,,,,eeee",
+"eeee$4444.44444%1@wwwww@%828..2222O$$333,,,,eeee",
+"eeeee#4444%%444%%@@@w@8@882..####$$$3333,,,eeeee",
+"eeeeee.4444%%444....8@@8@28###$$$$$$333,,,eeeeee",
+"eeeeeee##444.%44%......8888##$$$$$$$333,,eeeeeee",
+"eeeeeeee###44..%%.......8@82#$#O$$$q33,,eeeeeeee",
+"eeeeeeeee####44.........22.2##O$$$$33,,eeeeeeeee",
+"eeeeeeeeeeO.###4..8@8..OO##222q$$$q33,eeeeeeeeee",
+"eeeeeeeeeeee.#####8@8..O#####OOOqq33,eeeeeeeeeee",
+"eeeeeeeeeeeee2####2@@82$$$$$$$$qq3,eeeeeeeeeeeee",
+"eeeeeeeeeeeeeeeeO##22222#$$$$qq33eeeeeeeeeeeeeee",
+"eeeeeeeeeeeeeeeeeeeqqOO882q33eeeeeeeeeeeeeeeeeee"
+};
+
+
+
+/* XPM */
+const char *texticon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 128 2",
+" c #c1ad96",
+". c #b3a28e",
+"X c #cdc4ba",
+"o c #c6b9ac",
+"O c #aaaaaa",
+"+ c #645a4f",
+"@ c #dddddd",
+"# c #151613",
+"$ c #696054",
+"% c #d3d2d3",
+"& c #4b4c4b",
+"* c #747474",
+"= c #f6f6f6",
+"- c #faf9f9",
+"; c #49433a",
+": c #9a9a9a",
+"> c #948473",
+", c #c9b59c",
+"< c Gray64",
+"1 c #6e6e6d",
+"2 c Gray70",
+"3 c #bcbcbc",
+"4 c #434342",
+"5 c #cccccb",
+"6 c #959595",
+"7 c #597046",
+"8 c Gray52",
+"9 c #38322b",
+"0 c Gray99",
+"q c #5c5248",
+"w c #c6b299",
+"e c Gray95",
+"r c #e4e4e3",
+"t c #a89884",
+"y c #7d7e7d",
+"u c #555555",
+"i c #9a8b79",
+"p c #a39481",
+"a c #eeeeee",
+"s c Gray77",
+"d c #3d3e3d",
+"f c #7d7162",
+"g c #bfac95",
+"h c #74695b",
+"j c #8b7d6c",
+"k c #c1af99",
+"l c #ac9c88",
+"z c #544c42",
+"x c #7a6e60",
+"c c #a3b3a2",
+"v c #d2cac1",
+"b c #087106",
+"n c #c3b098",
+"m c #807464",
+"M c #8b8b8b",
+"N c #c4b29c",
+"B c #b6a692",
+"V c #bda991",
+"C c #232422",
+"Z c #323231",
+"A c #c6b49e",
+"S c #c1c1c0",
+"D c #bead99",
+"F c #94897c",
+"G c #bdab94",
+"H c #443e36",
+"J c #807a72",
+"K c #2d2924",
+"L c #322d27",
+"P c #093809",
+"I c #2c2c2a",
+"U c #e9e9e9",
+"Y c #786c5e",
+"T c #3c3935",
+"R c #626261",
+"E c #877a6a",
+"W c #25201d",
+"Q c #6f6457",
+"! c #a1927f",
+"~ c #c2b19c",
+"^ c #c3ae96",
+"/ c #726658",
+"( c #2b2621",
+") c #d7d5d3",
+"_ c #968776",
+"` c #9e9488",
+"' c #40403f",
+"] c #9e8f7d",
+"[ c #c6b097",
+"{ c #005000",
+"} c #c1ac93",
+"| c #dad8d6",
+" . c #988a78",
+".. c #beb7b1",
+"X. c #bfa991",
+"o. c #bbab96",
+"O. c #272826",
+"+. c #8f8171",
+"@. c #8b7f70",
+"#. c #1b1c1a",
+"$. c #3b362f",
+"%. c #1f211f",
+"&. c #baa892",
+"*. c #cebba3",
+"=. c #6c6862",
+"-. c #847767",
+";. c #dedcd9",
+":. c #363933",
+">. c #ececeb",
+",. c #e6e6e5",
+"<. c #2c7f24",
+"1. c #a0988f",
+"2. c #aa9284",
+"3. c #a9a197",
+"4. c #908677",
+"5. c #b09f8b",
+"6. c #fbfbfb",
+"7. c #b9a58e",
+"8. c #dae1da",
+"9. c #c0b2a2",
+"0. c #484847",
+"q. c #c7c6c6",
+"w. c #b7afa5",
+"e. c #737875",
+"r. c #777777",
+"t. c #7f7e73",
+"y. c Gray0",
+"u. c None",
+/* pixels */
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+": :.& 0.0.0.0.0.& & & 0.0.0.0.0.0.0.& & & & & & & & & & & & & 0.' a u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"1 6 = = = 0 u.u.u.u.u.u.u.u.- = = = - u.u.u.u.u.u.u.u.u.6.- - >.O.% u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"R O u.u.u.5 O : 6 6 6 6 6 : a u.u.u.e : 6 6 6 6 6 : O 5 u.u.u.- :.5 u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u 2 u.@ & u 6 < O O O O O & < u.u.u.q.O.< O O O O < 6 =.0.s u.= d s u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"& s r Z M 0 u.u.u.u.u.u.u.8 < a ,.= s & u.u.u.u.u.u.u.u.2 0.s u.d 3 u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"4 % =.8 u.u.u.u.u.u.u.a 5 1 =.@.> ` 4.J ;.- u.u.u.u.u.u.u.5 :.@ 0.2 u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"d 6 0.- u.u.u.u.u.6.q.+ z z z / .! ! _ E F ..;.- u.u.u.u.u.y 1 u 2 u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"Z ' M u.u.u.u.8.c t.q H 9 L W 9 Y _ t l i E -.E ` ) = u.u.u.,.0.4 O u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"#.d 8 2 3 | 2 :.$.H H K # %.#.C $.Q > t t ] E -.j i B w.) 6.u.& C O u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"I Z y I %.I #.# W ( W L =.1 : U 4 L Q +.i _ > i p 5.V 7.l v 0 8 %.2 u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"e e u.@ u #.#.P b 7 q q 1.y < u.,.I L $ m j l n g n n } v e - 0 u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.= q.y { b <.> h R u : - u.r 0.9 $ f l N w n k [ ^ v - u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.- 4 { b 7 2.Q I d =.O a 5 W q Y ! k w n g g n w X.o = u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.% # b 7 > t H I C O.' R O.z h p ~ A k g g w [ 7.X u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.r.L Q f l _ y y Z O.C O.Z ; x . *.*.n g n w 7.e u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.U L q Y .. s u.@ O 1 Z O.%.O.' $ 4.B , w n n w [ X.X u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.8 9 / _ ..u.u.u.% I K 9 C #.#.%.:.$ .7.w , , [ 7.r u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.>.T q +.D , v = u.% $.#.H + q H C # #.C :.+ @.7., w 9.= u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.2 L Q ] D n 9.r q.( y.L $ m . .$ $.#.# #.C Z $ i 5.X u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.0 y L + j l g &.F z 9 T + h E t N k ] Q T #.# #.O.T q 3 a u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.0 : L q f p g &.i Q q + $ x > 5.N *.*.n _ z I #.# #.d y e u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.L z h @.B . f $ $ $ Q -.! B N A A , w . +.z C & e.e u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.8 u T z $ E ] E Y Q Q / f > t o.N A N n n , , l 4.3.0 u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.O % K ; + x -.m f Y Y m j .5.D A A N g ^ w , V ;.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.3 ( ; + / x f m f f E +.! . k A A n g n } 9.- u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.3 H $.z $ h Y x x m E > p B ~ A A n g ^ X.| u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.3 O.K H q Q h h Y f E _ t B ~ A N k g g ^ ~ = u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.5 4 : & K ; + Q / h Y E i l o.N A N k g g n ^ v u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 0.u.= O K K z + $ Q h -.i l o.N A N G [ >.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 6.u.u.@ 4 #.H q + $ Q m i l o.N N n g G k ^ o 0 u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 - u.u.u.e 8 # K ; z q + m _ 5.D N N k G G n } X u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 - u.u.u.u.0 2 T # 9 ; z + f _ l D N ~ g G g ^ V % u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.r.: u.u.u.S 4 - u.u.u.u.u.u.e M # #.$.; q Y +.l k ~ g g g V a u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.* : u.u.u.S ' - u.u.u.u.u.u.u.u.% R # ( $.q Y _ B N A , , k } X 0 u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.R O u.u.u.5 Z = u.u.u.u.u.u.u.u.u.0 s I # 9 q f i t ! ] ! B G , [ | u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.0 d s u.u.u.r O.a u.u.u.u.u.u.u.u.u.u.u.U 1 # 9 L #.# y.y.y.# ( ; m D = ",
+"u.u.u.u.u.u.u.u.u.u.u.u.3 C e u.u.u.0 & 2 u.u.u.u.u.u.u.u.u.u.u.u.e O.y.y.y.y.y.y.y.y.y.y.y.( S ",
+"u.u.u.u.u.u.u.0 ) q.3 8 ' 2 u.u.u.u.u.| u 8 3 q.) u.u.u.u.u.u.u.u.u.;.#.y.y.y.y.y.y.y.y.y.y.y.T ",
+"u.u.u.u.u.u.u.;.# T ' u 2 ,.@ @ @ @ @ r s R 4 T # S u.u.u.u.u.u.u.u.u.) Z y.y.y.y.y.y.y.y.y.Z q.",
+"u.u.u.u.u.u.u.U 1 1 * y * 1 1 1 1 1 1 1 * y * 1 R % u.u.u.u.u.u.u.u.u.u.e O 1 Z # # # d * S = u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u."
+};
+
+/* XPM */
+const char *texticon_sel[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 128 2",
+" c #5a534a",
+". c Gray35",
+"X c #6a6153",
+"o c Gray77",
+"O c #49443a",
+"+ c #acacac",
+"@ c #9c8d7b",
+"# c Gray71",
+"$ c #645b4f",
+"% c #938573",
+"& c #b3a28d",
+"* c Gray42",
+"= c #cfbaa2",
+"- c #897d6c",
+"; c #979797",
+": c #a59582",
+"> c #554e44",
+", c #aa9a86",
+"< c #cacaca",
+"1 c Gray70",
+"2 c Gray72",
+"3 c #36312b",
+"4 c #e9e9e9",
+"5 c #7d7162",
+"6 c #bfac95",
+"7 c #bebebe",
+"8 c #c9b69e",
+"9 c #727272",
+"0 c #817464",
+"q c Gray55",
+"w c #0b4d09",
+"e c #b5a490",
+"r c #057905",
+"t c #2d2e2d",
+"y c #75695b",
+"u c #1a1c1b",
+"i c Gray23",
+"p c #a4a4a4",
+"a c Gray26",
+"s c gainsboro",
+"d c #c5b39d",
+"f c #0b0b0a",
+"g c #141413",
+"h c Gray47",
+"j c Gray38",
+"k c #222422",
+"l c Gray29",
+"z c #a0917e",
+"x c #2e2a25",
+"c c #c2af98",
+"v c #433e37",
+"b c #bca991",
+"n c #ad9d88",
+"m c #3d3a34",
+"M c #c1af99",
+"N c #312d27",
+"B c #716c64",
+"V c #092708",
+"C c #25221e",
+"Z c #71675a",
+"A c #bcaa94",
+"S c #2e312a",
+"D c #d5d5d5",
+"F c #333332",
+"G c #c4b098",
+"H c #c6b49e",
+"J c #908272",
+"K c Gray1",
+"L c #c2ae97",
+"P c #c6b098",
+"I c Gray50",
+"U c #786d5e",
+"Y c #bead98",
+"T c #baa995",
+"R c #86796a",
+"E c #c0ac95",
+"W c #c8b299",
+"Q c #c0ae96",
+"! c #c5b29b",
+"~ c #c0ad96",
+"^ c #c6b39b",
+"/ c #9e8f7d",
+"( c #9a8b78",
+") c #c5af97",
+"_ c Gray51",
+"` c #cdb69d",
+"' c #50483e",
+"] c #c2b19c",
+"[ c #201e1b",
+"{ c #cab49b",
+"} c #2c2622",
+"| c #c6b199",
+" . c #c4b19a",
+".. c #171918",
+"X. c #262725",
+"o. c #c5b098",
+"O. c #1d1a16",
+"+. c #0b120c",
+"@. c #12100f",
+"#. c #8e806f",
+"$. c #171615",
+"%. c #202220",
+"&. c #282a28",
+"*. c #0e0e0e",
+"=. c #837767",
+"-. c #080706",
+";. c #080908",
+":. c #978676",
+">. c #988977",
+",. c #a0a0a0",
+"<. c #060606",
+"1. c #957e73",
+"2. c #4b813b",
+"3. c #b8a793",
+"4. c #514a42",
+"5. c #2f4a24",
+"6. c #bfb2a3",
+"7. c #6e6456",
+"8. c #a89885",
+"9. c #7e7b79",
+"0. c #676867",
+"q. c #bca792",
+"w. c #817f65",
+"e. c #373835",
+"r. c #3d362f",
+"t. c #8c7e6e",
+"y. c #b0a08b",
+"u. c None",
+/* pixels */
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"0.< 1 2 2 2 2 2 # 1 1 # 2 2 2 2 2 # # # # # # # # # 1 1 1 1 1 < 9 u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"; 0.f f ;.<.u.u.u.u.u.u.u.u.-.;.;.;.K u.u.u.u.u.u.u.u.K <.<.<.. p u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"; . u.u.u...l 0.* * * * * u.u.u.u.g j * * * * * j i f u.u.u.l p u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"p l u.[ ; + q I h h h h h D t u.u.u.j 7 h h h h h I q ,.I ;.u.a + u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"1 i *.o q f u.u.u.u.u.u.u.+ &.K <.u. * u.u.u.u.u.u.u.g ; ; K e.# K u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"2 F ; _ u.u.u.u.u.u.u.K g 9.4. Z > Z > K u.u.u.u.u.u.u.u.q h &.7 <.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"o 9 < f u.u.u.u.u.u.g v > O 0 z : ( 0 X v u <.u.u.u.u.u.*.o j 7 ;.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"< # 9 u.u.u.u.<.+.x ' r.3 x ' R / , : % - t.7.x <.u.u.u.u.q + 2 f u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"s 2 t u.K u.f S O 4.' N g @.<.O. =.z n 8.J R - % 5 m $.K u.l o < *.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"4 2 %.%.X.&.[ C } } } C [ h &.@.C > =.@ / >.#.J / & 6 , y f K s 4 *.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"l a K f k k [ V w O r.O.u.+ k u.g C > 5 - J , b A A c | o.#.@.X.a K u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.<.g u w r 2.1.O X.,.X.u.K ..C 4.Z t.3.^ W Q ~ c G ` J ;.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.K V r r w.:.v F &.[ f u.@.r.$ 5 , ! .c 6 6 ~ | { :.@.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.*.w r 7.z - %.t S F k u 3 0 , ! .L 6 6 6 G | P % f u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.<.+.5.Z R n B e.S &.&.&.S O Z z 8 8 G ~ 6 ~ L | ) ) v u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.g 3 7.5 : 6.[ g k S &.X.X.S > J 3.8 8 c Q ~ G | o.( <.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.K C y / T g u.u.;.e.i &.%.u k F - e | { | | o.P 4.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.f r.7.z 8 U f u.u.a [ O m X.....%.e.$ - & { ` W b u u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.K [ > #.A ` #.u u.F m @.' Z U $ m %...u k F X @ b ` J K u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.;.x $ J y.8 y. F [ -.v X 0 z e : Z 3 u ..u X.m $ ( N u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.<.x > 5 z Y 6 % 7.' ' $ y - , ] = Y J S ....u &.e.t g u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.-.C 4.y :.3.M ( 7. $ X 5 >.& ] 8 = 8 e 5 O %.g &.0.F u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.. 3 ' 7.=.y.: 5 X X X Z - : T d H ^ ! { G : $ O * &.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.+ t ..' $ 0 J R U Z Z U 0 % n Y H H .Q Q ^ ` b & v u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 u u.C ' $ U 0 5 5 U 5 =.t.@ y.Y H H .Q 6 L | | / f u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 t u.<.} O 7.U 5 5 5 0 - % z e ] H d .~ 6 L c | > u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.K [ 3 > X y U U U 0 R % 8.3.] H d c 6 6 L P y.f u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.u a } O 7.Z y U 5 - ( n T d H ! M 6 E c { u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.. . u.$.N ' $ 7.7.Z U t./ y.Y d H ! ~ 6 ~ | c u u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.9 u.u.f C r.> $ X 7.U t.z & Y H d G 6 6 c { R u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.<.$.x O $ $ Z - z y.M d ! M 6 ~ | W x u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.u.K f [ r.O > X R / e ] d ] ~ A ~ | n $.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.u.u.u.<.$.C r.O > X =./ e ] ! L A A ~ W : -.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K 1 i u.u.u.0.I u.u.u.u.u.u.u.K @.O.x m O $ 0 ( T ] M ~ 6 6 E { > u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.K # i u.u.u.0._ u.u.u.u.u.u.u.u.u.;.g [ 3 v $ =.8.Y d H 8 ^ E ) & @.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.;.< t u.u.u.j q u.u.u.u.u.u.u.u.u.u.<.@.$.} v X % , 8.: : n A { = - K u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.$.s ..u.u.u.l p u.u.u.u.u.u.u.u.u.u.u.u.<.$.x v 3 C f -.<.;.C ' 5 q.N u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.. o K u.u.u.u D $.u.u.u.u.u.u.u.u.u.u.u.u.<.$.;.u.u.u.u.u.u.u.u.u.O.4.K ",
+"u.u.u.u.u.u.u.u.*.g %.j o l u.u.u.u.u.9 + a ..g <.u.u.u.u.u.u.u.u.u.;.u.u.u.u.u.u.u.u.u.u.u.u.f ",
+"u.u.u.u.u.u.u.F D 7 7 + a K f f f f f K . + 7 o 1 <.u.u.u.u.u.u.u.u.K f K u.u.u.u.u.u.u.u.K ;.<.",
+"u.u.u.u.u.u.u.i s o 7 1 + 2 2 2 2 2 2 2 + # 7 < < ;.u.u.u.u.u.u.u.u.u.u.f *.-.K u.u.K -.*.f u.u.",
+"u.u.u.u.u.u.u.K *.g g g $.$.$.$.$.$.$.$.$.g g g f u.u.u.u.u.u.u.u.u.u.u.u.u.<.-.<.<.-.K u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u."
+};
+/* XPM */
+const char *twodicon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 128 2",
+" c #959292",
+". c #6d6a6a",
+"X c #797575",
+"o c #eae9e8",
+"O c #a4a1a1",
+"+ c #c1bfbf",
+"@ c #6a6767",
+"# c #bcbaba",
+"$ c #070808",
+"% c #8c8989",
+"& c #555352",
+"* c #acaaa9",
+"= c #585555",
+"- c #9e9b9b",
+"; c #b2afaf",
+": c #383736",
+"> c #5c5959",
+", c #656161",
+"< c #a9a6a6",
+"1 c #615e5d",
+"2 c #222121",
+"3 c #817e7e",
+"4 c #121211",
+"5 c #2a2929",
+"6 c #e2e0e0",
+"7 c #4c4a4a",
+"8 c #e0dede",
+"9 c #b8b5b5",
+"0 c #262525",
+"q c #494646",
+"w c #878383",
+"e c #1d1d1d",
+"r c #3c3b3a",
+"t c #918d8e",
+"y c #c6c4c4",
+"u c #191918",
+"i c #aeacac",
+"p c #7c7979",
+"a c #898686",
+"s c #444242",
+"d c #2d2c2c",
+"f c #3f3d3c",
+"g c #747171",
+"h c #302e2e",
+"j c #151515",
+"k c #323130",
+"l c #514e4e",
+"z c #363434",
+"x c #4e4c4b",
+"c c #3f3e3d",
+"v c #3a3838",
+"b c #343232",
+"n c #434140",
+"m c #2c2b2b",
+"M c #e5e4e4",
+"N c #999696",
+"B c #848181",
+"V c #1c1b1b",
+"C c #c8c6c6",
+"Z c #e7e6e6",
+"A c #f4f3f3",
+"S c #474444",
+"D c #cbc9c9",
+"F c #fbfbfb",
+"G c #fafaf9",
+"H c #f0eeee",
+"J c #5f5c5b",
+"K c #dbd9d9",
+"L c #878585",
+"P c #736f6f",
+"I c #d7d5d5",
+"U c #42403f",
+"Y c #e5e3e3",
+"T c #7e7b7b",
+"R c #706d6d",
+"E c #625f5e",
+"W c Gray95",
+"Q c #575454",
+"! c #d0cdcd",
+"~ c #b7b4b4",
+"^ c #dcdada",
+"/ c #535150",
+"( c #d2d0cf",
+") c #7b7878",
+"_ c #cccaca",
+"` c #353433",
+"' c #272626",
+"] c #f2f1f0",
+"[ c #757272",
+"{ c #676463",
+"} c #b5b3b3",
+"| c #cecccb",
+" . c #dedcdb",
+".. c #242423",
+"X. c #d5d3d3",
+"o. c #31302f",
+"O. c #cac8c7",
+"+. c #52504f",
+"@. c #777373",
+"#. c #5f5c5c",
+"$. c #aba8a8",
+"%. c #d8d6d6",
+"&. c #b3b0b0",
+"*. c #7f7c7c",
+"=. c #4b4848",
+"-. c #9b9797",
+";. c #4a4847",
+":. c #464443",
+">. c #d3d1d1",
+",. c #dad8d7",
+"<. c #636060",
+"1. c #939090",
+"2. c #999695",
+"3. c #eeeded",
+"4. c #5a5756",
+"5. c #ecebeb",
+"6. c #838080",
+"7. c #6f6c6c",
+"8. c #989494",
+"9. c #8b8888",
+"0. c #bab8b7",
+"q. c #a19e9e",
+"w. c #5b5958",
+"e. c #f7f6f6",
+"r. c #8e8b8b",
+"t. c #1f1f1e",
+"y. c #716e6e",
+"u. c None",
+/* pixels */
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.9 p = s v 7 J L y u.u.u.u.u.u.u.( > q & 1 . g g y.{ 1 > x q q & { t C u.u.u.u.u.u.u.",
+"u.u.u.u.O k 4 : @ 3 9.X <.m 4 v C u.u.u.u.u.& : p . E & q q =.> { R p 3 *.. Q ..4 h O u.u.u.u.u.",
+"u.u.u.P j / C W _ < O } 6 u.&.;.u 3 u.u.u.u.S & D | ! G u.u.u.u.; 8.a O D u.u.i > t.x 8 u.u.u.",
+"u.u.r.$ O u.a m 4 u e j 4 & O.u.P $ i u.u.u.O e 4 4 4 5 ! u.] x 4 ' 5 ..V 4 e , X.u.; ..r A u.u.",
+"u.~ $ u.: ..T y Y M K $.S $ u.P o.F u.u.u.Y _ _ C S & u.; $ # H A 5.M C U 4 = u.Z d 7 u.u.",
+"u.+.h u.7 ` K u.u.u.u.u.u.u.X 2 ( H ..w u.u.u.u.u.u.u.B : u.N u 5.u.u.u.u.u.u.u. ' J u.+ $ L u.",
+"H 5 1.u.$ s o u.u.u.u.u.u.u.u.q E u.Q ` u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.I u y.u.R ..W ",
+"6 ' K F <.0 +.G u.u.u.u.u.u.u.w o.u.@.5 e.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.[ j Y W 5 < ",
+"6 ' I u.u.D ' Y u.u.u.u.u.u.u. 0 u.p 5 A u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.^ u u./ <.",
+"A m #.u.u.9 ' o u.u.u.u.u.u.u.{ s u.P m G u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.4.4.u.3 s ",
+"u.L 4 4.{ 5 { u.u.u.u.u.u.u.D ..-.u.q U u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.L s u.i ` ",
+"u.u.~ 4.+.% u.u.u.u.u.u.6 #.4 & u. .u < u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.* : F %.5 ",
+"u.u.u.u.u.u.u.u.u.Z -.7 2 ` *.u.o s S u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.+ o.] M ' ",
+"u.u.u.u.u.u.u.X.) ..j c 2.u.u.; 5 2 >.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.C h H Z 5 ",
+"u.u.u.u.u.%.S j h a .u.u.% ` 4 #.,.u.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.y h H Z 5 ",
+"u.u.u.u.X ..c u.u.< & 5 ' +.i u.u.u.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.~ b A 6 ' ",
+"u.u.u.E $ ) u.A a 5 4 : 3 3.u.u.u.u.u.u.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.- r u._ 5 ",
+"u.G 1 ..| K Q 2 r p C u.u.u.u.i :.: E X.u.u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.[ 7 u.- r ",
+"u.% $ # 9 ' r O u.u.u.u.u.u.I t.c > ..5 Z u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.u.c . u.. x ",
+"W ..@ ( 4 7 R 4.{ C u.u.u.u.B c u.u.Y t.X u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.} $ # u.U X ",
+"q.d u.1 $ 2 z n ` 2 s O.u.u.r.o.+ O.*.S u.u.u.u.u.u.B : u.N V M u.u.u.u.u.u.u.u.u.;.d u.+ 2 D ",
+"J 4.u.` h } u.u.u.+ : 2 $.u.o k 4 $ E ; r G u.u.u.u.u.w z u.2.e Z u.u.u.u.u.u.u.u.O 4 ; u.: f u.",
+"r T F 7.N p . t Z u.u.. u J ^ u.>.q , i c G u.u.u.u.u.T r u.- j o u.u.u.u.u.u.o . u r.u.w 4 9 u.",
+"z w u.r.4 5 h u 5 O u.u.i 2 t.X @ u + T q u.u.+ < D I f <.u.C 4 X C K 8 ( i p d u w u.# 4 t u.u.",
+"n g u., $ B F ^ P 4 v M u.M L U q O H e T u.1.4 4 4 4 h ,.u.u.N t.4 4 4 4 4 k 6.] u.) $ . u.u.u.",
+"@.r u.u.& z u.u.u.; f d 8.u.u.u.u.u.x e 8 u.:.@ A C # u.u.u.u.u.F | # 9 + M u.3. s 2 @.u.u.u.u.",
+"I u > 0.n : u.u.u.u.u.+.$ 7 N + O =.V &.u.u.= : X [ @ J 7 q 7 w.<.. X ) X @ l e u U ! u.u.u.u.u.",
+"u.* c o.U ~ u.u.u.u.u.u.+ > v h : = ! u.u.u.^ { / Q > <.R g R , J 4.& / & = @ - .u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u."
+};
+
+/* XPM */
+const char *twodicon_sel[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 128 2",
+" c #868282",
+". c #b8b6b6",
+"X c #757272",
+"o c #918d8e",
+"O c #adaaaa",
+"+ c #7d7a7a",
+"@ c #a29f9f",
+"# c #8a8787",
+"$ c #cdcaca",
+"% c #605d5d",
+"& c #bebcbc",
+"* c #6a6666",
+"= c #a8a5a5",
+"- c #dad8d8",
+"; c #555252",
+": c #989595",
+"> c #3f3d3c",
+", c #595656",
+"< c #eae9e9",
+"1 c #514e4d",
+"2 c #d3d0d0",
+"3 c #4d4a4a",
+"4 c #5c5a59",
+"5 c #222121",
+"6 c #6e6b6b",
+"7 c #e3e1e1",
+"8 c #a4a1a1",
+"9 c #969393",
+"0 c #9d9999",
+"q c #b1aeae",
+"w c #0f0f0e",
+"e c #2d2c2c",
+"r c #151515",
+"t c #181818",
+"y c #b3b1b1",
+"u c #9f9b9b",
+"i c #111111",
+"p c #939091",
+"a c #484645",
+"s c #b5b2b2",
+"d c #1d1d1d",
+"f c #040404",
+"g c #272626",
+"h c #535050",
+"j c #636060",
+"k c #787474",
+"l c #c9c7c7",
+"z c #343232",
+"x c #575454",
+"c c #393736",
+"v c #2f2e2d",
+"b c #434140",
+"n c #323130",
+"m c #2c2b2a",
+"M c #2a2929",
+"N c #3a3838",
+"B c Gray3",
+"V c #454242",
+"C c #3f3e3d",
+"Z c #3c3a39",
+"A c #a3a0a0",
+"S c #4e4c4b",
+"D c #d0cdcd",
+"F c #dddbdb",
+"G c #42403f",
+"H c #8e8b8b",
+"J c #e0dedd",
+"K c #201f1f",
+"L c #736f6f",
+"P c #5f5c5c",
+"I c #7a7777",
+"U c #c3c1c1",
+"Y c #4b4948",
+"T c #6c6969",
+"R c #373535",
+"E c #cecccc",
+"W c #706d6c",
+"Q c #bab8b8",
+"! c #676463",
+"~ c #dedddd",
+"^ c #c7c5c5",
+"/ c #afacac",
+"( c #e8e6e6",
+") c #1b1b1a",
+"_ c #6b6868",
+"` c #bdbbbb",
+"' c #838080",
+"] c #d6d4d4",
+"[ c #0b0b0b",
+"{ c #c2c0bf",
+"} c #31302f",
+"| c #4b4847",
+" . c #a6a4a3",
+".. c #7b7878",
+"X. c #474544",
+"o. c #797676",
+"O. c #c0bebe",
+"+. c #292827",
+"@. c #fafaf9",
+"#. c #5a5857",
+"$. c #d5d3d3",
+"%. c #e5e3e3",
+"&. c #edebeb",
+"*. c #20201f",
+"=. c #8b8787",
+"-. c #cac8c8",
+";. c #b7b5b4",
+":. c #c5c4c3",
+">. c #c4c2c2",
+",. c #8f8c8b",
+"<. c #f0efef",
+"1. c #e1e0df",
+"2. c #7f7c7c",
+"3. c #282727",
+"4. c #716e6e",
+"5. c #878585",
+"6. c #5b5958",
+"7. c #716e6d",
+"8. c #efeded",
+"9. c #4f4c4c",
+"0. c #83807f",
+"q. c #d1cfcf",
+"w. c #807d7d",
+"e. c #d8d5d5",
+"r. c #e6e5e5",
+"t. c #353333",
+"y. c #464443",
+"u. c None",
+/* pixels */
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.m h k o u W Y 5 u.u.u.u.u.u.u.) 4.=...6 j #.6.4 * 6 L ' =.# I ! V 5 u.u.u.u.u.u.u.",
+"u.u.u.u.R = 7 A j 1 a x _ s 1.u 5 u.u.u.u.u.I A ; % T + =.=.5.4.! P ; 1 h j k U 7 / c u.u.u.u.u.",
+"u.u.u.4 - + 5 f K t.R e i u.v # 2 1 u.u.u.u.H I K d d f u.u.u.u.v G | G c K u.u.n L $ ' r u.u.u.",
+"u.u.X.( R u.| s J 2 E - J ..*.u.4 &.} u.u.u.R $ F F F . d u.f ' F & . U q.~ $ * t u.v O.u f u.u.",
+"u.m <.G u.8 U h 5 i w r z H ( G u.4 O u.u.u.u.i K K 5 H I u.v &.+.B f [ w 5 G p %.k u.w y ' u.u.",
+"u.2./ u. = r u.u.u.u.u.u.u.x ^ ) B U Y u.u.u.u.u.u.u.S A u.> 2 [ u.u.u.u.u.u.u.G & 7.u.g <.Y u.",
+"B Q b u.< o [ u.u.u.u.u.u.u.u.# T u.o.= u.u.u.u.u.u.u.S 8 u.> D w u.u.u.u.u.u.u.u.t e.P u.P O.f ",
+"i ` r u._ & 2.f u.u.u.u.u.u.u.3 O u., . f u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u., - i f ;.t.",
+"i & t u.u.K & i u.u.u.u.u.u.u.G & u.h . f u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.r ] G u.+ _ ",
+"f s 6 u.u.m & [ u.u.u.u.u.u.u.! o u.4 s f u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.X X u.1 o ",
+"u.Y J X * . ! u.u.u.u.u.u.u.K { > u.# 9 u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.Y o u.} = ",
+"u.u.m X + a u.u.u.u.u.u.i 6 F I u.r 2 t.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.n A u.t Q ",
+"u.u.u.u.u.u.u.u.u.w > :.= 1 u.[ o H u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.g O f w ` ",
+"u.u.u.u.u.u.u.t ; U - : C u.u.v . ^ ) u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.5 q B w Q ",
+"u.u.u.u.u.t H - q | r u.u.X.= 7 6 t u.u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.5 q B w Q ",
+"u.u.u.u.x { 9 G u.u.t...Q ` + n u.u.u.u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.m = f i ` ",
+"u.u.u.T ( ; u.f | . ~ @ 1 B u.u.u.u.u.u.u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.Z 0 u.K . ",
+"u.f 6 O.d r o.^ 0 ; 5 u.u.u.u.} ,.8 T ) u.u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u., ' u.Z u ",
+"u.a @.+.m & u c u.u.u.u.u.u.t -.9 L U Q w u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.u.: % u.% 0.",
+"f { j ) J ' P X ! 5 u.u.u.u.S 9 u.u.i l x u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.e 8.3.u.p ; ",
+"N y u.6 @.>. .p = ^ o *.u.u.y.O g G *.h H u.u.u.u.u.u.S A u.> D w u.u.u.u.u.u.u.u.u.# y u.g l K ",
+"W X u.= q e u.u.u.g 8 ^ z u.[ O F &.T v 0 f u.u.u.u.u.3 8 u.C E w u.u.u.u.u.u.u.u.c 7 v u.@ : u.",
+"0 h u.P > ; % V w u.u.% 2 W r u.) =.* } : f u.u.u.u.u.h 0 u.Z - [ u.u.u.u.u.u.[ % $.X.u.3 1.M u.",
+" .Y u.X.%.;.q $.Q c u.u.} :.$ , j $.g h # u.u.g t.K t : * u.5 %.x 5 r r ) n h y ] Y u.+.~ V u.u.",
+"p #.u.* @.S u.r 4 r.u w u.w Y p =.R B E h u.b J F F ~ / t u.u.> -.F F F ~ J O 9.f u.; < j u.u.u.",
+", 0 u.u.I .u.u.u.v : y C u.u.u.u.u.' E i u.,.j f 5 3.u.u.u.u.u.u.d +.m g w u.B G o >., u.u.u.u.",
+"t ] L M p @ u.u.u.u.u.+ ( > g c 5.D v u.u.k 8 , , j W =. L * % x ; ; j w.E ] p d u.u.u.u.u.",
+"u.n : O p m u.u.u.u.u.u.g L u / @ k d u.u.u.r ! + o.L _ P #.P * W X + + + k j Z r u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u."
+};
+
+/* XPM */
+const char * threedicon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 16 1",
+" c #a2a5a5",
+". c #f3f2f2",
+"X c #cccbc9",
+"o c #5d5257",
+"O c #904857",
+"+ c #b3b2af",
+"@ c #8e9393",
+"# c #c3c4bf",
+"$ c #b5838c",
+"% c #dad7d7",
+"& c #697377",
+"* c #bcbcb8",
+"= c #dac0c5",
+"- c #7f8184",
+"; c #e4e4e4",
+": c None",
+/* pixels */
+"::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::;+ @@+%:::::::::::::::::::::::::::::::",
+"::::::::.#-&--&o&-X:::::::::::::::::::::::::::::",
+":::::::;@ &&--o--&& .:::::::::::::::::::::::::::",
+":::::::o@ --&&&--%::::::::::::::::::::::::::",
+"::::::+o +++*+@&@ -.:::::::::::::::::::::::::",
+"::::::@@ +++** @:::::::::::::::::::::::::",
+"::::::+ +*++++*+ &#::::::::::::::::::::::::",
+"::::::.# #..:;#+++++@--&.::.;:::::::::::::::::::",
+"::::::::;::::::X++++@-&&%::%& .:::::::::::::::::",
+"::::::::::::::::*+++ o X*::;&&&*.:::::::::::::::",
+"::::::::::. @;::#+++++:;*::;&&&&-%::::::::::::::",
+":::::.::::%+@&@%#**++.:X%::.-&&&&o-;::::::::::::",
+"::X@-@@%:.**+ &@*****::+:::;*@&&-ooo .::::::::::",
+":@&@@@- ;%+**++*****%;@;::.###+@-oooo-#.::::::::",
+"#&++*+@-%;*+******#+$@;:::.X####+&ooo-@@%:::::::",
+" @++++@@X:.#+**##***%:::::: +####*@oo@ @-+.:::::",
+"* ++++@@%:::#**%:X&.::::::%&####*## @@@@@@@;::::",
+"X+++++@@%:::.***%#&X::::::-@#********+ @@ -%:::",
+"; +++*+@+:::.****+@@:::::;o #****++++++ + -.::",
+":++++* +.:.****%#-.::::@@###*# @;*++++ +@&.:",
+":;+++* @-@*****;.@;:::%-X###**-;:.#+++ @&-+:",
+"::* ++*+ @-@*****;: %:::-*X#### ::::%++ @-@-&.",
+"::: +++*++******.:*:::X %#####-.:::::#++++@-&OX",
+":::.@-+*+*******;:.%:::@%X###X ::::::;++++ OOo+",
+"::::.@& +*******.:.:::X+%#####-;::::::.*++++-&- ",
+"::::::#&o- $$$%:::::@%####X :::::::.***++ +@",
+":::::::.+OOOOOO$.::.% +%#####-.:::::::.*****+ @ ",
+":::::::::.;====.:.@--&X####X *::::::::.*****+@ +",
+":::::::::::::::::*++ @#####*@:::::::::;***** @@*",
+"::::::::::::::::*&+#**#####*#:::::::::X###***++%",
+"::::::::::::::::&o #****###%*;:::::::;#####*##*.",
+"::::::::::::::::.* +******X+@- ;.::;#######* X:",
+"::::::::::::::::::;+ +****# @@@-o--@*######*++.:",
+"::::::::::::::::::::X ****#+@-oo&@#X#####*+ %::",
+":::::::::::::::::::::.+@+***##*++*X######*@@ :::",
+":::::::::::::::::::::::%@@+***###########$O&;:::",
+"::::::::::::::::::::::::.+- +##*######X*$OO=::::",
+"::::::::::::::::::::::::::;#-- *###X#*$OOO%:::::",
+"::::::::::::::::::::::::::::; oo-$ $$OOO$.::::::",
+"::::::::::::::::::::::::::::::.X $OO$$=;::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::"
+};
+
+/* XPM */
+const char *threedicon_sel[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 64 1",
+" c #9b495a",
+". c Gray99",
+"X c #728b91",
+"o c #abaaa6",
+"O c #dbabb3",
+"+ c #4e4f4f",
+"@ c #c1c2bd",
+"# c #92a9b0",
+"$ c #9b9996",
+"% c #0d0c0c",
+"& c #b9bab5",
+"* c #bdbdb8",
+"= c #2d2d2c",
+"- c #ac7881",
+"; c #b2b2ae",
+": c #c4c5c0",
+"> c #b09598",
+", c #7d7679",
+"< c #b5b4b0",
+"1 c #b8a4a8",
+"2 c #dbdbd8",
+"3 c #848687",
+"4 c #6a6968",
+"5 c #82989d",
+"6 c #637e84",
+"7 c #6b323e",
+"8 c #c9cac5",
+"9 c #89a0a5",
+"0 c #5c7276",
+"q c #b9b6b3",
+"w c #7a414d",
+"e c #403a3c",
+"r c #ffccdd",
+"t c #69757a",
+"y c #c5c8c2",
+"u c #bfbfba",
+"i c #b7b8b3",
+"p c #a2a19e",
+"a c #8f8d8a",
+"s c #eae9e9",
+"d c #a1a9ae",
+"f c #7b5960",
+"g c #c7c6c2",
+"h c #706b6b",
+"j c #979391",
+"k c #cecdc9",
+"l c #83807f",
+"z c #afafaa",
+"x c #261317",
+"c c #727f83",
+"v c #828e91",
+"b c #7a6c70",
+"n c #a3b4b5",
+"m c #72716f",
+"M c Gray10",
+"N c #36191f",
+"B c #b4aab6",
+"V c #fd87a5",
+"C c #5a5758",
+"Z c #91b5bc",
+"A c #484645",
+"S c #918a8e",
+"D c #616162",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFM=+CA=MFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFM6X6XX60,+=FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFF%vZ66X6Dcv6t+%FFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFF+9d$pd93vt6t5,MFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFF=mpoooz<&zvt5#dl%FFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFCpoooz;;<iio##d#4FFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFF4<ooo$pqi<i&<dZ#3=FFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFMmz,M%%ej*qqqn5XXDFFF%MFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFF=%FFFF%,&<<<9X,,MFF3cAMFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFF%;i<<pf12=Fe266te%FFFFFFFFFFFFFFF",
+"FFFFFFFFFFM4AMFFj&<<zq.s=Fks660t4=FFFFFFFFFFFFFF",
+"FFFFFFFFFFpu$he=p*&qq..2M%.sX00t,DCMFFFFFFFFFFFF",
+"FF=e+,b=FM@*;pmju**&u..jFFs2&960,CADA%FFFFFFFFFF",
+"FAlj$jadMm@ii;<*&*uu2s$%FF;k@g<v,CeeCce%FFFFFFFF",
+"=lz<&oajAA&*i&&q&*@q>h%FFFMp:@::obee+X5mMFFFFFFF",
+"Dpzz<za$eFM$u&&g@&<C=%FFFFFC*@@@:*S+CX99vA%FFFFF",
+"azoz<;jpeFF%$u&2.kD%FFFFFFMly@@@uu:ov595954MFFFF",
+"liz;;ij$AFFF=:*&2:,MFFFFFF+$yuuuuu***;9999zSMFFF",
+"eiz;<uqpX%FFM*u*&;$+FFFFFMho:uuu*iu&<<zd9dB#c%FF",
+"%oq;<&p#n0%F=@u**2:,%FFFFApg@uu@z+A;&;zzod#Z9CFF",
+"FA*;<qop#9cel@**&2.aMFFFMak:@@u@l%FM3izoodZXcv=F",
+"FFl;<q&;p5,j@***&2.$MFFFCg8::@:;eFFFFD<ooo$c5XD%",
+"FF%3zqqqq<<*&&*&*..$FFFMo2::::83%FFFFFl<zoo9c,f=",
+"FFFM3j;&qq&ii&&&2..AFFFm28yg:8<eFFFFFF=&;zzpfwfe",
+"FFFF%Alp<**&&uuOs.:FFFM@2:ygg8l%FFFFFFMii<<;,ha+",
+"FFFFFF=Dh->11>-Vrg%FFFm2g:yykzeFFFFFFFMi*&iipp;m",
+"FFFFFFF%=7w -f%FM=A<2@::yg,%FFFFFFFM&*&&&zpp4",
+"FFFFFFFFFF%NNNx%FMl3S,8:@@:8z=FFFFFFFFe:u**&o$oC",
+"FFFFFFFFFFFFFFFFF1O1pjg@@@:@mFFFFFFFFFD8@u*uoj$A",
+"FFFFFFFFFFFFFFFF=,1guu@@@@:kAFFFFFFFFFzy@@uui<u=",
+"FFFFFFFFFFFFFFFFDho@uuuu@uy2vMFFFFFFF+k::@@u@8;%",
+"FFFFFFFFFFFFFFFF%Cpq*u*uuu8n5X+MFFF%C8y::@:ipzAF",
+"FFFFFFFFFFFFFFFFFF=lo&uu**:ovv$3Ae+a88::@@@&<z%F",
+"FFFFFFFFFFFFFFFFFFF%A$;*u**uq$,fwh$yy:::@@ioqAFF",
+"FFFFFFFFFFFFFFFFFFFFFM4p;uu*u:*;zu8y:::@:*jj,FFF",
+"FFFFFFFFFFFFFFFFFFFFFFF=mjquuuu::::::::y:-fbMFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFF%el;q@@u@@@::y8*- xFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFMCljo*:yy8yu> xFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFM=+f->>>- 7%FFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF%%N7ww77N%FFFFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+};
+
+/* XPM */
+const char *joyicon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 64 1",
+" c #e7e4e5",
+". c #8a898f",
+"X c #4d4c5c",
+"o c #7b7a8a",
+"O c #1c1b2b",
+"+ c #680a0f",
+"@ c #575564",
+"# c #cfd8ef",
+"$ c #282535",
+"% c #6b6a7c",
+"& c #383648",
+"* c #8c0101",
+"= c #dbdbde",
+"- c #bdbcc2",
+"; c #dca9a8",
+": c #c4c8da",
+"> c #2b1625",
+", c #fefefe",
+"< c #c6c7ca",
+"1 c #f3f2f4",
+"2 c #ececee",
+"3 c #0c0916",
+"4 c #151322",
+"5 c #cc0505",
+"6 c #801115",
+"7 c #a4a4aa",
+"8 c #f8f8f8",
+"9 c #a50000",
+"0 c #ea1515",
+"q c #dee6f8",
+"w c #171625",
+"e c #ecf2ff",
+"r c #ababb2",
+"t c #932c2d",
+"y c #727180",
+"u c #f5e9e9",
+"i c #a25757",
+"p c #413f4f",
+"a c #2e2b3c",
+"s c #656372",
+"d c #95959e",
+"f c #5e5d6e",
+"g c #1b1928",
+"h c #f62020",
+"j c #222030",
+"k c #41111c",
+"l c #333142",
+"z c #161b2b",
+"x c #12101e",
+"c c #191727",
+"v c #ac97a6",
+"b c #fbfbfb",
+"n c #f9fafe",
+"m c #73515a",
+"M c #eacac9",
+"N c #b1b0bc",
+"B c #bea6a8",
+"V c #ac8a8a",
+"C c #bcc0d4",
+"Z c #d0d0d6",
+"A c #1f1d2d",
+"S c #ff4545",
+"D c #b93939",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFF i6t;,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFF *9959;FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF,i95h555uFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF1690Sh00;FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF8t950hh5MFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFB+9555DbFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFF,V+**tuFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFF, Bv=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFF8:qbFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFF,:q1FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF=#2FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF2:q,FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFbCq8FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFZ#1FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFF #2FFFFFFF81bFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFF8Cq,FFb -.paX<,FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFF,:q=-.X>+***kg7,FFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFb <dqoxcz+999**>4d,FFFFFFFFFFFFFF",
+"FFFFFFFFFFF,2<.X$4a#rcOzk*****>OcobFFFFFFFFFFFFF",
+"FFFFFFF,2<d@$c4ccw4N#$4cc>+++kAAO4y8FFFFFFFFFFFF",
+"FFF,2<dmkk>4www4443oe@3wwwzzwwgOOO4s8FFFFFFFFFFF",
+"Fb7Xj>*999*kwcccccxped344cggccccOOgxs1FFFFFFFFFF",
+",s3x4k99***+gcwwwwxgZZc3xwcgcggggOOg4X2FFFFFFFFF",
+"734w4k*****+zc44xxx3dn&cAOwcccccggOOgxp FFFFFFFF",
+"XA4wxxk+66kOOOAgwAg4lfc4gjAwcccccggOAO4a FFFFFFF",
+"pAO4cxxx44wwgOAAA$j4c4334l&OccccwccgOAAcaZFFFFFF",
+"7xjwcgcc4444wcOOAjAg$l&jcp@lOccwwwccgOAjg$=FFFFF",
+"1jAA4OOOOgc444wgOAjApdNo&pfpAOOOgcwccOOAjA$<FFFF",
+"Fr3jwcOOOOOgc44wgOAjpNq7@pljAjjjjjAOOOOAj$jj-,FF",
+"Fb&cAwOAOOOOgcwwwc$lps%p$AOAAOOOOAAAAjjjj$$$$7,F",
+"FF<3jgcAOOOOOggcccl&l&OcOgcwwwcgOAAAAAjj$$$$$aNF",
+"FF,@4jwOAOggggggc$p$&&cw4wwcgOOOOOOAAAjjjAgwwlp=",
+"FFF=3jOcAOgcccccc&aO&j4cggggggggggOAOOg4xxwA$lpy",
+"FFF,oxjcOAOccccwj&Oa&Oggggcwccccggw4x33xgja&p@@X",
+"FFFF2wAOcAOcwwwwaaA&$cccwwwwwww4x333xwA$lpXsyof@",
+"FFFFFdxjgOAOwwwgljlacww44444xx33334A$lpXfyooyf$-",
+"FFFFF1AOAgAOc4w>>O$>>444xx333334A$lpXfyooosXaxo,",
+"FFFFFFr3jOOAO44>>>>>4xx333334AalpXf%ooo%@l44fZ,F",
+"FFFFFF8&cjgAAc4444x33333xcja&pXf%oooy@pOxp7 ,FFF",
+"FFFFFFF<3jOOAO4x333334O$&pXXf%oooyfpjxa.=bFFFFFF",
+"FFFFFFF,@4jOAOx33xg$lpXX@f%yooyfX$x$.Z8FFFFFFFFF",
+"FFFFFFFF=3AAO$&&apX@ffs%yyoysXawOs-1FFFFFFFFFFFF",
+"FFFFFFFF,yxjj@-Ny%%%%yyy%sXlcxXN2FFFFFFFFFFFFFFF",
+"FFFFFFFFF2xgA@:Co%%%%%fX&gxp7 ,FFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFd3Olfsf%sfX&j4l.ZbFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFF8jxjjapX&jxAy<8FFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF=g3cAA4gs-2FFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFF2.l$@72,FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+};
+
+/* XPM */
+const char *joyicon_sel[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 64 1",
+" c #373546",
+". c #eaf2ff",
+"X c #4a4758",
+"o c #2e1725",
+"O c #8c0102",
+"+ c #afafc0",
+"@ c #585567",
+"# c #ce0606",
+"$ c #f01919",
+"% c #71070b",
+"& c #d0d7ed",
+"* c #aea2b4",
+"= c #151322",
+"- c #4e0c14",
+"; c #c8c8d7",
+": c #a60000",
+"> c #222132",
+", c #020103",
+"< c #1a1828",
+"1 c #7b7a8c",
+"2 c #6b6a7c",
+"3 c #181625",
+"4 c #1f1d2d",
+"5 c #2f090f",
+"6 c #737284",
+"7 c #3f3d4e",
+"8 c #858b99",
+"9 c #0a0812",
+"0 c #626173",
+"q c #12111e",
+"w c #9595a5",
+"e c #5f5e71",
+"r c #312f40",
+"t c #1c1826",
+"y c #e1e9fd",
+"u c #1b1a2a",
+"i c #24212e",
+"p c #f92f2f",
+"a c #0f0d19",
+"s c #b7bed0",
+"d c #2b293b",
+"f c #272434",
+"g c #1e1c2b",
+"h c #706f81",
+"j c #6e6d7f",
+"k c #151a2a",
+"l c #2d2835",
+"z c #1f2030",
+"x c #5c5b6c",
+"c c #111626",
+"v c #69687a",
+"b c #1a1c2c",
+"n c #282638",
+"m c #160000",
+"M c #4f4d5f",
+"N c #1c1b2b",
+"B c #161824",
+"V c #181727",
+"C c #777688",
+"Z c #7e7d8f",
+"A c #62616b",
+"S c #797889",
+"D c #666578",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFFm-%%5,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFmO::##-FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF,-:#p###mFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF,%:$p$$$5FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF,%:#$$p#mFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFmO:###O,FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFF,m%OO%mFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFF,,5*AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFF,ss,FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFF,0.aFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFi.7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF9&8,FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF,8&,FFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFF7.iFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFFqyxFFFFFFF,,,FFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFF,s+,FF,,9at4B,,FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFFF,vyB,aBo%OO%-z9,FFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFF,,,XyS=>z%:::OOoz9,FFFFFFFFFFFFFF",
+"FFFFFFFFFFF,,9aB4b &+<ub-OOOOOo4>a,FFFFFFFFFFFFF",
+"FFFFFFF,,9a=g44guV=+&l=VVo-%%ob44>q,FFFFFFFFFFFF",
+"FFF,,,95--okV33===aS.@a33ckkcc<Nggzq,FFFFFFFFFFF",
+"F,9qkoO:::O-cV<<<<q7.89==V<<<VV<ugu4=,FFFFFFFFFF",
+",q33c-::OOO%<V3333qu;;3aq3<<<<<<<ugu43,FFFFFFFFF",
+"9u=3c5OOOOO-kV==qqa9w. <4N3<<VV<<uugu4u,FFFFFFFF",
+"=>=3qq5%%%-Nbgg<3g<= x<=tig3<<VVV<uNgNg4,FFFFFFF",
+"a>N=Vqqq=ccV<u444n>=V=99=r uVVVV3V<<N444i,FFFFFF",
+",N>3Vu<V====3<ug4z4ufr i37@rb<V3333<<N44ii,FFFFF",
+",a>4=NNNu<V===3<N4>47w+C Xx74ggN<V33<ug4iin,FFFF",
+"F,<>3VggNNu<V==3<Nz>X+y*@7r>zz>>zz4NNuggiifl9,FF",
+"F,azz3N4NNuuu<333<n 7Dv7f4N44NNNNgg44zziifflr9,F",
+"FF,3><<4guuuu<<<VV 7r bVNuV333<<ugg444iifflnl aF",
+"FF,94z3g4N<<<<<<Vf7f <3=33<<uuuNNggg4iii4t33 X,",
+"FFF,=>N<4N<<VV<<< rN >=V<uuuuu<<<uuggut=qq3gfrMg",
+"FFF,,N>Vg4uVVVV3> ud N<<<<V33VV<<<3=qaaqt>d 7@@i",
+"FFFF,q>g<4g<3333rd47fV<V3333333=qa9aa34nr7M0hCe=",
+"FFFFF,u><N4u333trzrrt33=====qaa99a=4nr7MehSShe ,",
+"FFFFF,az4<4gV=3ttgloo===qaa999a=gnr7Meh1ZCDMrt,,",
+"FFFFFF,V>Nu4N==ooooo=qaa999a=4d 7Mxj1Z12@ 4a,,,F",
+"FFFFFF,94z<44V====qa9999q3id 7Mx2SZ1hx7fq9,,,FFF",
+"FFFFFFF,=>gN4N=aa999aqgl 7XMx2CZZ6eXd=9,,,FFFFFF",
+"FFFFFFF,9N>N4Na99qtfr7XM@xv6116eXr<9,,,FFFFFFFFF",
+"FFFFFFFF,qz4gn7 r7M@xe0vhCCh0M 4a,,,FFFFFFFFFFFF",
+"FFFFFFFF,,uzz@s+hvvv2j66j0M >q9,,FFFFFFFFFFFFFFF",
+"FFFFFFFFF,a44@;;Z2jjjveM f=9,,,FFFFFFFFFFFFFFFFF",
+"FFFFFFFFFF,=grx0ev0xM7n39,,,FFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFF,9<>>d7X7d<a9,,FFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF,qV<4>Nq9,,FFFFFFFFFFFFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFF,9==9,,,FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+};
diff --git a/examples/demo/main.cpp b/examples/demo/main.cpp
new file mode 100644
index 0000000..8d604a9
--- /dev/null
+++ b/examples/demo/main.cpp
@@ -0,0 +1,377 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "frame.h"
+#include "graph.h"
+#include "display.h"
+#include "icons.h"
+
+#include "textdrawing/textedit.h"
+#include "textdrawing/helpwindow.h"
+#include "dnd/dnd.h"
+#include "i18n/i18n.h"
+
+#include <qmodules.h>
+
+#if defined(QT_MODULE_OPENGL)
+#include "opengl/glworkspace.h"
+#include "opengl/gllandscapeviewer.h"
+#include "opengl/glinfotext.h"
+#endif
+
+#if defined(QT_MODULE_CANVAS)
+#include "qasteroids/toplevel.h"
+#endif
+
+#if defined(QT_MODULE_TABLE)
+#include "widgets/widgetsbase.h"
+#else
+#include "widgets/widgetsbase_pro.h"
+#endif
+
+#include <stdlib.h>
+
+#include <qapplication.h>
+#include <qimage.h>
+
+#include <qtabwidget.h>
+#include <qfont.h>
+#include <qworkspace.h>
+#include <qwidgetstack.h>
+
+#if defined(QT_MODULE_SQL)
+#include <qsqldatabase.h>
+#include "sql/sqlex.h"
+#endif
+
+#if defined(Q_OS_MACX)
+#include <stdlib.h>
+#include <qdir.h>
+#endif
+
+#include "categoryinterface.h"
+
+static void qdemo_set_caption( CategoryInterface *c, int i )
+{
+ QWidget *w = qApp->mainWidget();
+ if ( !w )
+ return;
+ QString title = Frame::tr( "Qt Demo Collection" );
+ title += " - " + c->categoryName( i - c->categoryOffset() );
+ w->setCaption( title );
+}
+
+class WidgetCategory : public CategoryInterface
+{
+public:
+ WidgetCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ QString name() const { return "Widgets"; }
+ QIconSet icon() const { return QPixmap( widgeticon ); }
+ int numCategories() const { return 2; }
+ QString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Widgets" );
+ break;
+ case 1:
+ return Frame::tr( "Drag and Drop" );
+ break;
+ }
+ return QString::null;
+ }
+ QIconSet categoryIcon( int ) const { return QIconSet(); }
+ void setCurrentCategory( int i ) {
+ create();
+ stack->raiseWidget( i );
+ qdemo_set_caption( this, i );
+ }
+ void create() {
+ if ( created )
+ return;
+ created = TRUE;
+ stack->addWidget( new WidgetsBase( stack ), categoryOffset() + 0 );
+ stack->addWidget( new DnDDemo( stack ), categoryOffset() + 1 );
+ }
+
+ int categoryOffset() const { return 0; }
+
+private:
+ bool created;
+
+};
+
+#if defined(QT_MODULE_SQL)
+class DatabaseCategory : public CategoryInterface
+{
+public:
+ DatabaseCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ QString name() const { return "Database"; }
+ QIconSet icon() const { return QPixmap( dbicon ); }
+ int numCategories() const { return 1; }
+ QString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "SQL Explorer" );
+ break;
+ }
+ return QString::null;
+ }
+ QIconSet categoryIcon( int ) const { return QIconSet(); }
+ void setCurrentCategory( int i ) {
+ create();
+ stack->raiseWidget( i );
+ qdemo_set_caption( this, i );
+ }
+ void create() {
+ if ( created )
+ return;
+ created = TRUE;
+ stack->addWidget( new SqlEx( stack ), categoryOffset() + 0 );
+ }
+
+ int categoryOffset() const { return 10; }
+
+private:
+ bool created;
+
+};
+#endif
+
+#if defined(QT_MODULE_CANVAS)
+class CanvasCategory : public CategoryInterface
+{
+public:
+ CanvasCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ QString name() const { return "2D Graphics"; }
+ QIconSet icon() const { return QPixmap( twodicon ); }
+ int numCategories() const { return 2; }
+ QString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Graph Drawing" );
+ break;
+ case 1:
+ return Frame::tr( "Display" );
+ break;
+ }
+ return QString::null;
+ }
+ QIconSet categoryIcon( int ) const { return QIconSet(); }
+ void setCurrentCategory( int i ) {
+ create();
+ stack->raiseWidget( i );
+ qdemo_set_caption( this, i );
+ }
+ void create() {
+ if ( created )
+ return;
+ created = TRUE;
+ stack->addWidget( new GraphWidget( stack ), categoryOffset() + 0 );
+ stack->addWidget( new DisplayWidget( stack ), categoryOffset() + 1 );
+ }
+
+ int categoryOffset() const { return 100; }
+
+private:
+ bool created;
+
+};
+#endif
+
+#if defined(QT_MODULE_OPENGL)
+class OpenGLCategory : public CategoryInterface
+{
+public:
+ OpenGLCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ QString name() const { return "3D Graphics"; }
+ QIconSet icon() const { return QPixmap( threedicon ); }
+ int numCategories() const { return 3; }
+ QString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "3D Demo" );
+ break;
+ case 1:
+ return Frame::tr( "Fractal landscape" );
+ break;
+ case 2:
+ return Frame::tr( "OpenGL info" );
+ break;
+ }
+ return QString::null;
+ }
+ QIconSet categoryIcon( int ) const { return QIconSet(); }
+ void setCurrentCategory( int i ) {
+ create();
+ stack->raiseWidget( i );
+ qdemo_set_caption( this, i );
+ }
+ void create() {
+ if ( created )
+ return;
+ created = TRUE;
+ stack->addWidget( new GLWorkspace( stack ), categoryOffset() + 0 );
+ stack->addWidget( new GLLandscapeViewer( stack ), categoryOffset() + 1 );
+ stack->addWidget( new GLInfoText( stack ), categoryOffset() + 2 );
+ }
+ int categoryOffset() const { return 1000; }
+
+private:
+ bool created;
+
+};
+#endif
+
+class TextCategory : public CategoryInterface
+{
+public:
+ TextCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ QString name() const { return "Text Drawing/Editing"; }
+ QIconSet icon() const { return QPixmap( texticon ); }
+ int numCategories() const { return 2; }
+ QString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Richtext Editor" );
+ break;
+ case 1:
+ return Frame::tr( "Help Browser" );
+ break;
+ }
+ return QString::null;
+ }
+ QIconSet categoryIcon( int ) const { return QIconSet(); }
+ void setCurrentCategory( int i ) {
+ create();
+ stack->raiseWidget( i );
+ qdemo_set_caption( this, i );
+ }
+ void create() {
+ if ( created )
+ return;
+ created = TRUE;
+ TextEdit *te = new TextEdit( stack );
+ te->load( "textdrawing/example.html" );
+ stack->addWidget( te, categoryOffset() + 0 );
+ QString home = QDir( "../../doc/html/index.html" ).absPath();
+ HelpWindow *w = new HelpWindow( home, ".", stack, "helpviewer" );
+ stack->addWidget( w, categoryOffset() + 1 );
+ }
+ int categoryOffset() const { return 10000; }
+
+private:
+ bool created;
+
+};
+
+class I18NCategory : public CategoryInterface
+{
+public:
+ I18NCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ QString name() const { return "Internationalization"; }
+ QIconSet icon() const { return QPixmap( internicon ); }
+ int numCategories() const { return 1; }
+ QString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Internationalization" );
+ break;
+ }
+ return QString::null;
+ }
+ QIconSet categoryIcon( int ) const { return QIconSet(); }
+ void setCurrentCategory( int i ) {
+ create();
+ stack->raiseWidget( i );
+ qdemo_set_caption( this, i );
+ }
+ void create() {
+ if ( created )
+ return;
+ created = TRUE;
+ stack->addWidget( new I18nDemo( stack ), categoryOffset() + 0 );
+ }
+ int categoryOffset() const { return 100000; }
+
+private:
+ bool created;
+
+};
+
+#if defined(QT_MODULE_CANVAS)
+class GameCategory : public CategoryInterface
+{
+public:
+ GameCategory( QWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ QString name() const { return "Game"; }
+ QIconSet icon() const { return QPixmap( joyicon ); }
+ int numCategories() const { return 1; }
+ QString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Asteroids" );
+ break;
+ }
+ return QString::null;
+ }
+ QIconSet categoryIcon( int ) const { return QIconSet(); }
+ void setCurrentCategory( int i ) {
+ create();
+ stack->raiseWidget( i );
+ qdemo_set_caption( this, i );
+ }
+ void create() {
+ if ( created )
+ return;
+ created = TRUE;
+ stack->addWidget( new KAstTopLevel( stack ), categoryOffset() + 0 );
+ }
+ int categoryOffset() const { return 1000000; }
+
+private:
+ bool created;
+
+};
+#endif
+
+int main( int argc, char **argv )
+{
+ QString category;
+ QApplication a( argc, argv );
+
+ Frame::updateTranslators();
+ Frame frame;
+ a.setMainWidget( &frame );
+
+ QPtrList<CategoryInterface> categories;
+ categories.append( new WidgetCategory( frame.widgetStack() ) );
+#if defined(QT_MODULE_SQL)
+ categories.append( new DatabaseCategory( frame.widgetStack() ) );
+#endif
+ categories.append( new CanvasCategory( frame.widgetStack() ) );
+#if defined(QT_MODULE_OPENGL)
+ categories.append( new OpenGLCategory( frame.widgetStack() ) );
+#endif
+ categories.append( new TextCategory( frame.widgetStack() ) );
+ categories.append( new I18NCategory( frame.widgetStack() ) );
+ categories.append( new GameCategory( frame.widgetStack() ) );
+ frame.setCategories( categories );
+
+ frame.resize( 1000, 700 );
+ frame.show();
+
+ return a.exec();
+}
diff --git a/examples/demo/opengl/fbm.c b/examples/demo/opengl/fbm.c
new file mode 100644
index 0000000..47d5a61
--- /dev/null
+++ b/examples/demo/opengl/fbm.c
@@ -0,0 +1,207 @@
+/*****************************************************************
+
+ Implementation of the fractional Brownian motion algorithm. These
+ functions were originally the work of F. Kenton Musgrave.
+ For documentation of the different functions please refer to the
+ book:
+ "Texturing and modeling: a procedural approach"
+ by David S. Ebert et. al.
+
+******************************************************************/
+
+#if defined (_MSC_VER)
+#include <qglobal.h>
+#endif
+
+#include <time.h>
+#include <stdlib.h>
+#include "fbm.h"
+
+#if defined(Q_CC_MSVC)
+#pragma warning(disable:4244)
+#endif
+
+/* Definitions used by the noise2() functions */
+
+#define B 0x100
+#define BM 0xff
+
+#define N 0x1000
+#define NP 12 /* 2^N */
+#define NM 0xfff
+
+static int p[B + B + 2];
+static float g3[B + B + 2][3];
+static float g2[B + B + 2][2];
+static float g1[B + B + 2];
+static int start = 1;
+
+static void init(void);
+
+#define s_curve(t) ( t * t * (3. - 2. * t) )
+
+#define lerp(t, a, b) ( a + t * (b - a) )
+
+#define setup(i,b0,b1,r0,r1)\
+ t = vec[i] + N;\
+ b0 = ((int)t) & BM;\
+ b1 = (b0+1) & BM;\
+ r0 = t - (int)t;\
+ r1 = r0 - 1.;
+#define at3(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )
+
+static float noise3(float vec[3]);
+
+/* Fractional Brownian Motion function */
+
+double fBm( Vector point, double H, double lacunarity, double octaves,
+ int init )
+{
+
+ double value, frequency, remainder;
+ int i;
+ static double exponent_array[10];
+ float vec[3];
+
+ /* precompute and store spectral weights */
+ if ( init ) {
+ start = 1;
+ srand( time(0) );
+ /* seize required memory for exponent_array */
+ frequency = 1.0;
+ for (i=0; i<=octaves; i++) {
+ /* compute weight for each frequency */
+ exponent_array[i] = pow( frequency, -H );
+ frequency *= lacunarity;
+ }
+ }
+
+ value = 0.0; /* initialize vars to proper values */
+ frequency = 1.0;
+ vec[0]=point.x;
+ vec[1]=point.y;
+ vec[2]=point.z;
+
+
+ /* inner loop of spectral construction */
+ for (i=0; i<octaves; i++) {
+ /* value += noise3( vec ) * exponent_array[i];*/
+ value += noise3( vec ) * exponent_array[i];
+ vec[0] *= lacunarity;
+ vec[1] *= lacunarity;
+ vec[2] *= lacunarity;
+ } /* for */
+
+ remainder = octaves - (int)octaves;
+ if ( remainder ) /* add in ``octaves'' remainder */
+ /* ``i'' and spatial freq. are preset in loop above */
+ value += remainder * noise3( vec ) * exponent_array[i];
+
+ return( value );
+
+} /* fBm() */
+
+
+float noise3(float vec[3])
+{
+ int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
+ float rx0, rx1, ry0, ry1, rz0, rz1, *q, sy, sz, a, b, c, d, t, u, v;
+ register int i, j;
+
+ if (start) {
+ start = 0;
+ init();
+ }
+
+ setup(0, bx0,bx1, rx0,rx1);
+ setup(1, by0,by1, ry0,ry1);
+ setup(2, bz0,bz1, rz0,rz1);
+
+ i = p[ bx0 ];
+ j = p[ bx1 ];
+
+ b00 = p[ i + by0 ];
+ b10 = p[ j + by0 ];
+ b01 = p[ i + by1 ];
+ b11 = p[ j + by1 ];
+
+ t = s_curve(rx0);
+ sy = s_curve(ry0);
+ sz = s_curve(rz0);
+
+
+ q = g3[ b00 + bz0 ] ; u = at3(rx0,ry0,rz0);
+ q = g3[ b10 + bz0 ] ; v = at3(rx1,ry0,rz0);
+ a = lerp(t, u, v);
+
+ q = g3[ b01 + bz0 ] ; u = at3(rx0,ry1,rz0);
+ q = g3[ b11 + bz0 ] ; v = at3(rx1,ry1,rz0);
+ b = lerp(t, u, v);
+
+ c = lerp(sy, a, b);
+
+ q = g3[ b00 + bz1 ] ; u = at3(rx0,ry0,rz1);
+ q = g3[ b10 + bz1 ] ; v = at3(rx1,ry0,rz1);
+ a = lerp(t, u, v);
+
+ q = g3[ b01 + bz1 ] ; u = at3(rx0,ry1,rz1);
+ q = g3[ b11 + bz1 ] ; v = at3(rx1,ry1,rz1);
+ b = lerp(t, u, v);
+
+ d = lerp(sy, a, b);
+
+ return lerp(sz, c, d);
+}
+
+static void normalize2(float v[2])
+{
+ float s;
+
+ s = sqrt(v[0] * v[0] + v[1] * v[1]);
+ v[0] = v[0] / s;
+ v[1] = v[1] / s;
+}
+
+static void normalize3(float v[3])
+{
+ float s;
+
+ s = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+ v[0] = v[0] / s;
+ v[1] = v[1] / s;
+ v[2] = v[2] / s;
+}
+
+static void init(void)
+{
+ int i, j, k;
+
+ for (i = 0 ; i < B ; i++) {
+ p[i] = i;
+
+ g1[i] = (float)((rand() % (B + B)) - B) / B;
+
+ for (j = 0 ; j < 2 ; j++)
+ g2[i][j] = (float)((rand() % (B + B)) - B) / B;
+ normalize2(g2[i]);
+
+ for (j = 0 ; j < 3 ; j++)
+ g3[i][j] = (float)((rand() % (B + B)) - B) / B;
+ normalize3(g3[i]);
+ }
+
+ while (--i) {
+ k = p[i];
+ p[i] = p[j = rand() % B];
+ p[j] = k;
+ }
+
+ for (i = 0 ; i < B + 2 ; i++) {
+ p[B + i] = p[i];
+ g1[B + i] = g1[i];
+ for (j = 0 ; j < 2 ; j++)
+ g2[B + i][j] = g2[i][j];
+ for (j = 0 ; j < 3 ; j++)
+ g3[B + i][j] = g3[i][j];
+ }
+}
diff --git a/examples/demo/opengl/fbm.h b/examples/demo/opengl/fbm.h
new file mode 100644
index 0000000..474cd3c
--- /dev/null
+++ b/examples/demo/opengl/fbm.h
@@ -0,0 +1,39 @@
+/*****************************************************************
+
+ Prototypes for the fractional Brownian motion algorithm. These
+ functions were originally the work of F. Kenton Musgrave. For
+ documentation of the different functions please refer to the book:
+ "Texturing and modeling: a procedural approach"
+ by David S. Ebert et. al.
+
+******************************************************************/
+
+#ifndef _fbm_h
+#define _fbm_h
+
+#include <math.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TRUE 1
+#define FALSE 0
+
+typedef struct {
+ double x;
+ double y;
+ double z;
+} Vector;
+
+double fBm( Vector point, double H, double lacunarity, double octaves,
+ int init );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
diff --git a/examples/demo/opengl/gear.xpm b/examples/demo/opengl/gear.xpm
new file mode 100644
index 0000000..ccba9ec
--- /dev/null
+++ b/examples/demo/opengl/gear.xpm
@@ -0,0 +1,304 @@
+/* XPM */
+static char *gear[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 249 2",
+/* colors */
+".. c #7a7a7b",
+".# c #afafaf",
+".a c #adadad",
+".b c #727273",
+".c c #a7a7a7",
+".d c #a5a5a5",
+".e c #9d9f9d",
+".f c #9d9d9d",
+".g c #9b9b9b",
+".h c #656666",
+".i c #9a999a",
+".j c #626463",
+".k c #979797",
+".l c #969796",
+".m c #5e5e5f",
+".n c #5e5c5f",
+".o c #5c5e5d",
+".p c #919191",
+".q c #c6c6c5",
+".r c #8d8d8d",
+".s c #535454",
+".t c #bdbcbc",
+".u c #bbbaba",
+".v c #838383",
+".w c #818181",
+".x c #8e8f91",
+".y c #484849",
+".z c #797979",
+".A c #aeaead",
+".B c #777777",
+".C c #acacab",
+".D c #abaaaa",
+".E c #747574",
+".F c #a8a8a7",
+".G c #706f70",
+".H c #b1b2b3",
+".I c #323233",
+".J c #9b9a9a",
+".K c #656565",
+".L c #9a9a99",
+".M c #cfcdcd",
+".N c #999898",
+".O c #dedfdf",
+".P c #2b2c2c",
+".Q c #959694",
+".R c #5f5f5f",
+".S c #5f5d5f",
+".T c #939292",
+".U c #5c5b5c",
+".V c #a0a0a2",
+".W c #242425",
+".X c #595959",
+".Y c #8e8e8d",
+".Z c #575757",
+".0 c #555555",
+".1 c #c0bfbe",
+".2 c #545554",
+".3 c #8a8889",
+".4 c #888887",
+".5 c #cdcdce",
+".6 c #858484",
+".7 c #cacbcb",
+".8 c #161617",
+".9 c #807e7f",
+"#. c #131414",
+"## c #8d8e8f",
+"#a c #7b7a7a",
+"#b c #454545",
+"#c c #c0c1c1",
+"#d c #444344",
+"#e c #bfbfc0",
+"#f c #424342",
+"#g c #f2f2f2",
+"#h c #757674",
+"#i c #403f40",
+"#j c #3f3f3f",
+"#k c #3d3d3d",
+"#l c #6a6a69",
+"#m c #696868",
+"#n c #e2e2e2",
+"#o c #2f2f2f",
+"#p c #a8a9a9",
+"#q c #626261",
+"#r c #616060",
+"#s c #d8d8d8",
+"#t c #5a5a59",
+"#u c #232323",
+"#v c #9e9f9f",
+"#w c #1d1d1d",
+"#x c #1c1b1c",
+"#y c #cdcccd",
+"#z c #1a1b1a",
+"#A c #191919",
+"#B c #cacaca",
+"#C c #949595",
+"#D c #151515",
+"#E c #121312",
+"#F c #c2c2c2",
+"#G c #8c8d8d",
+"#H c #0f0f0f",
+"#I c #444443",
+"#J c #434242",
+"#K c #414040",
+"#L c #b9bab9",
+"#M c #b6b6b6",
+"#N c #b5b4b5",
+"#O c #b4b4b4",
+"#P c #6d6b6b",
+"#Q c #7a7b7b",
+"#R c #343433",
+"#S c #696767",
+"#T c #acacac",
+"#U c None",
+"#V c #dedddd",
+"#W c #717172",
+"#X c #a6a6a6",
+"#Y c #707171",
+"#Z c #292828",
+"#0 c #a4a4a4",
+"#1 c #6e6f6f",
+"#2 c #6a6b6b",
+"#3 c #9d9c9d",
+"#4 c #d0d1cf",
+"#5 c #c8c7c7",
+"#6 c #929092",
+"#7 c #c6c5c5",
+"#8 c #141413",
+"#9 c #131412",
+"a. c #c5c3c4",
+"a# c #9fa0a2",
+"aa c #d2d3d4",
+"ab c #8b8c8b",
+"ac c #8a8a8a",
+"ad c #bfbfbe",
+"ae c #bfbdbe",
+"af c #515352",
+"ag c #878687",
+"ah c #828282",
+"ai c #b7b7b6",
+"aj c #fbfcfc",
+"ak c #494b4a",
+"al c #49494a",
+"am c #7e7e7e",
+"an c #484949",
+"ao c #f9fafa",
+"ap c #474748",
+"aq c #f7f8f8",
+"ar c #797a79",
+"as c #787878",
+"at c #aaa9a9",
+"au c #737473",
+"av c #a8a9a7",
+"aw c #ececed",
+"ax c #39393a",
+"ay c #6d6c6d",
+"az c #6b6c6b",
+"aA c #e5e6e6",
+"aB c #afb1b1",
+"aC c #9f9f9e",
+"aD c #323333",
+"aE c #676667",
+"aF c #2f3130",
+"aG c #646464",
+"aH c #636463",
+"aI c #949393",
+"aJ c #181716",
+"aK c #141312",
+"aL c #d3d2d4",
+"aM c #212122",
+"aN c #565656",
+"aO c #1e1f1f",
+"aP c #525452",
+"aQ c #888787",
+"aR c #515251",
+"aS c #858584",
+"aT c #4e4e4e",
+"aU c #ffffff",
+"aV c #4d4e4d",
+"aW c #828181",
+"aX c #5c5c5f",
+"aY c #151516",
+"aZ c #5a5c5d",
+"a0 c #141515",
+"a1 c #8f8f91",
+"a2 c #111112",
+"a3 c #464646",
+"a4 c #101111",
+"a5 c #c1c2c2",
+"a6 c #f5f5f5",
+"a7 c #bfc0c0",
+"a8 c #414241",
+"a9 c #3f403f",
+"b. c #3e3e3e",
+"b# c #727171",
+"ba c #3b3c3b",
+"bb c #716f70",
+"bc c #e9e9e9",
+"bd c #363636",
+"be c #353435",
+"bf c #afb0b0",
+"bg c #686767",
+"bh c #313031",
+"bi c #e1e1e1",
+"bj c #2e2e2e",
+"bk c #626361",
+"bl c #2c2c2c",
+"bm c #605f5f",
+"bn c #dadbda",
+"bo c #a2a2a3",
+"bp c #262626",
+"bq c #6b6d6d",
+"br c #a1a0a2",
+"bs c #5a5b59",
+"bt c #242424",
+"bu c #d5d5d5",
+"bv c #595758",
+"bw c #575556",
+"bx c #8c8a8a",
+"by c #d1d1d1",
+"bz c #1e1e1e",
+"bA c #cfcfcf",
+"bB c #535352",
+"bC c #979898",
+"bD c #515150",
+"bE c #1b1a1b",
+"bF c #504f4f",
+"bG c #181a18",
+"bH c #848282",
+"bI c #c9c9c9",
+"bJ c #4e4b4d",
+"bK c #161616",
+"bL c #151415",
+"bM c #141414",
+"bN c #c5c5c5",
+"bO c #111011",
+"bP c #bdbdbd",
+"bQ c #777675",
+"bR c #0b0a0b",
+"bS c #bbbbbb",
+"bT c #858686",
+"bU c #848685",
+"bV c #b8b9b8",
+"bW c #4b4b4d",
+"bX c #808081",
+"bY c #4a4b4c",
+"bZ c #b5b5b5",
+"b0 c #393738",
+"b1 c #7c7e7d",
+"b2 c #b3b1b3",
+/* pixels */
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#G.Rbpab#UboaEb.axb0b0aNbU#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#WbWbM#8#.b0.Gbp.8aK#.bM#.#.bMbzak#C#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#Uar.WbMbMbMbM#zaO#.bMbMbMbMbMbMbMbMaJaO.o#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#Uad.wbp#.#.bMbM#uaN#zbMbMbMbMbMbMbMbMbKaO#xaY.U#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#Ba6aj.6.8bMbMbMbMacaUaL#PbLbMbMbMbM#D#wbzbKbMbM.G#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#Uadbcajaqbc.5.IbMbMbMbM#nawbcao#g.NbFbMbEaO.8bMbMbMaK.6#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U.OaUaoawbcaA#nb#bMbMbM#KaUbi#4.M#sawajbb#zbMbMbMbMbM#9#z.B#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#Uaa#ebcaA#nbi.OaQbMbMa0#QaUby.M.7#5#7.5.KbMbMbMbMbMbMbM#.#x.B#U#hbh.W.N#U#U#U#U#U#U#U",
+"#U#U#U#U#U#Ubo.oaA#n.O#VbnbnaS.vaQa7aA.7#5#7#F#c.1#RbMbMbMbMbMbMbMbM#.bl#d#z#.a4#I#v#U#U#U#U#U#U",
+"#U#U#U#U#U#U.zaF.Y.O#Vbn#sbuaa#4bA#y.7#5bNa5#caeat#wbMbMbMbMbMbMbM#D#xbz#DbMbMbM#A.G#U#U#U#U#U#U",
+"#U#U#U#U.rbdbO#E.d#n#sbuaabybA.M.7#5bN#F#cad.t.u.g#wbMbMbMbMbMbMbGbz.8bMbMbMbMbM#8bp.N#U#U#U#U#U",
+"#U#UbZ#e.vbhbMaza6#saaby#4.5.5bI#5bNa5.1ae.u#L#M#O.6bpbLbM#u#aaNbEbMbMbMbMbMbMbMbMbMax#U#U#U#U#U",
+"#U#Ubcaoaqbi#Paobnaa#4bA.M.7#5#7a5#cad.t.ubV#O.Hbf.a.T#f.I#7aoaIbEbMbMbMbMbMbMbMbMbMbKay#U#U#U#U",
+"#U#UaU.Obna6aU#nby#4.5.7bI.q#F#cadbP.ubV#N#Obf.A#T.D.c#Xbfaobf#3a3.8bMbMbMbMbMbMbMbMbGbm#U#U#U#U",
+"#Uadajbu#sbu#n#4.M#y#B#5bNa5a7adbS#Lai#O.H.#.a.Cat#Xbo.VaC.f.gbC.Ybl#DbMbMbMbMbMbLbp.X#U#U#U#U#U",
+"#UbAawaaaabybA.M.7bI#7#F#cad.t.u#LbZ#Obf.##T#Tav.dboa##v.g.L.laI#6ar#xbMbMbMbMbG.PaS#U#U#U#U#U#U",
+"#Ubcbiby#4bA.7bI.qa.a5.1ad.u#L#M#OaB.#.a.Dav.dbr.V#v.f.g.k#C.T#6.YabaP#AbM#Dbz#waK.z#U#U#U#U#U#U",
+"#UbP#0bA#y.7#5#7a5a7aebS.uai#O.Hbf.a.C#p.cbobr#v.f.J.N.laIa1.x#G.3.4bTbJbzaObKbM#9a9#U#U#U#U#U#U",
+"#U..bM.X#O#7a.a5a7aebS#L#M#Obf.#.f#2.saf.w.V#v#3.LbCaI.Ta1.xab.3aQbTaW.X#AbMbMbM#D#x#v#U#U#U#U#U",
+"#U#U#abhbMa5#eadbS#Lai#O.H.#.a.Qb.bdbl.W.I.Z.l.N.QaIa1.x.rac.4bT.vay#RbLbMbMbMbMbM#9#Y#U#U#U#U#U",
+"#U#U#U#U#bad.t.ubVbZ#Obf.a.C.CbJ#RbEbMbMbK#RazaI#6.x#Gbx.4bT.6.wambhbMbMbMbMbMbMbM#8a4#HaKar#U#U",
+"#U#U#U#U#bbS#Lai#Obfbf.a.Dav.pbd.WbMbMbMbMbMb#.f##ab.3.4bTah.9am#QblbMbMbMbMbMbMbMbMbMbM#9.o#U#U",
+"#U#U#U#U#6#B#N.Hbf.a#Tat.c.dagbd#wbMbMbMbMbMa8#Mab.4bT.v.wamb1aras#I#.bMbMbMbMbMbMbMbMbM#D.o#U#U",
+"#U#UbZaAa6#cbf.##T#Tav.dbr.V.Bbd#wbMbV.Na2aKbM.L#MaS.wbXb1#aas#h.E.Za2bMbMbMbMbMbMbMbM#z#Z.o#U#U",
+"#UbZa6aw.ubf#T.Dav.c#0.V#v.f.vbd#wbFac#oaObRbMa8#g.vb1#Q.zbQ#h.b.G#1aYbMbMbMbMbMbM.8#ubdaT.o#U#U",
+"#Uadaobf.A#Tat.c.dbra#.f#3.N.Tba#ibMbfaDbj#HbMbMaU.Y#aasbQau#Y.Gbq#2aX#obtaO#DbLaJbpbabWaP.o#U#U",
+"#UbZaU.t.Dav#Xbo.V#v#3.JbC.Q#6aN.0bMbk#0aObRbMbMbN#ObQ#hb#.Gbqaz#m.haH#r.S.XbjaM.P#JbFbB.y.o#U#U",
+"#U#Ua6.5.F#0br#v.e.g.N.laI#6.x#Q.m.IbM#Z#HbRbMbMac.c.bbb#1az#lbg.Kbk#r.n.Ubs.Ib0.yaPaTbY.W.r#U#U",
+"#U#Ubn#Vbr.V.f.g.L.kaI.T.x.Yab.4.iasbMbMbMbMbMbMbS.a.Gay#2bg.hbk#r.naX#t.Z.2bd#faRaVapbt#Y#U#U#U",
+"#U#Uad#g.d.f.LbC.l.T.p.x#GacaQbT.TaabhbMbMbMbMaRa6.waz#maEaH#qbmaXaZbvaN.saRbe.yak#dbt#Y#U#U#U#U",
+"#U#U#UaU#v.N.laI.T.x##ab.4aQ.6.w.9.c#n.nbMbM.n#Vbn#lbg.K.j#r.n.U.Xbw.0aPaRaTbjal#i#u.r#U#U#U#U#U",
+"#U#U#UaibhbMbMbMakab.3.4aSaW.wb1#a.zb2aqaUaUaUbPb#.haH#r.RaX#tbv.0.saRbWalan.Pb0#8#i#U#U#U#U#U#U",
+"#U#U#U.V.6.6.6#a.WaragbH.wamb1aras#hau.G.T.p#Q.haG#qbm.naXbvaN.2aPbFap#k#i#j.W#8#.a4.y#U#U#U#U#U",
+"#U#U#U#U#U#U#U#UbgaVaW.9b1#Q.zbQ.E#W.Gayaz#m.K.j#q.SaXbsbv.0bBaRbF.yb.#Rbpbt#A#.bM#8#H#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#Ua8aub1.z.B.Eb#.G#1#2#maEaGbk.RaXbsbvaN.saRbFaTak#K.I#zbMbMbMaYa2aK#Y#U#U#U#U#U",
+"#U#U#U#U#U#U#U#UbN#s.Eas#h.Ebb.Gbq#l#S.KaH#r.maZ.X.Z.2aPbDaTbYan#IbdbEbMbMbMbMbObO#Y#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#UawbSbQ.E#Y.Gbq#2#m.KaH#r.S.n#tbv.0bBaRbFbJana3#d#fbl#AbMbMbMbOa4#Y#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#Ua6au.b.G#1az#lbg.K#qbm.nbsbv.0.2bBbFaTbYana3#da8#jbdbp#Aa2bOa2.b#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#UbV#d.nbq#2bg.haH#r.SaXbsbv.0.sbDbFbWaka3#d#f#ib.bab0aD#uaJa2.b#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U.vbla9aGaH.Xb..0#t.X.0.saRbFbJakap#b#I#K#i#kaxb0be.IbjaO.k#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#GbWbtbF.Wbp#daOa9aPbDaTbY.ya3#da9bebj#kaxbe#RaFblaM.Y#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#0bQblbz#a#U.kax#IbJakap#b#fbdaO#zbM#wax.IaF.WaO.Y#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#Ubmb.apa3#da8#i#ibMbMbMbMaJbl#o#dbr#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#Ubm#o#d#f#i#k#k#ibMbMbMbMbMbpaS#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#lbpaxbabaaxba#ibzbzbM#daS#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#db0b0b0#Z#wbjbg#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U",
+"#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U#U"
+};
diff --git a/examples/demo/opengl/glbox.cpp b/examples/demo/opengl/glbox.cpp
new file mode 100644
index 0000000..6e9e686
--- /dev/null
+++ b/examples/demo/opengl/glbox.cpp
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget displaying an openGL wireframe box
+**
+** The OpenGL code is mostly borrowed from Brian Pauls "spin" example
+** in the Mesa distribution
+**
+****************************************************************************/
+
+#include "glbox.h"
+
+#if defined(Q_CC_MSVC)
+#pragma warning(disable:4305) // init: truncation from const double to float
+#endif
+
+/*!
+ Create a GLBox widget
+*/
+
+GLBox::GLBox( QWidget* parent, const char* name, WFlags f )
+ : GLControlWidget( parent, name, 0, f )
+{
+ setAnimationDelay( -1 );
+ xRot = yRot = zRot = 0.0; // default object rotation
+ scale = 1.25; // default object scale
+ object = 0;
+}
+
+
+/*!
+ Release allocated resources
+*/
+
+GLBox::~GLBox()
+{
+ makeCurrent();
+ glDeleteLists( object, 1 );
+}
+
+
+/*!
+ Paint the box. The actual openGL commands for drawing the box are
+ performed here.
+*/
+
+void GLBox::paintGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glLoadIdentity();
+ transform();
+ glCallList( object );
+ drawText();
+ qglColor( green );
+ glLineWidth( 1.0 );
+ glBegin( GL_LINES );
+ {
+ glVertex3f( 0.0, 0.0, 0.0 );
+ glVertex3f( 0.98, 0.98, 0.98 );
+ }
+ glEnd();
+ renderText( 1.0, 1.0, 1.0, "Wirebox", QFont( "helvetica", 12, QFont::Bold, TRUE ) );
+}
+
+
+/*!
+ Set up the OpenGL rendering state, and define display list
+*/
+
+void GLBox::initializeGL()
+{
+ qglClearColor( black ); // Let OpenGL clear to black
+ object = makeObject(); // Generate an OpenGL display list
+ glShadeModel( GL_FLAT );
+}
+
+
+
+/*!
+ Set up the OpenGL view port, matrix mode, etc.
+*/
+
+void GLBox::resizeGL( int w, int h )
+{
+ glViewport( 0, 0, (GLint)w, (GLint)h );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
+ glMatrixMode( GL_MODELVIEW );
+}
+
+
+/*!
+ Generate an OpenGL display list for the object to be shown, i.e. the box
+*/
+
+GLuint GLBox::makeObject()
+{
+ GLuint list;
+
+ list = glGenLists( 1 );
+
+ glNewList( list, GL_COMPILE );
+
+ qglColor( white ); // Shorthand for glColor3f or glIndex
+
+ glLineWidth( 2.0 );
+
+ glBegin( GL_LINE_LOOP );
+ glVertex3f( 1.0, 0.5, -0.4 );
+ glVertex3f( 1.0, -0.5, -0.4 );
+ glVertex3f( -1.0, -0.5, -0.4 );
+ glVertex3f( -1.0, 0.5, -0.4 );
+ glEnd();
+
+ glBegin( GL_LINE_LOOP );
+ glVertex3f( 1.0, 0.5, 0.4 );
+ glVertex3f( 1.0, -0.5, 0.4 );
+ glVertex3f( -1.0, -0.5, 0.4 );
+ glVertex3f( -1.0, 0.5, 0.4 );
+ glEnd();
+
+ glBegin( GL_LINES );
+ glVertex3f( 1.0, 0.5, -0.4 ); glVertex3f( 1.0, 0.5, 0.4 );
+ glVertex3f( 1.0, -0.5, -0.4 ); glVertex3f( 1.0, -0.5, 0.4 );
+ glVertex3f( -1.0, -0.5, -0.4 ); glVertex3f( -1.0, -0.5, 0.4 );
+ glVertex3f( -1.0, 0.5, -0.4 ); glVertex3f( -1.0, 0.5, 0.4 );
+ glEnd();
+
+ glEndList();
+
+ return list;
+}
diff --git a/examples/demo/opengl/glbox.h b/examples/demo/opengl/glbox.h
new file mode 100644
index 0000000..6f5089b
--- /dev/null
+++ b/examples/demo/opengl/glbox.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLBOX_H
+#define GLBOX_H
+
+#include "glcontrolwidget.h"
+
+class GLBox : public GLControlWidget
+{
+ Q_OBJECT
+
+public:
+
+ GLBox( QWidget* parent = 0, const char* name = 0, WFlags f = 0 );
+ ~GLBox();
+
+protected:
+
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ virtual GLuint makeObject();
+
+private:
+ GLuint object;
+};
+
+
+#endif // GLBOX_H
diff --git a/examples/demo/opengl/glcontrolwidget.cpp b/examples/demo/opengl/glcontrolwidget.cpp
new file mode 100644
index 0000000..d81d328
--- /dev/null
+++ b/examples/demo/opengl/glcontrolwidget.cpp
@@ -0,0 +1,195 @@
+#include "glcontrolwidget.h"
+
+#include <qcursor.h>
+#include <qtimer.h>
+
+#include <math.h>
+
+GLControlWidget::GLControlWidget( QWidget *parent, const char *name, QGLWidget *share, WFlags f )
+: QGLWidget( parent, name, share, f ),
+ xRot(0),yRot(0),zRot(0),xTrans(0),yTrans(0),zTrans(-10.0),scale(5.0), animation(TRUE), wasAnimated(FALSE), delay( 50 )
+{
+ setCursor( pointingHandCursor );
+ timer = new QTimer( this );
+ connect( timer, SIGNAL(timeout()), SLOT(animate()) );
+ timer->start( delay );
+}
+
+void GLControlWidget::transform()
+{
+ glTranslatef( xTrans, yTrans, zTrans );
+ glScalef( scale, scale, scale );
+
+ glRotatef( xRot, 1.0, 0.0, 0.0 );
+ glRotatef( yRot, 0.0, 1.0, 0.0 );
+ glRotatef( zRot, 0.0, 0.0, 1.0 );
+}
+
+void GLControlWidget::drawText()
+{
+ glPushAttrib( GL_LIGHTING_BIT | GL_TEXTURE_BIT );
+ glDisable( GL_LIGHTING );
+ glDisable( GL_TEXTURE_2D );
+ qglColor( white );
+ QString str( "Rendering text in OpenGL is easy with Qt" );
+ QFontMetrics fm( font() );
+ renderText( (width() - fm.width( str )) / 2, 15, str );
+ QFont f( "courier", 8 );
+ QFontMetrics fmc( f );
+ qglColor( QColor("skyblue") );
+ int x, y, z;
+ x = (xRot >= 0) ? (int) xRot % 360 : 359 - (QABS((int) xRot) % 360);
+ y = (yRot >= 0) ? (int) yRot % 360 : 359 - (QABS((int) yRot) % 360);
+ z = (zRot >= 0) ? (int) zRot % 360 : 359 - (QABS((int) zRot) % 360);
+ str.sprintf( "Rot X: %03d - Rot Y: %03d - Rot Z: %03d", x, y, z );
+ renderText( (width() - fmc.width( str )) / 2, height() - 15, str, f );
+ glPopAttrib();
+}
+
+/*!
+ Set the rotation angle of the object to \e degrees around the X axis.
+*/
+void GLControlWidget::setXRotation( double degrees )
+{
+ xRot = (GLfloat)fmod(degrees, 360.0);
+ updateGL();
+}
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Y axis.
+*/
+void GLControlWidget::setYRotation( double degrees )
+{
+ yRot = (GLfloat)fmod(degrees, 360.0);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Z axis.
+*/
+void GLControlWidget::setZRotation( double degrees )
+{
+ zRot = (GLfloat)fmod(degrees, 360.0);
+ updateGL();
+}
+
+void GLControlWidget::setScale( double s )
+{
+ scale = s;
+ updateGL();
+}
+
+void GLControlWidget::setXTrans( double x )
+{
+ xTrans = x;
+ updateGL();
+}
+
+void GLControlWidget::setYTrans( double y )
+{
+ yTrans = y;
+ updateGL();
+}
+
+void GLControlWidget::setZTrans( double z )
+{
+ zTrans = z;
+ updateGL();
+}
+
+void GLControlWidget::setRotationImpulse( double x, double y, double z )
+{
+ setXRotation( xRot + 180*x );
+ setYRotation( yRot + 180*y );
+ setZRotation( zRot - 180*z );
+}
+
+void GLControlWidget::setTranslationImpulse( double x, double y, double z )
+{
+ setXTrans( xTrans + 2*x );
+ setYTrans( yTrans - 2*y );
+ setZTrans( zTrans + 2*z );
+}
+
+void GLControlWidget::mousePressEvent( QMouseEvent *e )
+{
+ e->accept();
+ oldPos = e->pos();
+}
+
+void GLControlWidget::mouseReleaseEvent( QMouseEvent *e )
+{
+ e->accept();
+ oldPos = e->pos();
+}
+
+void GLControlWidget::mouseMoveEvent( QMouseEvent *e )
+{
+ e->accept();
+ double dx = e->x() - oldPos.x();
+ double dy = e->y() - oldPos.y();
+
+ oldPos = e->pos();
+
+ double rx = dx / width();
+ double ry = dy / height();
+
+ if ( e->state() == LeftButton )
+ setRotationImpulse( ry, rx, 0 );
+ else if ( e->state() == RightButton )
+ setRotationImpulse( ry, 0, rx );
+ else if ( e->state() == MidButton )
+ setTranslationImpulse( rx, ry, 0 );
+ else if ( e->state() == ( LeftButton | RightButton ) )
+ setTranslationImpulse( rx, 0, ry );
+}
+
+void GLControlWidget::wheelEvent( QWheelEvent *e )
+{
+ e->accept();
+ if ( scale <= ( (double)e->delta() / 1000 ) )
+ return;
+ setScale( scale - ( (double)e->delta() / 1000 ));
+}
+
+void GLControlWidget::mouseDoubleClickEvent( QMouseEvent * )
+{
+ if ( delay <= 0 )
+ return;
+
+ animation = !animation;
+ if ( animation )
+ timer->start( delay );
+ else
+ timer->stop();
+}
+
+void GLControlWidget::showEvent( QShowEvent *e )
+{
+ if ( wasAnimated && !timer->isActive() )
+ timer->start( delay );
+
+ QGLWidget::showEvent( e );
+}
+
+void GLControlWidget::hideEvent( QHideEvent *e )
+{
+ wasAnimated = timer->isActive();
+ timer->stop();
+ QGLWidget::hideEvent( e );
+}
+
+void GLControlWidget::animate()
+{
+}
+
+void GLControlWidget::setAnimationDelay( int ms )
+{
+ timer->stop();
+ delay = ms;
+ if ( animation ) {
+ wasAnimated = TRUE;
+ timer->start( delay );
+ }
+}
diff --git a/examples/demo/opengl/glcontrolwidget.h b/examples/demo/opengl/glcontrolwidget.h
new file mode 100644
index 0000000..05d026f
--- /dev/null
+++ b/examples/demo/opengl/glcontrolwidget.h
@@ -0,0 +1,56 @@
+#ifndef GLCONTROLWIDGET_H
+#define GLCONTROLWIDGET_H
+
+#include <qgl.h>
+
+class GLControlWidget : public QGLWidget
+{
+ Q_OBJECT
+
+public:
+ GLControlWidget( QWidget *parent, const char *name = 0, QGLWidget *share = 0, WFlags f = 0 );
+
+ virtual void transform();
+
+public slots:
+ void setXRotation( double degrees );
+ void setYRotation( double degrees );
+ void setZRotation( double degrees );
+
+ void setScale( double s );
+
+ void setXTrans( double x );
+ void setYTrans( double y );
+ void setZTrans( double z );
+
+ virtual void setRotationImpulse( double x, double y, double z );
+ virtual void setTranslationImpulse( double x, double y, double z );
+ void drawText();
+
+protected:
+ void setAnimationDelay( int ms );
+ void mousePressEvent( QMouseEvent *e );
+ void mouseReleaseEvent( QMouseEvent *e );
+ void mouseMoveEvent( QMouseEvent * );
+ void mouseDoubleClickEvent( QMouseEvent * );
+ void wheelEvent( QWheelEvent * );
+
+ void showEvent( QShowEvent * );
+ void hideEvent( QHideEvent * );
+
+ GLfloat xRot, yRot, zRot;
+ GLfloat xTrans, yTrans, zTrans;
+ GLfloat scale;
+ bool animation;
+
+protected slots:
+ virtual void animate();
+
+private:
+ bool wasAnimated;
+ QPoint oldPos;
+ QTimer* timer;
+ int delay;
+};
+
+#endif
diff --git a/examples/demo/opengl/glgear.cpp b/examples/demo/opengl/glgear.cpp
new file mode 100644
index 0000000..e9b837b
--- /dev/null
+++ b/examples/demo/opengl/glgear.cpp
@@ -0,0 +1,271 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// Draws a gear.
+//
+// Portions of this code have been borrowed from Brian Paul's Mesa
+// distribution.
+//
+
+#include "glgear.h"
+
+#include <math.h>
+
+#if defined(Q_CC_MSVC)
+#pragma warning(disable:4305) // init: truncation from const double to float
+#endif
+
+/*
+ * Draw a gear wheel. You'll probably want to call this function when
+ * building a display list since we do a lot of trig here.
+ *
+ * Input: inner_radius - radius of hole at center
+ * outer_radius - radius at center of teeth
+ * width - width of gear
+ * teeth - number of teeth
+ * tooth_depth - depth of tooth
+ */
+static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+ GLint teeth, GLfloat tooth_depth )
+{
+ GLint i;
+ GLfloat r0, r1, r2;
+ GLfloat angle, da;
+ GLfloat u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth/2.0;
+ r2 = outer_radius + tooth_depth/2.0;
+
+ const double pi = 3.14159264;
+ da = 2.0*pi / teeth / 4.0;
+
+ glShadeModel( GL_FLAT );
+
+ glNormal3f( 0.0, 0.0, 1.0 );
+
+ /* draw front face */
+ glBegin( GL_QUAD_STRIP );
+ for (i=0;i<=teeth;i++) {
+ angle = i * 2.0*pi / teeth;
+ glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
+ glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
+ glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
+ glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
+ }
+ glEnd();
+
+ /* draw front sides of teeth */
+ glBegin( GL_QUADS );
+ da = 2.0*pi / teeth / 4.0;
+ for (i=0;i<teeth;i++) {
+ angle = i * 2.0*pi / teeth;
+
+ glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
+ glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 );
+ glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 );
+ glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
+ }
+ glEnd();
+
+
+ glNormal3f( 0.0, 0.0, -1.0 );
+
+ /* draw back face */
+ glBegin( GL_QUAD_STRIP );
+ for (i=0;i<=teeth;i++) {
+ angle = i * 2.0*pi / teeth;
+ glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
+ glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
+ glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
+ glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
+ }
+ glEnd();
+
+ /* draw back sides of teeth */
+ glBegin( GL_QUADS );
+ da = 2.0*pi / teeth / 4.0;
+ for (i=0;i<teeth;i++) {
+ angle = i * 2.0*pi / teeth;
+
+ glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
+ glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
+ glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 );
+ glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
+ }
+ glEnd();
+
+
+ /* draw outward faces of teeth */
+ glBegin( GL_QUAD_STRIP );
+ for (i=0;i<teeth;i++) {
+ angle = i * 2.0*pi / teeth;
+
+ glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
+ glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
+ u = r2*cos(angle+da) - r1*cos(angle);
+ v = r2*sin(angle+da) - r1*sin(angle);
+ len = sqrt( u*u + v*v );
+ u /= len;
+ v /= len;
+ glNormal3f( v, -u, 0.0 );
+ glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 );
+ glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 );
+ glNormal3f( cos(angle), sin(angle), 0.0 );
+ glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 );
+ glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
+ u = r1*cos(angle+3*da) - r2*cos(angle+2*da);
+ v = r1*sin(angle+3*da) - r2*sin(angle+2*da);
+ glNormal3f( v, -u, 0.0 );
+ glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
+ glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
+ glNormal3f( cos(angle), sin(angle), 0.0 );
+ }
+
+ glVertex3f( r1*cos(0.0), r1*sin(0.0), width*0.5 );
+ glVertex3f( r1*cos(0.0), r1*sin(0.0), -width*0.5 );
+
+ glEnd();
+
+
+ glShadeModel( GL_SMOOTH );
+
+ /* draw inside radius cylinder */
+ glBegin( GL_QUAD_STRIP );
+ for (i=0;i<=teeth;i++) {
+ angle = i * 2.0*pi / teeth;
+ glNormal3f( -cos(angle), -sin(angle), 0.0 );
+ glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
+ glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
+ }
+ glEnd();
+
+}
+
+void GLGear::draw()
+{
+ glPushMatrix();
+ glRotatef( view_rotx, 1.0, 0.0, 0.0 );
+ glRotatef( view_roty, 0.0, 1.0, 0.0 );
+ glRotatef( view_rotz, 0.0, 0.0, 1.0 );
+
+ glPushMatrix();
+ glTranslatef( -3.0, -2.0, 0.0 );
+ glRotatef( angle, 0.0, 0.0, 1.0 );
+ glCallList(gear1);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef( 3.1, -2.0, 0.0 );
+ glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 );
+ glCallList(gear2);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef( -3.1, 2.2, -1.8 );
+ glRotatef( 90.0, 1.0, 0.0, 0.0 );
+ glRotatef( 2.0*angle-2.0, 0.0, 0.0, 1.0 );
+ glCallList(gear3);
+ glPopMatrix();
+
+ glPopMatrix();
+}
+
+GLGear::GLGear( QWidget *parent, const char *name, WFlags f )
+ : GLControlWidget( parent, name, 0, f )
+{
+ scale = 1.0;
+ setAnimationDelay( 15 );
+ view_rotx = 20.0;
+ view_roty = 30.0;
+ view_rotz = 0.0;
+ angle = 0.0;
+}
+
+void GLGear::initializeGL()
+{
+ static GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 };
+ static GLfloat ared[4] = {0.8, 0.1, 0.0, 1.0 };
+ static GLfloat agreen[4] = {0.0, 0.8, 0.2, 1.0 };
+ static GLfloat ablue[4] = {0.2, 0.2, 1.0, 1.0 };
+
+ glLightfv( GL_LIGHT0, GL_POSITION, pos );
+ glEnable( GL_CULL_FACE );
+ glEnable( GL_LIGHTING );
+ glEnable( GL_LIGHT0 );
+ glEnable( GL_DEPTH_TEST );
+
+ /* make the gears */
+ gear1 = glGenLists(1);
+ glNewList(gear1, GL_COMPILE);
+ glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ared );
+ gear( 1.0, 4.0, 1.0, 20, 0.7 );
+ glEndList();
+
+ gear2 = glGenLists(1);
+ glNewList(gear2, GL_COMPILE);
+ glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, agreen );
+ gear( 0.5, 2.0, 2.0, 10, 0.7 );
+ glEndList();
+
+ gear3 = glGenLists(1);
+ glNewList(gear3, GL_COMPILE);
+ glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ablue );
+ gear( 1.3, 2.0, 0.5, 10, 0.7 );
+ glEndList();
+
+ glEnable( GL_NORMALIZE );
+}
+
+
+void GLGear::resizeGL( int width, int height )
+{
+ GLfloat w = (float) width / (float) height;
+ GLfloat h = 1.0;
+
+ glViewport( 0, 0, width, height );
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum( -w, w, -h, h, 5.0, 60.0 );
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -40.0 );
+}
+
+
+void GLGear::paintGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glPushMatrix();
+ transform();
+ draw();
+ drawText();
+
+ glPushAttrib( GL_LIGHTING_BIT | GL_TEXTURE_BIT );
+ glDisable( GL_LIGHTING );
+ glDisable( GL_TEXTURE_2D );
+ qglColor( green );
+ glLineWidth( 1.0 );
+ glBegin( GL_LINES );
+ {
+ glVertex3f( 0.0, 0.0, 0.0 );
+ glVertex3f( 2.98, 2.98, 2.98 );
+ }
+ glEnd();
+ renderText( 3.0, 3.0, 3.0, "Gears", QFont( "helvetica", 12, QFont::Bold, TRUE ) );
+ glPopMatrix();
+ glPopAttrib();
+}
+
+void GLGear::animate()
+{
+ angle += 2.0;
+ view_roty += 1.0;
+ updateGL();
+}
diff --git a/examples/demo/opengl/glgear.h b/examples/demo/opengl/glgear.h
new file mode 100644
index 0000000..e728765
--- /dev/null
+++ b/examples/demo/opengl/glgear.h
@@ -0,0 +1,26 @@
+#ifndef GLGEAR_H
+#define GLGEAR_H
+
+#include "glcontrolwidget.h"
+
+class GLGear : public GLControlWidget
+{
+ Q_OBJECT
+
+public:
+ GLGear( QWidget *parent = 0, const char *name = 0, WFlags f = 0 );
+
+protected:
+ void draw();
+ void animate();
+ void initializeGL();
+ void resizeGL( int, int );
+ void paintGL();
+
+private:
+ GLfloat view_rotx, view_roty, view_rotz;
+ GLint gear1, gear2, gear3;
+ GLfloat angle;
+};
+
+#endif // GLGEAR_H
diff --git a/examples/demo/opengl/glinfo.h b/examples/demo/opengl/glinfo.h
new file mode 100644
index 0000000..1e1d1dd
--- /dev/null
+++ b/examples/demo/opengl/glinfo.h
@@ -0,0 +1,26 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef GLINFO_H
+#define GLINFO_H
+
+#include <qstring.h>
+
+class GLInfo
+{
+public:
+ GLInfo();
+ QString info();//extensions();
+/* QString configs(); */
+
+protected:
+ QString infotext;
+/* QString config; */
+};
+#endif
diff --git a/examples/demo/opengl/glinfo_x11.cpp b/examples/demo/opengl/glinfo_x11.cpp
new file mode 100644
index 0000000..1137ef9
--- /dev/null
+++ b/examples/demo/opengl/glinfo_x11.cpp
@@ -0,0 +1,257 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#define QT_CLEAN_NAMESPACE // avoid clashes with Xmd.h
+
+#include <qstringlist.h>
+#include <qgl.h>
+#include "glinfo.h"
+
+#include <GL/glx.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#ifndef GLX_NONE_EXT
+#define GLX_NONE_EXT 0x8000
+#endif
+
+typedef struct visualAttribs {
+ /* X visual attribs */
+ int id;
+ int c_class;
+ int depth;
+ int redMask, greenMask, blueMask;
+ int colormapSize;
+ int bitsPerRGB;
+ /* GL visual attribs */
+ int supportsGL;
+ int transparent;
+ int bufferSize;
+ int level;
+ int rgba;
+ int doubleBuffer;
+ int stereo;
+ int auxBuffers;
+ int redSize, greenSize, blueSize, alphaSize;
+ int depthSize;
+ int stencilSize;
+ int accumRedSize, accumGreenSize, accumBlueSize, accumAlphaSize;
+ int numSamples, numMultisample;
+ int visualCaveat;
+} VisualAttribs;
+
+static void screenInfo( Display *dpy, int scrnum, QString &infotext )
+{
+ const char *serverVendor = glXQueryServerString( dpy, scrnum, GLX_VENDOR );
+ const char *serverVersion = glXQueryServerString( dpy, scrnum, GLX_VERSION );
+ const char *serverExtensions = glXQueryServerString( dpy, scrnum, GLX_EXTENSIONS );
+ const char *clientVendor = glXGetClientString( dpy, GLX_VENDOR );
+ const char *clientVersion = glXGetClientString( dpy, GLX_VERSION );
+ const char *clientExtensions = glXGetClientString( dpy, GLX_EXTENSIONS );
+ const char *glxExtensions = glXQueryExtensionsString( dpy, scrnum );
+ const char *glVendor = (const char *) glGetString( GL_VENDOR );
+ const char *glRenderer = (const char *) glGetString( GL_RENDERER );
+ const char *glVersion = (const char *) glGetString( GL_VERSION );
+ const char *glExtensions = (const char *) glGetString( GL_EXTENSIONS );
+ const char *gluVersion = (const char *) gluGetString( (GLenum) GLU_VERSION );
+ const char *gluExtensions = (const char *) gluGetString( (GLenum) GLU_EXTENSIONS );
+
+ infotext.sprintf( "%sServer GLX vendor string: %s\n", infotext.ascii(), serverVendor );
+ infotext.sprintf( "%sServer GLX version string: %s\n", infotext.ascii(), serverVersion );
+ infotext.sprintf( "%sServer GLX extensions:\n", infotext.ascii() );
+
+ infotext += QString( serverExtensions ).replace( ' ', '\n' ) + "\n\n";
+
+ infotext.sprintf( "%sClient GLX vendor string: %s\n", infotext.ascii(), clientVendor );
+ infotext.sprintf( "%sClient GLX version string: %s\n", infotext.ascii(), clientVersion );
+ infotext.sprintf( "%sClient GLX extensions:\n", infotext.ascii() );
+
+ infotext += QString( clientExtensions ).replace( ' ', '\n' ) + "\n\n";
+
+ infotext.sprintf( "%sGLX extensions:\n", infotext.ascii() );
+
+ infotext += QString( glxExtensions ).replace( ' ', '\n' ) + "\n\n";
+
+ infotext.sprintf( "%sOpenGL vendor string: %s\n", infotext.ascii(), glVendor );
+ infotext.sprintf( "%sOpenGL renderer string: %s\n", infotext.ascii(), glRenderer );
+ infotext.sprintf( "%sOpenGL version string: %s\n", infotext.ascii(), glVersion );
+ infotext.sprintf( "%sOpenGL extensions:\n", infotext.ascii() );
+
+ infotext += QString( glExtensions ).replace( ' ', '\n' ) + "\n\n";
+
+ infotext.sprintf( "%sGLU version: %s\n", infotext.ascii(), gluVersion );
+ infotext.sprintf( "%sGLU extensions:\n", infotext.ascii() );
+
+ infotext += QString( gluExtensions ).replace( ' ', '\n' ) + "\n\n";
+}
+
+static const char * visualClassName( int cls )
+{
+ switch ( cls ) {
+ case StaticColor:
+ return "StaticColor";
+ case PseudoColor:
+ return "PseudoColor";
+ case StaticGray:
+ return "StaticGray";
+ case GrayScale:
+ return "GrayScale";
+ case TrueColor:
+ return "TrueColor";
+ case DirectColor:
+ return "DirectColor";
+ default:
+ return "";
+ }
+}
+
+static const char * caveatString( int caveat )
+{
+ switch ( caveat ) {
+#if defined(GLX_EXT_visual_rating)
+ case GLX_NONE_EXT:
+ return "None";
+ case GLX_SLOW_VISUAL_EXT:
+ return "Slow";
+ case GLX_NON_CONFORMANT_VISUAL_EXT:
+ return "Nonconformant";
+#endif
+ default:
+ return "<none>";
+ }
+}
+
+static void visualAttribs( Display * dpy, XVisualInfo * vi, VisualAttribs * attribs )
+{
+ memset( attribs, 0, sizeof( VisualAttribs ) );
+
+ attribs->id = vi->visualid;
+ attribs->c_class = vi->c_class;
+ attribs->depth = vi->depth;
+ attribs->redMask = vi->red_mask;
+ attribs->greenMask = vi->green_mask;
+ attribs->blueMask = vi->blue_mask;
+ attribs->colormapSize = vi->colormap_size;
+ attribs->bitsPerRGB = vi->bits_per_rgb;
+
+ if ( glXGetConfig( dpy, vi, GLX_USE_GL, &attribs->supportsGL ) != 0 )
+ return;
+ attribs->accumAlphaSize = 0;
+ glXGetConfig( dpy, vi, GLX_BUFFER_SIZE, &attribs->bufferSize );
+ glXGetConfig( dpy, vi, GLX_LEVEL, &attribs->level );
+ glXGetConfig( dpy, vi, GLX_RGBA, &attribs->rgba );
+ glXGetConfig( dpy, vi, GLX_DOUBLEBUFFER, &attribs->doubleBuffer );
+ glXGetConfig( dpy, vi, GLX_STEREO, &attribs->stereo );
+ glXGetConfig( dpy, vi, GLX_AUX_BUFFERS, &attribs->auxBuffers );
+ glXGetConfig( dpy, vi, GLX_RED_SIZE, &attribs->redSize );
+ glXGetConfig( dpy, vi, GLX_GREEN_SIZE, &attribs->greenSize );
+ glXGetConfig( dpy, vi, GLX_BLUE_SIZE, &attribs->blueSize );
+ glXGetConfig( dpy, vi, GLX_ALPHA_SIZE, &attribs->alphaSize );
+ glXGetConfig( dpy, vi, GLX_DEPTH_SIZE, &attribs->depthSize );
+ glXGetConfig( dpy, vi, GLX_STENCIL_SIZE, &attribs->stencilSize );
+ glXGetConfig( dpy, vi, GLX_ACCUM_RED_SIZE, &attribs->accumRedSize );
+ glXGetConfig( dpy, vi, GLX_ACCUM_GREEN_SIZE, &attribs->accumGreenSize );
+ glXGetConfig( dpy, vi, GLX_ACCUM_BLUE_SIZE, &attribs->accumBlueSize );
+ glXGetConfig( dpy, vi, GLX_ACCUM_ALPHA_SIZE, &attribs->accumAlphaSize );
+
+ attribs->transparent = 0; // transparent pixel missing
+ attribs->numSamples = 0; // multisample tests missing
+ attribs->numMultisample = 0;
+
+#if defined(GLX_EXT_visual_rating)
+ const char *ext = glXQueryExtensionsString( dpy, vi->screen );
+ if ( ext && strstr( ext, "GLX_EXT_visual_rating" ) )
+ glXGetConfig(dpy, vi, GLX_VISUAL_CAVEAT_EXT, &attribs->visualCaveat);
+ else
+ attribs->visualCaveat = GLX_NONE_EXT;
+#else
+ attribs->visualCaveat = 0;
+#endif
+}
+
+static void visualInfo( Display *dpy, int scrnum, QString &configs )
+{
+ QString str;
+ XVisualInfo *visuals, temp;
+ int numVisuals;
+ long mask;
+ int i;
+
+ /* get list of all visuals on this screen */
+ temp.screen = scrnum;
+ mask = VisualScreenMask;
+ visuals = XGetVisualInfo( dpy, mask, &temp, &numVisuals );
+
+ VisualAttribs attribs;
+ configs.append( "Vis Vis Visual Trans buff lev render DB ste r g b a aux dep ste accum buffers MS MS\n"
+ " ID Depth Type parent size el type reo sz sz sz sz buf th ncl r g b a num bufs Caveat\n"
+ "-----------------------------------------------------------------------------------------------------------\n" );
+ for ( i = 0; i < numVisuals; i++ ) {
+ visualAttribs( dpy, &visuals[i], &attribs );
+ str.sprintf( "0x%2x %2d %-12s %d %2d %d %-4s %d %d %d %d %d %d"
+ " %d %2d %d %2d %2d %2d %2d %d %d %s\n",
+ attribs.id,
+ attribs.depth,
+ visualClassName( attribs.c_class ),
+ attribs.transparent,
+ attribs.bufferSize,
+ attribs.level,
+ attribs.rgba ? "rgba" : "ci",
+ attribs.doubleBuffer,
+ attribs.stereo,
+ attribs.redSize,
+ attribs.greenSize,
+ attribs.blueSize,
+ attribs.alphaSize,
+ attribs.auxBuffers,
+ attribs.depthSize,
+ attribs.stencilSize,
+ attribs.accumRedSize,
+ attribs.accumGreenSize,
+ attribs.accumBlueSize,
+ attribs.accumAlphaSize,
+ attribs.numSamples,
+ attribs.numMultisample,
+ caveatString( attribs.visualCaveat ) );
+ configs.append( str );
+ }
+
+
+ XFree( visuals );
+}
+
+GLInfo::GLInfo()
+{
+ QGLWidget gl((QWidget *) 0);
+ gl.makeCurrent();
+ Display *dpy;
+ char *displayName = 0;
+ int numScreens, scrNum;
+
+ dpy = gl.x11Display();
+ if ( !dpy ) {
+ qWarning( "Error: unable to open display %s\n", displayName );
+ }
+
+ numScreens = ScreenCount( dpy );
+ infotext.sprintf( "Display name: %s\nDirect rendering: %s\n", DisplayString( dpy ),
+ gl.format().directRendering() ? "Yes" : "No" );
+
+ for ( scrNum = 0; scrNum < numScreens; scrNum++ ) {
+ screenInfo( dpy, scrNum, infotext );
+ visualInfo( dpy, scrNum, infotext );
+ if ( scrNum + 1 < numScreens )
+ infotext.append( "\n\n" );
+ }
+}
+
+QString GLInfo::info()
+{
+ return infotext;
+}
diff --git a/examples/demo/opengl/glinfotext.h b/examples/demo/opengl/glinfotext.h
new file mode 100644
index 0000000..7d7b656
--- /dev/null
+++ b/examples/demo/opengl/glinfotext.h
@@ -0,0 +1,23 @@
+#include <qlayout.h>
+#include <qtextview.h>
+#include <qfont.h>
+#include "glinfo.h"
+
+class GLInfoText : public QWidget
+{
+public:
+ GLInfoText(QWidget *parent)
+ : QWidget(parent)
+ {
+ view = new QTextView(this);
+ view->setFont(QFont("courier", 10));
+ view->setWordWrap(QTextEdit::NoWrap);
+ QHBoxLayout *l = new QHBoxLayout(this);
+ l->addWidget(view);
+ GLInfo info;
+ view->setText(info.info());
+ }
+
+private:
+ QTextView *view;
+};
diff --git a/examples/demo/opengl/gllandscape.cpp b/examples/demo/opengl/gllandscape.cpp
new file mode 100644
index 0000000..e11c8c9
--- /dev/null
+++ b/examples/demo/opengl/gllandscape.cpp
@@ -0,0 +1,880 @@
+#include <qimage.h>
+#include "gllandscape.h"
+
+
+#include <math.h>
+
+#include "fbm.h"
+
+#ifndef PI
+#define PI 3.14159
+#endif
+
+#if defined(Q_CC_MSVC)
+#pragma warning(disable:4305) // init: truncation from const double to float
+#pragma warning(disable:4244) // init: truncation from const double to float
+#endif
+
+GLLandscape::GLLandscape( QWidget * parent, const char * name )
+ : QGLWidget( parent, name )
+{
+ mouseButtonDown = FALSE;
+ animationRunning = FALSE;
+ oldX = oldY = oldZ = 0.0;
+ landscape = 0;
+ vertexNormals = 0;
+ normals = 0;
+ wave = 0;
+ wt = 0;
+ cubeRot = 0;
+ createGrid( 50 );
+ setWireframe( 0 );
+}
+
+GLLandscape::~GLLandscape()
+{
+ destroyGrid();
+}
+
+void GLLandscape::initializeGL()
+{
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) views[AxisView].model );
+
+ glTranslatef( 0.0, 0.0, -50.0 );
+ glRotatef( -45, 1, 0, 0 );
+ glRotatef( -45, 0, 0, 1 );
+ glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) views[CurrentView].model );
+ glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) views[DefaultView].model );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ /* Use GL utility library function to obtain desired view */
+ gluPerspective( 60, 1, 1, 250 );
+ glGetFloatv( GL_PROJECTION_MATRIX, (GLfloat *)views[CurrentView].projection );
+ glGetFloatv( GL_PROJECTION_MATRIX, (GLfloat *)views[DefaultView].projection );
+
+ qglClearColor( black );
+ glDepthFunc( GL_LESS );
+ calculateVertexNormals();
+
+ QImage tex;
+ tex.load("opengl/qtlogo.png");
+ tex = QGLWidget::convertToGLFormat(tex); // flipped 32bit RGBA
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
+ initDisplayLists();
+}
+
+void GLLandscape::resizeGL( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+}
+
+void GLLandscape::paintGL()
+{
+ QString str;
+ GLboolean lighting;
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ switch ( mode ) {
+ case Wireframe:
+ drawWireframe();
+ str = tr( "Wireframe" );
+ break;
+ case Filled:
+ drawFilled();
+ str = tr( "Flat shaded" );
+ break;
+ case SmoothShaded:
+ str = tr( "Smooth shaded" );
+ drawSmoothShaded();
+ break;
+ case Landscape:
+ drawSmoothShaded();
+ str = tr( "Landscape" );
+ break;
+ }
+ glGetBooleanv( GL_LIGHTING, &lighting );
+ if ( lighting )
+ glDisable( GL_LIGHTING );
+ qglColor( white );
+ renderText(15, height() - 15, str);
+ drawAxis();
+ drawCube();
+ if ( lighting )
+ glEnable( GL_LIGHTING );
+}
+
+void GLLandscape::drawAxis()
+{
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+ glViewport(15, 20, 50, 50);
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(-1.1, 1.1, -1.1, 1.1, 0.1, 10);
+ glTranslatef(0, 0, -1.2);
+ glRotatef(-45, 1, 0, 0);
+ glRotatef(-45, 0, 0, 1);
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadMatrixf((GLfloat *) views[AxisView].model);
+
+ glCallList(axisList);
+ qglColor(white);
+ renderText(1.1f, 0, 0, "x");
+ renderText(0, 1.1f, 0, "y");
+ renderText(0, 0, 1.1f, "z");
+
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glPopAttrib();
+}
+
+void GLLandscape::drawCube()
+{
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+ glViewport(width()-75, 0, 75, 75);
+ glMatrixMode( GL_PROJECTION );
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(-1.1, 1.1, -1.1, 1.1, 0.1, 10);
+ glTranslatef(0, 0, -1.2);
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glRotatef(cubeRot, 1, 0, 0);
+ glRotatef(cubeRot, 0, 1, 0);
+ glRotatef(cubeRot, 0, 0, 1);
+ glTranslatef(-0.5, -0.5, -0.5);
+
+ glCallList(cubeList);
+
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glPopAttrib();
+}
+
+void GLLandscape::drawWireframe()
+{
+ qglColor( white );
+ glBegin( GL_LINES );
+ {
+ for ( int y = 0; y < (gridSize-1); y++ )
+ for ( int x = 0; x < (gridSize-1); x++) {
+ glVertex3f( x-gridHalf, y-gridHalf, landscape[x][y] );
+ glVertex3f( x+1-gridHalf, y-gridHalf, landscape[x+1][y] );
+ glVertex3f( x-gridHalf, y-gridHalf, landscape[x][y] );
+ glVertex3f( x+1-gridHalf, y+1-gridHalf, landscape[x+1][y+1] );
+
+ glVertex3f( x-gridHalf, y-gridHalf, landscape[x][y] );
+ glVertex3f( x-gridHalf, y+1-gridHalf, landscape[x][y+1] );
+ }
+ }
+ glEnd();
+ glBegin( GL_LINE_STRIP );
+ {
+ for ( int x = 0; x < gridSize; x++ ) {
+ glVertex3f( x-gridHalf, gridHalf-1, landscape[x][gridSize-1] );
+ }
+ }
+ glEnd();
+ glBegin( GL_LINE_STRIP );
+ {
+ for ( int y = 0; y < gridSize; y++ ) {
+ glVertex3f( gridHalf-1, y-gridHalf, landscape[gridSize-1][y] );
+ }
+ }
+ glEnd();
+}
+
+void GLLandscape::drawFilled()
+{
+ for ( int y = 0; y < gridSize-1; y++ )
+ for ( int x = 0; x < gridSize-1; x++ ) {
+ qglColor( red );
+ glBegin( GL_TRIANGLE_STRIP );
+ {
+ glVertex3f(x-gridHalf,y-gridHalf, landscape[x][y]);
+ glVertex3f(x+1-gridHalf,y-gridHalf, landscape[x+1][y]);
+ glVertex3f(x-gridHalf,y+1-gridHalf, landscape[x][y+1]);
+ }
+ glEnd();
+ qglColor( white );
+ glBegin( GL_TRIANGLE_STRIP );
+ {
+ glVertex3f(x+1-gridHalf,y-gridHalf, landscape[x+1][y]);
+ glVertex3f(x+1-gridHalf,y+1-gridHalf, landscape[x+1][y+1]);
+ glVertex3f(x-gridHalf,y+1-gridHalf, landscape[x][y+1]);
+ }
+ glEnd();
+ }
+}
+
+void GLLandscape::drawSmoothShaded()
+{
+ if ( mode == SmoothShaded ) {
+ GLfloat materialAmbient[] = { 0.00, 0.00, 1.0, 0.0 };
+ GLfloat materialShininess[] = { 128.0 };
+ GLfloat materialSpecular[] = { 1.0, 1.0, 1.0, 0.0 };
+
+ glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular );
+ glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient );
+ glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess );
+ } else {
+ GLfloat materialAmbient[] = { 0.20, 0.33, 0.20, 0.0 };
+ GLfloat materialShininess[] = { 1.0 };
+ GLfloat materialSpecular[] = { 0.1, 0.1, 0.1, 0.1 };
+
+ glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular );
+ glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient );
+ glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess );
+ }
+
+ for ( int y = 0; y < gridSize-1; y++ )
+ for ( int x = 0; x < gridSize-1; x++ ) {
+ glBegin( GL_POLYGON );
+ {
+ glNormal3dv(vertexNormals[x][y].n);
+ glVertex3f(x-gridHalf,y-gridHalf,landscape[x][y]);
+
+ glNormal3dv(vertexNormals[x+1][y].n);
+ glVertex3f(x+1-gridHalf, y-gridHalf, landscape[x+1][y]);
+
+ glNormal3dv(vertexNormals[x+1][y+1].n);
+ glVertex3f(x+1-gridHalf, y+1-gridHalf, landscape[x+1][y+1]);
+ }
+ glEnd();
+
+ glBegin( GL_POLYGON );
+ {
+ glNormal3dv(vertexNormals[x][y].n);
+ glVertex3f(x-gridHalf,y-gridHalf, landscape[x][y]);
+
+ glNormal3dv(vertexNormals[x+1][y+1].n);
+ glVertex3f(x+1-gridHalf,y+1-gridHalf, landscape[x+1][y+1]);
+
+ glNormal3dv(vertexNormals[x][y+1].n);
+ glVertex3f(x-gridHalf,y+1-gridHalf, landscape[x][y+1]);
+ }
+ glEnd();
+ }
+
+ // Draw water
+ if ( mode == Landscape ) {
+ GLfloat materialAmbient[] = { 0.00, 0.00, 1.0, 0.0 };
+ GLfloat materialShininess[] = { 128.0 };
+ GLfloat materialSpecular[] = { 1.0, 1.0, 1.0, 0.0 };
+
+ glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular );
+ glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient );
+ glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess );
+
+ glEnable( GL_BLEND );
+ glBegin( GL_POLYGON );
+ {
+ glNormal3f( 0, 0, 1 );
+ glVertex3f( -gridHalf, -gridHalf, .2 );
+ glNormal3f( 0, 0, 1 );
+ glVertex3f( -gridHalf, gridHalf, .2 );
+ glNormal3f( 0, 0, 1 );
+ glVertex3f( gridHalf, gridHalf, .2 );
+ glNormal3f( 0, 0, 1 );
+ glVertex3f( gridHalf, -gridHalf, .2 );
+
+ }
+ glEnd();
+ glDisable( GL_BLEND );
+ }
+}
+
+void GLLandscape::setGridSize( int size )
+{
+ destroyGrid(); // destroy old grid
+ createGrid( size ); // create new grid
+ initializeGL();
+ updateGL();
+}
+
+void GLLandscape::createGrid( int size )
+{
+ if ( (size % 2) != 0 )
+ size++;
+ gridSize = size;
+ gridHalf = gridSize / 2;
+ initFractals = TRUE;
+ landscape = new double*[gridSize];
+ normals = new gridNormals*[gridSize];
+ vertexNormals = new avgNormals*[gridSize];
+ wt = new double*[gridSize];
+ wave = new double*[gridSize];
+ for ( int i = 0; i < gridSize; i++ ) {
+ landscape[i] = new double[gridSize];
+ normals[i] = new gridNormals[gridSize];
+ vertexNormals[i] = new avgNormals[gridSize];
+ wt[i] = new double[gridSize];
+ wave[i] = new double[gridSize];
+
+ memset( landscape[i], 0, gridSize*sizeof(double) );
+ memset( normals[i], 0, gridSize*sizeof(gridNormals) );
+ memset( vertexNormals[i], 0, gridSize*sizeof(avgNormals) );
+ memset( wt[i], 0, gridSize*sizeof(double) );
+ memset( wave[i], 0, gridSize*sizeof(double) );
+ }
+}
+
+void GLLandscape::destroyGrid()
+{
+ if ( landscape != NULL ) {
+ for( int i = 0; i < gridSize; i++ ) {
+ delete[] landscape[i];
+ delete[] normals[i];
+ delete[] vertexNormals[i];
+ delete[] wt[i];
+ delete[] wave[i];
+ }
+ delete[] landscape;
+ delete[] normals;
+ delete[] vertexNormals;
+ delete[] wt;
+ delete[] wave;
+ }
+ landscape = 0;
+}
+
+void GLLandscape::rotate( GLfloat deg, Axis axis )
+{
+ makeCurrent();
+ glMatrixMode( GL_MODELVIEW );
+ for ( int i = DefaultView; i <= AxisView; i++ ) {
+ glLoadMatrixf((GLfloat *) views[i].model);
+ if ( axis == XAxis )
+ glRotatef( deg, 1, 0, 0 );
+ else if ( axis == YAxis )
+ glRotatef( deg, 0, 1, 0 );
+ else
+ glRotatef( deg, 0, 0, 1 );
+ glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *) views[i].model);
+ }
+ glLoadMatrixf((GLfloat *) views[CurrentView].model);
+}
+
+void GLLandscape::rotateX( int deg )
+{
+ static int oldDeg = 0;
+
+ rotate( deg-oldDeg, XAxis );
+ oldDeg = deg;
+ updateGL();
+}
+
+void GLLandscape::rotateY( int deg )
+{
+ static int oldDeg = 0;
+
+ rotate( deg-oldDeg, YAxis );
+ oldDeg = deg;
+ updateGL();
+}
+
+void GLLandscape::rotateZ( int deg )
+{
+ static int oldDeg = 0;
+
+ rotate( deg-oldDeg, ZAxis );
+ oldDeg = deg;
+ updateGL();
+}
+
+void GLLandscape::zoom( int z )
+{
+ float zoom;
+ if ( z < 100 ) {
+ zoom = 1 + 4.99 - (z*5.0 / 100.0);
+ } else {
+ z = 200 - z;
+ zoom = z / 100.0;
+ }
+ makeCurrent();
+ glMatrixMode( GL_MODELVIEW );
+ // Always scale the original model matrix
+ glLoadMatrixf((GLfloat *) views[DefaultView].model);
+ glScalef( zoom, zoom, zoom );
+ glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *) views[CurrentView].model);
+ updateGL();
+}
+
+void GLLandscape::resetGrid()
+{
+ setGridSize( gridSize );
+}
+
+void GLLandscape::fractalize()
+{
+ Vector p;
+ double value;
+ double roughness = 0.5;
+ int frequency = 50;
+
+ p.x = p.y = p.z = 0;
+ // Initialise fbm routine
+ if ( initFractals ) {
+ initFractals = FALSE;
+ value = fBm( p, roughness, 2.0, 8.0, 1 );
+ }
+
+ // Fractalize grid
+ for ( int x = 0; x < gridSize; x++ ) {
+ for ( int y = 0; y < gridSize; y++ ) {
+ p.x = (double) x / (101 - frequency);
+ p.y = (double) y / (101 - frequency);
+ p.z = (double) landscape[x][y] / (101 - frequency);
+ value = fBm(p, roughness, 2.0, 8.0, 0);
+ landscape[x][y] += value;
+ }
+ }
+ calculateVertexNormals();
+ updateGL();
+}
+
+
+//
+// Calculate the vector cross product of v and w, store result in n.
+//
+static void crossProduct( double v[3], double w[3], double n[3] )
+{
+ n[0] = v[1]*w[2]-w[1]*v[2];
+ n[1] = w[0]*v[2]-v[0]*w[2];
+ n[2] = v[0]*w[1]-w[0]*v[1];
+}
+
+void GLLandscape::calculateVertexNormals()
+{
+ double len, v[3], v2[3], w[3], w2[3], n[3], n2[3];
+
+ // Calculate the surface normals for all polygons in the
+ // height field
+ for ( int i = 0; i < (gridSize-1); i++ )
+ for ( int k = 0; k < (gridSize-1); k++ ) {
+ /* Lower poly normal */
+ v[0] = 1; // (i+1)-i
+ v[1] = 0; // k-k
+ v[2] = landscape[i+1][k]-landscape[i][k];
+ w[0] = 1; // (i+1)-i
+ w[1] = 1; // (k+1)-k
+ w[2] = landscape[i+1][k+1]-landscape[i][k];
+ crossProduct( v, w, n );
+ len = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+ normals[i][k].l[0] = n[0]/len;
+ normals[i][k].l[1] = n[1]/len;
+ normals[i][k].l[2] = n[2]/len;
+
+ /* Upper poly normal */
+ v2[0] = -1.0; // i-(i+1);
+ v2[1] = 0.0; // (k+1)-(k+1);
+ v2[2] = landscape[i][k+1]-landscape[i+1][k+1];
+ w2[0] = -1.0; // i-(i+1);
+ w2[1] = -1.0; // k-(k+1);
+ w2[2] = landscape[i][k]-landscape[i+1][k+1];
+ crossProduct( v2, w2, n2 );
+ len = sqrt(n2[0]*n2[0]+n2[1]*n2[1]+n2[2]*n2[2]);
+ normals[i][k].u[0] = n2[0]/len;
+ normals[i][k].u[1] = n2[1]/len;
+ normals[i][k].u[2] = n2[2]/len;
+ }
+
+ // Calculate proper vertex normals
+ averageNormals();
+}
+
+void GLLandscape::averageNormals()
+{
+ // Calculate the average surface normal for a vertex based on
+ // the normals of the surrounding polygons
+ for ( int i = 0; i < gridSize; i++ )
+ for ( int k = 0; k < gridSize; k++ ) {
+ if ( i > 0 && k > 0 && i < (gridSize-1) && k < (gridSize-1) ) {
+ // For vertices that are *not* on the edge of the height field
+ for ( int t = 0; t < 3; t++ ) // X, Y and Z components
+ vertexNormals[i][k].n[t] = ( normals[i][k].u[t] +
+ normals[i][k].l[t] +
+ normals[i][k-1].u[t] +
+ normals[i-1][k-1].u[t] +
+ normals[i-1][k-1].l[t] +
+ normals[i-1][k].l[t] )/6.0;
+ } else {
+ // Vertices that are on the edge of the height field require
+ // special attention..
+ if ( i == 0 && k == 0 ) {
+ for ( int t = 0; t < 3; t++ )
+ vertexNormals[i][k].n[t] = ( normals[i][k].u[t] +
+ normals[i][k].l[t] )/2.0;
+ } else if ( i == gridSize-1 && k == gridSize-1 ) {
+ for ( int t = 0; t < 3; t++ )
+ vertexNormals[i][k].n[t] = ( normals[i][k].u[t] +
+ normals[i][k].l[t] )/2.0;
+ } else if ( i == gridSize-1) {
+ for ( int t = 0; t < 3; t++ )
+ vertexNormals[i][k].n[t] = vertexNormals[i-1][k].n[t];
+ } else if ( k == gridSize-1 ) {
+ for ( int t = 0; t < 3; t++ )
+ vertexNormals[i][k].n[t] = vertexNormals[i][k-1].n[t];
+ } else if ( k > 0 ) {
+ for ( int t = 0; t < 3; t++ )
+ vertexNormals[i][k].n[t] = (normals[i][k].u[t] +
+ normals[i][k].l[t] +
+ normals[i][k-1].u[t])/3.0;
+ } else if ( i > 0 ) {
+ for ( int t = 0; t < 3; t++ )
+ vertexNormals[i][k].n[t] = (normals[i][k].u[t] +
+ normals[i][k].l[t] +
+ normals[i-1][k].l[t])/3.0;
+ }
+ }
+ }
+}
+
+void GLLandscape::setWireframe( int state )
+{
+ if ( state != 1 ) {
+ // Enable line antialiasing
+ makeCurrent();
+ glEnable( GL_LINE_SMOOTH );
+ glEnable( GL_BLEND );
+ glDisable( GL_DEPTH_TEST );
+ glDisable( GL_LIGHTING );
+ glDisable( GL_NORMALIZE );
+
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glHint( GL_LINE_SMOOTH_HINT, GL_DONT_CARE );
+
+ mode = Wireframe;
+ updateGL();
+ }
+}
+
+void GLLandscape::setFilled( int state )
+{
+ if ( state != 1 ) {
+ makeCurrent();
+ glEnable( GL_DEPTH_TEST );
+ glDisable( GL_LINE_SMOOTH );
+ glDisable( GL_BLEND );
+ glDisable( GL_LIGHTING );
+ glDisable( GL_NORMALIZE );
+
+ mode = Filled;
+ updateGL();
+ }
+}
+
+void GLLandscape::setSmoothShaded( int state )
+{
+ if ( state != 1 ) {
+ makeCurrent();
+ glEnable( GL_DEPTH_TEST );
+ glEnable( GL_LIGHTING );
+ glEnable( GL_LIGHT0 );
+ glEnable( GL_NORMALIZE );
+ glDisable( GL_LINE_SMOOTH );
+ glDisable( GL_BLEND );
+
+ glShadeModel( GL_SMOOTH );
+ glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE );
+
+ // Setup lighting and material properties
+ GLfloat position[] = { 15.0, -15.0, 15.0, 0.0 };
+ GLfloat ambient[] = { 0.50, 0.50, 0.50, 0.0 };
+ GLfloat diffuse[] = { 1.00, 1.00, 1.00, 0.0 };
+ GLfloat specular[] = { 1.0, 1.0, 1.0, 0.0 };
+ GLfloat materialAmbient[] = { 0.00, 0.00, 1.0, 0.0 };
+ // GLfloat materialDiffuse[] = { 1.00, 1.00, 1.0, 0.0 };
+ GLfloat materialShininess[] = { 128.0 };
+ GLfloat materialSpecular[] = { 1.0, 1.0, 1.0, 0.0 };
+
+ glMaterialfv( GL_FRONT, GL_SPECULAR, materialSpecular );
+ // glMaterialfv( GL_FRONT, GL_DIFFUSE, materialDiffuse );
+ glMaterialfv( GL_FRONT, GL_AMBIENT, materialAmbient );
+ glMaterialfv( GL_FRONT, GL_SHININESS, materialShininess );
+
+ glLightfv( GL_LIGHT0, GL_POSITION, position );
+ glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
+ glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
+
+ mode = SmoothShaded;
+ calculateVertexNormals();
+ updateGL();
+ }
+}
+
+void GLLandscape::setLandscape( int state )
+{
+ if ( state != 1 ) {
+ makeCurrent();
+ glEnable( GL_DEPTH_TEST );
+ glEnable( GL_LIGHTING );
+ glEnable( GL_LIGHT0 );
+ glEnable( GL_NORMALIZE );
+ glDisable( GL_LINE_SMOOTH );
+ glDisable( GL_BLEND );
+
+ glShadeModel( GL_SMOOTH );
+ glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE );
+
+ // Setup lighting and material properties
+ GLfloat position[] = { 15.0, -15.0, 15.0, 0.0 };
+ GLfloat ambient[] = { 0.50, 0.50, 0.50, 0.0 };
+ GLfloat diffuse[] = { 1.00, 1.00, 1.00, 0.0 };
+ GLfloat specular[] = { 1.0, 1.0, 1.0, 0.0 };
+
+ glLightfv( GL_LIGHT0, GL_POSITION, position );
+ glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
+ glLightfv( GL_LIGHT0, GL_SPECULAR, specular );
+
+ glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR );
+
+ mode = Landscape;
+ calculateVertexNormals();
+ updateGL();
+ }
+}
+
+void GLLandscape::mousePressEvent( QMouseEvent *e )
+{
+ oldPos = e->pos();
+ mouseButtonDown = TRUE;
+}
+
+void GLLandscape::mouseReleaseEvent( QMouseEvent *e )
+{
+ oldPos = e->pos();
+ mouseButtonDown = FALSE;
+}
+
+void GLLandscape::mouseMoveEvent( QMouseEvent *e )
+{
+ GLfloat rx = (GLfloat) (e->x() - oldPos.x()) / width();
+ GLfloat ry = (GLfloat) (e->y() - oldPos.y()) / height();
+
+ if ( e->state() == LeftButton ) {
+ // Left button down - rotate around X and Y axes
+ oldX = 180*ry;
+ oldY = 180*rx;
+ rotate( oldX, XAxis );
+ rotate( oldY, YAxis );
+ updateGL();
+ } else if ( e->state() == RightButton ) {
+ // Right button down - rotate around X and Z axes
+ oldX = 180*ry;
+ oldZ = 180*rx;
+ rotate( oldX, XAxis );
+ rotate( oldZ, ZAxis );
+ updateGL();
+ }
+ oldPos = e->pos();
+}
+
+void GLLandscape::timerEvent( QTimerEvent *e )
+{
+ if (e->timerId() == cubeTimer) {
+ cubeRot += 1;
+ if (!animationRunning)
+ updateGL();
+ return;
+ }
+
+ int dx, dy; // disturbance point
+ float s, v, W, t;
+ int i, j;
+
+ if ( mode == Landscape ) {
+ dx = dy = 0;
+ } else {
+ dx = dy = gridSize >> 1;
+ }
+ W = 0.3;
+ v = -4; // wave speed
+
+ for ( i = 0; i < gridSize; i++ )
+ for ( j = 0; j < gridSize; j++ )
+ {
+ s = sqrt( (double) ( (j - dx) * (j - dx) + (i - dy) * (i - dy) ) );
+ wt[i][j] += 0.1;
+ t = s / v;
+
+ if ( mode == Landscape ) {
+ if ( (landscape[i][j] + wave[i][j]) < 0 )
+ landscape[i][j] -= wave[i][j];
+ if ( (dy - j != 0) || (dx - i != 0) )
+ wave[i][j] = (3 * sin( 2 * PI * W * (wt[i][j] + t ))) /
+ (0.2*(sqrt( pow((double)(dx-i), 2) + pow((double)(dy-j), 2))+2));
+ else
+ wave[i][j] = ( 3 * sin( 2 * PI * W * ( wt[i][j] + t ) ) );
+ if ( landscape[i][j] + wave[i][j] < 0 )
+ landscape[i][j] += wave[i][j];
+
+ } else {
+ landscape[i][j] -= wave[i][j];
+
+ if ( s != 0 )
+ wave[i][j] = 2 * sin(2 * PI * W * ( wt[i][j] + t )) /
+ (0.2*(s + 2));
+ else
+ wave[i][j] = 2 * sin( 2 * PI * W * ( wt[i][j] + t ) );
+ landscape[i][j] += wave[i][j];
+ }
+
+ }
+ if ( mode == SmoothShaded || mode == Landscape )
+ calculateVertexNormals();
+ updateGL();
+}
+
+void GLLandscape::toggleWaveAnimation( bool state )
+{
+ if (state) {
+ animTimer = startTimer(20);
+ animationRunning = TRUE;
+ } else {
+ killTimer(animTimer);
+ animationRunning = FALSE;
+ }
+}
+
+void GLLandscape::showEvent( QShowEvent * )
+{
+ if (animationRunning)
+ animTimer = startTimer(20);
+ cubeTimer = startTimer(50);
+}
+
+void GLLandscape::hideEvent( QHideEvent * )
+{
+ if (animationRunning)
+ killTimer(animTimer);
+ killTimer(cubeTimer);
+}
+
+void GLLandscape::initDisplayLists()
+{
+ // axisList
+ axisList = glGenLists(1);
+ glNewList(axisList, GL_COMPILE);
+
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_DEPTH_TEST);
+ glColor3f(1.0, 0.0, 0.0);
+ glBegin(GL_LINES);
+ {
+ glColor3f(1.0, 0.0, 0.0);
+ glVertex3f(-1.0f, 0, 0); // x axis
+ glVertex3f(1.0f, 0, 0);
+
+ glVertex3f(1.0f, 0, 0);
+ glVertex3f(0.8f, 0.2f, 0);
+ glVertex3f(1.0f, 0, 0);
+ glVertex3f(0.8f, -.2f, 0);
+
+ glColor3f(0.0, 1.0, 0.0);
+ glVertex3f(0, -1.0f, 0); // y axis
+ glVertex3f(0, 1.0f, 0);
+
+ glVertex3f(0, 1.0f, 0);
+ glVertex3f(0.2f, 0.8f, 0);
+ glVertex3f(0, 1.0f, 0);
+ glVertex3f(-0.2f, 0.8f, 0);
+
+ glColor3f(0.5, 0.5, 1.0);
+ glVertex3f(0, 0, -1.0f); // z axis
+ glVertex3f(0, 0, 1.0f);
+
+ glVertex3f(0, 0, 1.0f);
+ glVertex3f(0, 0.2f, 0.8f);
+ glVertex3f(0, 0, 1.0f);
+ glVertex3f(0,-0.2f, 0.8f);
+ }
+ glEnd();
+
+ glEndList();
+
+ // cubeList
+ cubeList = glGenLists(1);
+ glNewList(cubeList, GL_COMPILE);
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR);
+
+ glBegin( GL_QUADS );
+ {
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 );
+
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 );
+
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 0.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 0.0, 0.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 0.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 );
+
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 );
+
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 );
+
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( 0.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 0.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 0.0, 0.0, 0.0 );
+ }
+ glEnd();
+ glDisable(GL_TEXTURE_2D);
+
+ glEndList();
+}
diff --git a/examples/demo/opengl/gllandscape.h b/examples/demo/opengl/gllandscape.h
new file mode 100644
index 0000000..ca87676
--- /dev/null
+++ b/examples/demo/opengl/gllandscape.h
@@ -0,0 +1,98 @@
+#ifndef GLLANDSCAPE_H
+#define GLLANDSCAPE_H
+
+#include <qgl.h>
+
+class GLLandscape : public QGLWidget
+{
+ Q_OBJECT
+
+public:
+ GLLandscape( QWidget * parent = 0, const char * name = 0 );
+ ~GLLandscape();
+
+public slots:
+ void rotateX( int );
+ void rotateY( int );
+ void rotateZ( int );
+ void zoom( int );
+ void fractalize();
+ void resetGrid();
+
+ void setWireframe( int );
+ void setFilled( int );
+ void setSmoothShaded( int );
+ void setLandscape( int );
+ void setGridSize( int );
+
+ void toggleWaveAnimation( bool );
+
+signals:
+ void rotatedX( int );
+ void rotatedY( int );
+ void rotatedZ( int );
+
+protected:
+ void paintGL();
+ void initializeGL();
+ void resizeGL( int w, int h );
+ void mousePressEvent( QMouseEvent * );
+ void mouseReleaseEvent( QMouseEvent * );
+ void mouseMoveEvent( QMouseEvent * );
+ void timerEvent( QTimerEvent * );
+ void showEvent( QShowEvent * );
+ void hideEvent( QHideEvent * );
+
+ void drawWireframe();
+ void drawFilled();
+ void drawSmoothShaded();
+ void drawAxis();
+ void drawCube();
+
+private:
+ enum Axis { XAxis, YAxis, ZAxis };
+ enum RenderModes { Wireframe, Filled, SmoothShaded, Landscape };
+ enum Views { DefaultView, CurrentView, AxisView };
+
+ void rotate( GLfloat deg, Axis axis );
+ void calculateVertexNormals();
+ void averageNormals();
+ void createGrid( int size );
+ void destroyGrid();
+ void initDisplayLists();
+
+ RenderModes mode;
+
+ typedef struct grid_normals {
+ double u[3], l[3];
+ } gridNormals;
+
+ // Structure used to store the vertex normals for the landscape
+ typedef struct avg_normals {
+ double n[3];
+ } avgNormals;
+
+ typedef struct viewMatrix {
+ GLfloat model[4][4]; // OpenGL model view matrix for the view
+ GLfloat projection[4][4]; // OpenGL projection matrix for the view
+ } viewMatrix;
+
+ double ** landscape; // Height field data
+ double ** wave; // Wave data
+ double ** wt; // Parameterized wave data
+ gridNormals ** normals;
+ avgNormals ** vertexNormals;
+ viewMatrix views[3];
+
+ QPoint oldPos;
+ GLfloat oldX, oldY, oldZ;
+ bool initFractals;
+ int gridSize, gridHalf;
+ bool animationRunning;
+ bool mouseButtonDown;
+ int cubeTimer, animTimer;
+ GLfloat cubeRot;
+ GLint axisList, cubeList;
+};
+
+#endif
diff --git a/examples/demo/opengl/gllandscapeviewer.ui b/examples/demo/opengl/gllandscapeviewer.ui
new file mode 100644
index 0000000..558cc35
--- /dev/null
+++ b/examples/demo/opengl/gllandscapeviewer.ui
@@ -0,0 +1,623 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>GLLandscapeViewer</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>GLLandscapeViewer</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>731</width>
+ <height>519</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Qt/OpenGL example</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>18</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>X-rotation</string>
+ </property>
+ </widget>
+ <widget class="QThumbWheel">
+ <property name="name">
+ <cstring>wheelX</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Y-rotation</string>
+ </property>
+ </widget>
+ <widget class="QThumbWheel">
+ <property name="name">
+ <cstring>wheelY</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Z-rotation</string>
+ </property>
+ </widget>
+ <widget class="QThumbWheel">
+ <property name="name">
+ <cstring>wheelZ</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Rendering mode</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>RadioButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Wireframe</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="1">
+ <property name="name">
+ <cstring>RadioButton1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Fl&amp;at shaded</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="2">
+ <property name="name">
+ <cstring>RadioButton1_3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Smooth shaded</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="3">
+ <property name="name">
+ <cstring>RadioButton1_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Landscape</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout14</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>fractalize_btn_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Fractalize</string>
+ </property>
+ <property name="autoRepeat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>reset_btn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Reset grid</string>
+ </property>
+ <property name="autoRepeat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>animate_btn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Animate</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="autoRepeat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout19</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout18</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Zoom</string>
+ </property>
+ </widget>
+ <widget class="QThumbWheel">
+ <property name="name">
+ <cstring>wheelZoom</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ <widget class="QThumbWheel">
+ <property name="name">
+ <cstring>wheelSize</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>Frame5</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="GLLandscape">
+ <property name="name">
+ <cstring>landscape</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>GLLandscape</class>
+ <header location="local">gllandscape.h</header>
+ <sizehint>
+ <width>100</width>
+ <height>100</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>3</hordata>
+ <verdata>3</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>rotatedX(int)</signal>
+ <slot access="public" specifier="">rotateZ(int)</slot>
+ <slot access="public" specifier="">rotateY(int)</slot>
+ <slot access="public" specifier="">rotateX(int)</slot>
+ <slot access="public" specifier="">zoom(int)</slot>
+ <slot access="public" specifier="">fractalize()</slot>
+ <slot access="public" specifier="">setWireframe(int)</slot>
+ <slot access="public" specifier="">setFilled(int)</slot>
+ <slot access="public" specifier="">setGridSize(int)</slot>
+ <slot access="public" specifier="">toggleWaveAnimation(bool)</slot>
+ <slot access="public" specifier="">setSmoothShaded(int)</slot>
+ <slot access="public" specifier="">setLandscape(int)</slot>
+ <slot access="public" specifier="">resetGrid()</slot>
+ </customwidget>
+ <customwidget>
+ <class>QThumbWheel</class>
+ <header location="local">qthumbwheel.h</header>
+ <sizehint>
+ <width>100</width>
+ <height>16</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>0</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>valueChanged(int)</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b722ddac1741fc04c5a3201e6615f43085390f22febbb65dd6666dd821dda36996b552b0df6d4055e2d937fdcd82bd361da8f3ab6ddf87e3fa23a431e01e98cb99901a2c6c1ff78bcbf19fe372713275ed6908f441ab51300617649108624641d22a9427c21a192405241a256e08e4850311172a3b95d87159742e98ef09bda403e03271f6a5bc663e9d8214279afd05eaa048f11e242f753c27bb21ee9cef4afc00c1c26728</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>RadioButton1</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>setWireframe(int)</slot>
+ </connection>
+ <connection>
+ <sender>RadioButton1_2</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>setFilled(int)</slot>
+ </connection>
+ <connection>
+ <sender>animate_btn</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>landscape</receiver>
+ <slot>toggleWaveAnimation(bool)</slot>
+ </connection>
+ <connection>
+ <sender>RadioButton1_3</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>setSmoothShaded(int)</slot>
+ </connection>
+ <connection>
+ <sender>wheelY</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>rotateY(int)</slot>
+ </connection>
+ <connection>
+ <sender>wheelZ</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>rotateZ(int)</slot>
+ </connection>
+ <connection>
+ <sender>wheelSize</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>setGridSize(int)</slot>
+ </connection>
+ <connection>
+ <sender>wheelZoom</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>zoom(int)</slot>
+ </connection>
+ <connection>
+ <sender>wheelX</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>rotateX(int)</slot>
+ </connection>
+ <connection>
+ <sender>RadioButton1_3_2</sender>
+ <signal>stateChanged(int)</signal>
+ <receiver>landscape</receiver>
+ <slot>setLandscape(int)</slot>
+ </connection>
+ <connection>
+ <sender>reset_btn</sender>
+ <signal>clicked()</signal>
+ <receiver>landscape</receiver>
+ <slot>resetGrid()</slot>
+ </connection>
+ <connection>
+ <sender>fractalize_btn_2</sender>
+ <signal>clicked()</signal>
+ <receiver>landscape</receiver>
+ <slot>fractalize()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>RadioButton1</tabstop>
+ <tabstop>RadioButton1_2</tabstop>
+ <tabstop>RadioButton1_3</tabstop>
+ <tabstop>RadioButton1_3_2</tabstop>
+ <tabstop>fractalize_btn_2</tabstop>
+ <tabstop>reset_btn</tabstop>
+ <tabstop>animate_btn</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">gllandscapeviewer.ui.h</include>
+</includes>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/demo/opengl/gllandscapeviewer.ui.h b/examples/demo/opengl/gllandscapeviewer.ui.h
new file mode 100644
index 0000000..395519d
--- /dev/null
+++ b/examples/demo/opengl/gllandscapeviewer.ui.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+
+void GLLandscapeViewer::init()
+{
+ wheelX->setOrientation( Horizontal );
+ wheelY->setOrientation( Horizontal );
+ wheelZ->setOrientation( Horizontal );
+
+ wheelZoom->setOrientation( Vertical );
+ wheelZoom->setRange( 0, 200 );
+ wheelZoom->setValue( 100 );
+
+ wheelSize->setOrientation( Vertical );
+ wheelSize->setRange( 25, 200 );
+ wheelSize->setValue( 50 );
+ wheelSize->setSteps( 10, 10 );
+
+ wheelX->setRange( 0, 360 );
+ wheelY->setRange( 0, 360 );
+ wheelZ->setRange( 0, 360 );
+
+ wheelX->setTransmissionRatio( 0.5 );
+ wheelY->setTransmissionRatio( 0.5 );
+ wheelZ->setTransmissionRatio( 0.5 );
+}
+
+void GLLandscapeViewer::destroy()
+{
+
+}
diff --git a/examples/demo/opengl/gllogo.bmp b/examples/demo/opengl/gllogo.bmp
new file mode 100644
index 0000000..ee64a10
--- /dev/null
+++ b/examples/demo/opengl/gllogo.bmp
Binary files differ
diff --git a/examples/demo/opengl/gltexobj.cpp b/examples/demo/opengl/gltexobj.cpp
new file mode 100644
index 0000000..60627da
--- /dev/null
+++ b/examples/demo/opengl/gltexobj.cpp
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget demonstrating the use of QImages for textures.
+**
+** Much of the GL code is inspired by the 'spectex' and 'texcyl'
+** public domain demo programs by Brian Paul.
+**
+****************************************************************************/
+
+#include "gltexobj.h"
+#include <qimage.h>
+
+/*!
+ Create a GLTexobj widget
+*/
+
+GLTexobj::GLTexobj( QWidget* parent, const char* name, WFlags f )
+ : GLControlWidget( parent, name, 0, f ), impX( -2 ), impY( 0.5 ), impZ( 1 )
+{
+ object = 0;
+}
+
+/*!
+ Release allocated resources
+*/
+
+GLTexobj::~GLTexobj()
+{
+ makeCurrent();
+ glDeleteLists( object, 1 );
+}
+
+
+/*!
+ Paint the texobj. The actual openGL commands for drawing the texobj are
+ performed here.
+*/
+
+void GLTexobj::paintGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glPushMatrix();
+ transform();
+ glCallList( object );
+ drawText();
+ glPushAttrib( GL_LIGHTING_BIT | GL_TEXTURE_BIT );
+ glDisable( GL_LIGHTING );
+ glDisable( GL_TEXTURE_2D );
+ qglColor( green );
+ glLineWidth( 1.0 );
+ glBegin( GL_LINES );
+ {
+ glVertex3f( 0.0f, 0.0f, 1.0f );
+ glVertex3f( 0.98f, 0.98f, 0.98f );
+ }
+ glEnd();
+ renderText( 1.0, 1.0, 1.0, "Can", QFont( "helvetica", 12, QFont::Bold, TRUE ) );
+ glPopAttrib();
+ glPopMatrix();
+}
+
+
+/*!
+ Set up the OpenGL rendering state, and define display list
+*/
+
+void GLTexobj::initializeGL()
+{
+ // Set up the lights
+
+ GLfloat whiteDir[4] = {2.0, 2.0, 2.0, 1.0};
+ GLfloat whiteAmb[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat lightPos[4] = {30.0, 30.0, 30.0, 1.0};
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteAmb);
+
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, whiteDir);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, whiteDir);
+ glMaterialf(GL_FRONT, GL_SHININESS, 20.0);
+
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteDir); // enable diffuse
+ glLightfv(GL_LIGHT0, GL_SPECULAR, whiteDir); // enable specular
+ glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
+
+ // Set up the textures
+
+ QImage tex1, tex2, buf;
+
+ if ( !buf.load( "opengl/gllogo.bmp" ) ) { // Load first image from file
+ qWarning( "Could not read image file, using single-color instead." );
+ QImage dummy( 128, 128, 32 );
+ dummy.fill( Qt::green.rgb() );
+ buf = dummy;
+ }
+ tex1 = QGLWidget::convertToGLFormat( buf ); // flipped 32bit RGBA
+
+ if ( !buf.load( "opengl/qtlogo.bmp" ) ) { // Load first image from file
+ qWarning( "Could not read image file, using single-color instead." );
+ QImage dummy( 128, 128, 32 );
+ dummy.fill( Qt::red.rgb() );
+ buf = dummy;
+ }
+ tex2 = QGLWidget::convertToGLFormat( buf ); // flipped 32bit RGBA
+
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glEnable( GL_TEXTURE_2D );
+
+ // Set up various other stuff
+
+ glClearColor( 0.0, 0.0, 0.0, 0.0 ); // Let OpenGL clear to black
+ glEnable( GL_CULL_FACE ); // don't need Z testing for convex objects
+ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
+
+ // Make the object display list
+
+ object = makeObject( tex1, tex2 ); // Generate an OpenGL display list
+}
+
+
+
+/*!
+ Set up the OpenGL view port, matrix mode, etc.
+*/
+
+void GLTexobj::resizeGL( int w, int h )
+{
+ glViewport( 0, 0, w, h );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -70.0 );
+}
+
+
+/*!
+ Generate an OpenGL display list for the object to be shown, i.e. the texobj
+*/
+
+GLuint GLTexobj::makeObject( const QImage& tex1, const QImage& tex2 )
+{
+ GLUquadricObj* q = gluNewQuadric();
+ GLuint cylinderObj = glGenLists(1);
+ glNewList( cylinderObj, GL_COMPILE );
+
+ glTranslatef( 0.0, 0.0, -1.0 );
+
+ // cylinder
+ glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits() );
+ gluQuadricTexture( q, GL_TRUE );
+ gluCylinder(q, 0.6, 0.6, 2.0, 24, 1);
+
+ // end cap
+ glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2.width(), tex2.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, tex2.bits() );
+ glTranslatef( 0.0, 0.0, 2.0 );
+ gluDisk( q, 0.0, 0.6, 24, 1 );
+
+ // other end cap
+ glTranslatef( 0.0, 0.0, -2.0 );
+ gluQuadricOrientation( q, (GLenum)GLU_INSIDE );
+ gluDisk( q, 0.0, 0.6, 24, 1 );
+
+ glEndList();
+ gluDeleteQuadric( q );
+
+ return cylinderObj;
+}
+
+void GLTexobj::animate()
+{
+ xRot += impX;
+ yRot += impY;
+ zRot -= impZ;
+
+ impX -= impX * 0.05;
+ impY -= impY * 0.05;
+ impZ -= impZ * 0.05;
+
+ if ( impX > 0.1 || impY > 0.1 || impZ > 0.1 ||
+ impX < -0.1 || impY < -0.1 || impZ < -0.1 )
+ updateGL();
+}
+
+void GLTexobj::setRotationImpulse( double x, double y, double z )
+{
+ if ( animation ) {
+ impX += 180*x;
+ impY += 180*y;
+ impZ += 180*z;
+ } else {
+ GLControlWidget::setRotationImpulse( x, y, z );
+ }
+}
diff --git a/examples/demo/opengl/gltexobj.h b/examples/demo/opengl/gltexobj.h
new file mode 100644
index 0000000..e621627
--- /dev/null
+++ b/examples/demo/opengl/gltexobj.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple QGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLTEXOBJ_H
+#define GLTEXOBJ_H
+
+#include "glcontrolwidget.h"
+
+class GLTexobj : public GLControlWidget
+{
+ Q_OBJECT
+
+public:
+ GLTexobj( QWidget* parent, const char* name = 0, WFlags f = 0 );
+ ~GLTexobj();
+
+protected:
+ void animate();
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ virtual GLuint makeObject( const QImage& tex1, const QImage& tex2 );
+
+ void setRotationImpulse( double x, double y, double z );
+
+private:
+ GLuint object;
+ double impX, impY, impZ;
+};
+
+#endif // GLTEXOBJ_H
diff --git a/examples/demo/opengl/glworkspace.cpp b/examples/demo/opengl/glworkspace.cpp
new file mode 100644
index 0000000..4670582
--- /dev/null
+++ b/examples/demo/opengl/glworkspace.cpp
@@ -0,0 +1,212 @@
+#include "glworkspace.h"
+#include "glbox.h"
+#include "glgear.h"
+#include "gltexobj.h"
+
+#include <qworkspace.h>
+#include <qdialog.h>
+#include <qtoolbar.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qaction.h>
+#include <qprinter.h>
+#include <qpainter.h>
+#include <qcheckbox.h>
+#include <qvbox.h>
+#include <qimage.h>
+#include "printpreview.h"
+
+
+GLWorkspace::GLWorkspace( QWidget *parent, const char *name, WFlags f )
+: QMainWindow( parent, name, f ), printer( 0 )
+{
+ setupSceneActions();
+
+ QVBox *vbox = new QVBox( this );
+ vbox->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ vbox->setMargin( 1 );
+ vbox->setLineWidth( 1 );
+
+ workspace = new QWorkspace( vbox );
+ workspace->setBackgroundMode( PaletteMid );
+ setCentralWidget( vbox );
+}
+
+GLWorkspace::~GLWorkspace()
+{
+}
+
+void GLWorkspace::setupSceneActions()
+{
+ QToolBar *tb = new QToolBar( "Scene", this );
+ QPopupMenu *menu = new QPopupMenu( this );
+ menuBar()->insertItem( tr( "&Scene" ), menu );
+
+ QAction *a;
+ QActionGroup *newGroup = new QActionGroup( this );
+ newGroup->setMenuText( tr( "&New" ) );
+ newGroup->setText( tr( "New" ) );
+ newGroup->setUsesDropDown( TRUE );
+ newGroup->setExclusive( FALSE );
+ newGroup->setIconSet( QPixmap( "textdrawing/filenew.png" ) );
+ a = new QAction( tr( "Wirebox" ), QPixmap( "opengl/wirebox.xpm" ), tr( "&Wirebox" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newWirebox() ) );
+ a = new QAction( tr( "Gear" ), QPixmap( "opengl/gear.xpm" ), tr( "&Gears" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newGear() ) );
+ a = new QAction( tr( "Texture" ), QPixmap( "opengl/texture.xpm" ), tr( "&Texture" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newTexture() ) );
+/* a = new QAction( tr( "Nurbs" ), QPixmap( "opengl/nurbs.xpm" ), tr( "&Nurbs" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newNurbs() ) );*/
+ newGroup->addTo( tb );
+ newGroup->addTo( menu );
+
+ menu->insertSeparator();
+ QActionGroup *printGroup = new QActionGroup( this );
+ printGroup->setMenuText( tr( "&Print" ) );
+ printGroup->setText( tr( "Print" ) );
+ printGroup->setUsesDropDown( TRUE );
+ printGroup->setExclusive( FALSE );
+ printGroup->setIconSet( QPixmap( "textdrawing/print.png" ) );
+ QAction *da = new QAction( tr( "Window Size" ), QPixmap( "textdrawing/print.png" ), tr( "&Window Size" ), CTRL + Key_P, printGroup );
+ connect( da, SIGNAL( activated() ), this, SLOT( filePrintWindowRes() ) );
+ a = new QAction( tr( "Low Resolution" ), tr( "&Low Resolution" ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintLowRes() ) );
+ a = new QAction( tr( "Medium Resolution" ), tr( "&Medium Resolution" ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintMedRes() ) );
+ a = new QAction( tr( "High Resolution" ), tr( "&High Resolution" ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintHighRes() ) );
+ printGroup->addSeparator();
+ a = new QAction( tr( "Setup" ), tr( "&Setup..." ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintSetup() ) );
+ da->addTo( tb );
+ printGroup->addTo( menu );
+
+ a = new QAction( tr( "Close" ), QPixmap(), tr( "&Close" ), 0, this );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) );
+ a->addTo( menu );
+}
+
+void GLWorkspace::newWirebox()
+{
+ GLBox *gl = new GLBox( workspace, 0, WDestructiveClose );
+ gl->setIcon( QPixmap( "opengl/wirebox.xpm" ) );
+ gl->setCaption( tr( "Wirebox" ) );
+ gl->resize( 320, 240 );
+ gl->show();
+}
+
+void GLWorkspace::newGear()
+{
+ GLGear *gl = new GLGear( workspace, 0, WDestructiveClose );
+ gl->setIcon( QPixmap( "opengl/gear.xpm" ) );
+ gl->setCaption( tr( "Gear" ) );
+ gl->resize( 320, 240 );
+ gl->show();
+}
+
+void GLWorkspace::newTexture()
+{
+ GLTexobj *gl = new GLTexobj( workspace, 0, WDestructiveClose );
+ gl->setIcon( QPixmap( "opengl/texture.xpm" ) );
+ gl->setCaption( tr( "Texture" ) );
+ gl->resize( 320, 240 );
+ gl->show();
+}
+
+void GLWorkspace::newNurbs()
+{
+ GLGear *gl = new GLGear ( workspace, 0, WDestructiveClose );
+ gl->setIcon( QPixmap( "opengl/nurbs.xpm" ) );
+ gl->setCaption( tr( "Nurbs" ) );
+ gl->resize( 320, 240 );
+ gl->show();
+}
+
+void GLWorkspace::filePrint( int x, int y )
+{
+ bool print = printer || filePrintSetup();
+ if ( !print || !printer )
+ return;
+
+ QWidget *widget = workspace->activeWindow();
+ if ( !widget || !widget->inherits( "QGLWidget" ) )
+ return;
+ QGLWidget *gl = (QGLWidget *)widget;
+ QPixmap pm = gl->renderPixmap( x, y );
+
+ PrintPreview view( this );
+ QImage temp = pm.convertToImage();
+ temp = temp.smoothScale( 400, 300 );
+ QPixmap temppix;
+ temppix.convertFromImage( temp );
+ view.setPixmap( temppix );
+ view.setIcon( QPixmap( "opengl/snapshot.xpm" ) );
+ view.setCaption( gl->caption() + " - Print preview" );
+ if ( view.exec() ) {
+ QImage img = pm.convertToImage();
+ if ( view.checkInvert->isChecked() ) {
+ img.invertPixels();
+ }
+ if ( view.checkMirror->isChecked() ) {
+ img = img.mirror( TRUE, FALSE );
+ }
+ if ( view.checkFlip->isChecked() ) {
+ img = img.mirror( FALSE, TRUE );
+ }
+ if ( view.checkLeft->isEnabled() && view.checkLeft->isChecked() ) {
+ }
+ if ( view.checkRight->isEnabled() && view.checkRight->isChecked() ) {
+ }
+ pm.convertFromImage( img );
+
+ QPainter painter;
+ if ( !painter.begin( printer ) )
+ return;
+
+ painter.drawPixmap( QPoint( 0, 0 ), pm );
+
+ painter.end();
+ }
+}
+
+void GLWorkspace::filePrintWindowRes()
+{
+ filePrint( 0, 0 );
+}
+
+void GLWorkspace::filePrintLowRes()
+{
+ filePrint( 640, 480 );
+}
+
+void GLWorkspace::filePrintMedRes()
+{
+ filePrint( 1024, 768 );
+}
+
+void GLWorkspace::filePrintHighRes()
+{
+ filePrint( 2048, 1536 );
+}
+
+bool GLWorkspace::filePrintSetup()
+{
+ bool newPrinter = !printer;
+
+ if ( !printer )
+ printer = new QPrinter;
+ if ( printer->setup() ) {
+ return TRUE;
+ } else {
+ if ( newPrinter ) {
+ delete printer;
+ printer = 0;
+ }
+ return FALSE;
+ }
+}
+
+void GLWorkspace::fileClose()
+{
+ workspace->closeActiveWindow();
+}
diff --git a/examples/demo/opengl/glworkspace.h b/examples/demo/opengl/glworkspace.h
new file mode 100644
index 0000000..36e1a23
--- /dev/null
+++ b/examples/demo/opengl/glworkspace.h
@@ -0,0 +1,37 @@
+#ifndef GLWORKSPACE_H
+#define GLWORKSPACE_H
+
+#include <qmainwindow.h>
+
+class QWorkspace;
+class QPrinter;
+
+class GLWorkspace : public QMainWindow
+{
+ Q_OBJECT
+public:
+ GLWorkspace( QWidget *parent = 0, const char *name = 0, WFlags f = 0 );
+ ~GLWorkspace();
+
+protected:
+ void setupSceneActions();
+
+protected slots:
+ void newWirebox();
+ void newGear();
+ void newTexture();
+ void newNurbs();
+ void filePrint( int x, int y );
+ void filePrintWindowRes();
+ void filePrintLowRes();
+ void filePrintMedRes();
+ void filePrintHighRes();
+ bool filePrintSetup();
+ void fileClose();
+
+private:
+ QWorkspace *workspace;
+ QPrinter *printer;
+};
+
+#endif //GLWORKSPACE_H
diff --git a/examples/demo/opengl/nurbs.xpm b/examples/demo/opengl/nurbs.xpm
new file mode 100644
index 0000000..946d081
--- /dev/null
+++ b/examples/demo/opengl/nurbs.xpm
@@ -0,0 +1,305 @@
+/* XPM */
+static char *nest[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 202 2",
+/* colors */
+".. c None",
+".# c #1f1000",
+".a c #200800",
+".b c #201000",
+".c c #201700",
+".d c #20170f",
+".e c #201800",
+".f c #201f0f",
+".g c #2f1f00",
+".h c #2f2710",
+".i c #301700",
+".j c #301f00",
+".k c #30200f",
+".l c #302810",
+".m c #3f2000",
+".n c #3f270f",
+".o c #3f2f10",
+".p c #402700",
+".q c #40270f",
+".r c #402f0f",
+".s c #402f10",
+".t c #40371f",
+".u c #403720",
+".v c #40382f",
+".w c #4f3000",
+".x c #4f3010",
+".y c #4f371f",
+".z c #4f3f1f",
+".A c #4f3f3f",
+".B c #4f402f",
+".C c #4f403f",
+".D c #503700",
+".E c #50370f",
+".F c #503f10",
+".G c #50401f",
+".H c #504020",
+".I c #504030",
+".J c #50403f",
+".K c #504730",
+".L c #50473f",
+".M c #5f3f10",
+".N c #5f4000",
+".O c #5f401f",
+".P c #5f471f",
+".Q c #5f481f",
+".R c #5f482f",
+".S c #5f5030",
+".T c #5f5040",
+".U c #5f5750",
+".V c #604010",
+".W c #60481f",
+".X c #604830",
+".Y c #604f20",
+".Z c #604f3f",
+".0 c #605730",
+".1 c #60584f",
+".2 c #6f4000",
+".3 c #6f4810",
+".4 c #6f5730",
+".5 c #6f5740",
+".6 c #6f5f30",
+".7 c #6f5f3f",
+".8 c #6f6040",
+".9 c #6f6850",
+"#. c #704f10",
+"## c #70501f",
+"#a c #705020",
+"#b c #705710",
+"#c c #70581f",
+"#d c #705830",
+"#e c #705f2f",
+"#f c #705f3f",
+"#g c #705f4f",
+"#h c #705f50",
+"#i c #70683f",
+"#j c #706840",
+"#k c #70706f",
+"#l c #7f5000",
+"#m c #7f5f2f",
+"#n c #7f6030",
+"#o c #7f673f",
+"#p c #7f6840",
+"#q c #7f685f",
+"#r c #805820",
+"#s c #805f10",
+"#t c #80602f",
+"#u c #80673f",
+"#v c #80684f",
+"#w c #806f40",
+"#x c #806f50",
+"#y c #806f5f",
+"#z c #80704f",
+"#A c #80786f",
+"#B c #807f5f",
+"#C c #8f6020",
+"#D c #8f6f3f",
+"#E c #8f6f50",
+"#F c #8f7040",
+"#G c #8f784f",
+"#H c #906010",
+"#I c #906720",
+"#J c #90682f",
+"#K c #906f3f",
+"#L c #90702f",
+"#M c #907060",
+"#N c #90773f",
+"#O c #907840",
+"#P c #90786f",
+"#Q c #907f6f",
+"#R c #908050",
+"#S c #90875f",
+"#T c #90886f",
+"#U c #908f70",
+"#V c #909080",
+"#W c #9f701f",
+"#X c #9f702f",
+"#Y c #9f7840",
+"#Z c #9f804f",
+"#0 c #9f8050",
+"#1 c #a0680f",
+"#2 c #a0783f",
+"#3 c #a0804f",
+"#4 c #a0806f",
+"#5 c #a0874f",
+"#6 c #a0875f",
+"#7 c #a08f50",
+"#8 c #a08f5f",
+"#9 c #a0906f",
+"a. c #a09770",
+"a# c #a0977f",
+"aa c #af701f",
+"ab c #af782f",
+"ac c #af7f3f",
+"ad c #af803f",
+"ae c #af876f",
+"af c #af884f",
+"ag c #af8f5f",
+"ah c #af8f6f",
+"ai c #af8f7f",
+"aj c #af9070",
+"ak c #af907f",
+"al c #af9880",
+"am c #af9f70",
+"an c #afa080",
+"ao c #b06f0f",
+"ap c #b0802f",
+"aq c #b0904f",
+"ar c #b0975f",
+"as c #b09780",
+"at c #b0a06f",
+"au c #b0a890",
+"av c #bf8f3f",
+"aw c #bf907f",
+"ax c #bf974f",
+"ay c #bf977f",
+"az c #bf985f",
+"aA c #bf9860",
+"aB c #bf9f6f",
+"aC c #bfa080",
+"aD c #bfa870",
+"aE c #bfa880",
+"aF c #bfa890",
+"aG c #c09750",
+"aH c #c09f80",
+"aI c #c0a760",
+"aJ c #c0a76f",
+"aK c #c0b080",
+"aL c #c0b790",
+"aM c #cf9740",
+"aN c #cfa78f",
+"aO c #cfa87f",
+"aP c #cfaf6f",
+"aQ c #cfaf90",
+"aR c #d09f80",
+"aS c #d0a860",
+"aT c #d0b770",
+"aU c #d0b88f",
+"aV c #d0b890",
+"aW c #dfa750",
+"aX c #dfaf90",
+"aY c #dfb79f",
+"aZ c #dfb8a0",
+"a0 c #dfc08f",
+"a1 c #e0a780",
+"a2 c #e0b790",
+"a3 c #e0b79f",
+"a4 c #e0b870",
+"a5 c #e0bfa0",
+"a6 c #e0c8a0",
+"a7 c #e0cf9f",
+"a8 c #efb090",
+"a9 c #efbf90",
+"b. c #efd7af",
+"b# c #f0bf9f",
+"ba c #f0c0a0",
+"bb c #f0cfb0",
+"bc c #ffc8af",
+"bd c #ffd7b0",
+"be c #ffd7bf",
+"bf c #ffd8bf",
+"bg c #ffdfc0",
+"bh c #ffe7c0",
+/* pixels */
+"............................#8#8#9.Y..........#8#8#2#2..........................................",
+"..........................au#3#3a.aD#T#8aIa.#8........#8..#8#8..................................",
+"......................#Z#2aOaPar#PaLalaD#8#8....aD..#2......#8#8................................",
+"....................#8#Aajam#xa.........aE#x#e#t#p#O#8.G#3aV#Z#9#8#2#o..........................",
+"..................a#.....p#0....aE#P.p.i.2ab.P#aat#K.Y#F.4.x#ZazaV....#2aL......................",
+"............#F#D....aE#TaA#FaI#D#b#D.E.Y#3ad#D.H.s.l.k.q.E.z.f.O#Y#7an#0#SanaL..................",
+"..........#o#v....aBaKaua##2#.#C#C#m#2.w#t#I.P.M.n.k.i##.c.d.q.p.b.6#daI....#b..................",
+"..........#q..#2#FaAalaB#s#J#n.W#K##.R.z.k.x.s.d.n.o.r.Q.c.g.E#a.P.c.f#da##8..aI................",
+"........#3..#2.1..#D#tad#Zag#w#d#n.n.u.d.#.k.#.c.c.n.b.#.d.F#L.f##.f.c.c#7#D..a7................",
+"......aD#9a..Q..#LaW#maTaIa4#6.d.c.d.c.f.c.s.s.c.#.b.o.P.r.r.W.##a.M.#.e.k.4#eaKaOaL............",
+"......aD#8aL..#F.2#X.0.Y#e.Y.u.d.c.c.j.#.c.y.j.n#Mak#M#v.W#L.##d#K#c.s.f.l#R.caDa0..a0..........",
+"....#Ta.#F#A..#l#W#N.W#s.z.d.k.n.k.y.o.g.t.aawbdb#a3aQ#4#f.Z.y.x#aad#a.O.R.#aD.eaLaz..#F........",
+"....#2alal#8#t#n#Z.W.V.g.e.f.t.o.s.g.k.y.E#4babab#a1aRae#M.L.K.N.zaMac.W.4.u.c.c.RaD#8aD........",
+"....aU#8#m#Q#L#K#c.M.c.c.e.l.t.f.#.b.Y#a.Obfbfbhbaa5aNas#Q.T.C#a#e#m#X#m#f.S.c.c#j..a0#2#2......",
+"..#2#2..#8#s#r#l.w.i.c.t.z.H.t.#.o#x#F.MaRbfbhbgbca9aQas#Q.1.C.H.2.B#u#Y.4.H.S.B.e..#2b.au......",
+"....#FaDaO#5.p#W#J.i.#.f.o.H.l.R#v#u#t.waZbfbgbgbca3aQak#E.T.L.H.F#K#f#Y#a#a.R.0.l.Z#T..#W......",
+"....aV#9#e#0.pap#C.c.f.#.z.t.4.4.G.3.r.maXbhbgbga6aZaNaj#Q.J.L.K#w.V.3#Y#u.W#d.S.c.taD..aA#2....",
+"..azauaL.2ag#2#C.3.g.c.z.G.b.G.n.4.w.q.baXbfbcb#a5aQas#Q.5.I.J.H#.###b.O#Iab.W.e.c.kaD....aU....",
+"..#Z..#l#2#7aA.N.F.c.c.c.#aha5bbaZai#y.P.0bba2a2aXawai#y.L.I.A#t.M.Q#L#naa#8.p.D.#.z#FaD..au#8..",
+"..#Wa.ab#c.2aG#t.x.c.h.cbebaa8baaYaH#E.Z.WaNaQaNayai#M.1.J.C.K#H#I.P#e.v#s#D.D.n#z.h.Ba7..a.#2..",
+"....aF#l#L#2#L#6.P.#.caZbgbgbaa1aXaw#4#g.A.Vaeai#4#y.T.A.C.B#J#L#H#c#S.4.DaI#b.F.4#6ataO..aEa...",
+"aA#o#pab#lag#a#r.n.c.vaZbhbgbbbaaXasai#q.J.B#K#E.5.A.A.J.H.W.Vacad#N#R#o.j#C#7##.n#8.c#6aE..aE..",
+"....#t#Lao#5#mazag.caebhbhbgbba2aXaC#U#h.C.u#u#K.Y.7#K#K#2.3.k#m.4.Q.0aB.o.xaq#m.c#0.7.R....aE..",
+"....az#NaoaMaTaqaA.#aXbhbdbbbaaXaQak#M.1.I.L.u.y.z###5#racad#5#7.k.s#raI#Z.R#s#6.#.0#F.9..#Z....",
+"....aI.Nac#5aq#l#I.faNbfbcbba5aQaw#4#y.L.I.L.K.k.E.i.i.D.3aa#Hac.E.l#m#Oah.O#raf.z.c#wauaD#Z....",
+"an...X#naS#cap#Y#1.N#gbbbaa5a5aCak#M.1.I.I.I#J.V#faXbbaYas#E#J#I.3.k.4ad#2.4#s.D#f.#.R#GaJ#T....",
+"#T#9#oag#saa#J#F#b.m.cbbaXaNaHak#Q#h.C.I.J.B#lahaTbca8a3aHak.U#a#a.G.B#5#w.TaG#K.G#6.laAaAa.....",
+"..auaDaI#u#WaxaS.P#b.#.CaQaw#4#M#q.L.C.I.A.M#EaTbcbca1a2aHah#x.X#d.y.G#maq.8ap#X.z#G.g#2aE#8aL..",
+"..#Fan#laE#HaWaxat#w.m.c#x#P#y.5.C.L.J.C#u#caAbcbhbeb#aRay#4#P.T.C.s.k#DaS.7.E.baB.c.7aIaK..#9..",
+"....aE#q#2.6#a#I#taK.YaP.c.j.X.K.X.H.H.X#taJbcbfbgbfbaaYaHak#P.U.J.G#F#ma4aq#N.Q.c.#.7ar........",
+"....a.aG.D#6.p.Dac#d#2.6#z.a.j.O#n.D.E.#.cawbdbdbebba5aRaC#4#y.L.C.S#mafar#d#N.0.h.#az#V#8..#D..",
+"aL..aDaG.X#N#o.M#I#u#X.S.E.4.c.f.r.i.3#c.cawbdbcbeb#aXaNak#Q.5.L.L.B#2#mar#m.M.6.c.B#Z.RaT..#Za.",
+"#8auaE..#F.w#3ar#a#9ab#o.N###j.c.x.k.g.M.r#EbfbcbaaZaQas#4#y.I.C.A.0#5#m#Z#t#o.h.caA.t#e....al.8",
+"....aEaI..aA#r#F#oat#i#oac.2.c.c#J.x.G.P.p.jbca2aXaNaFai#P.5.I.I.v#2#Y#O#Y#C.7.c.caT.c#2..aAaAaG",
+"......#8a.am#k#Yag#F#w#FaD.V.#am#m.q.k.G.P.r#gaXawawae#M#g.C.L.A#dac#d#3#o.O.x.caP.c.#aA..aT#S..",
+"......#S....#T#i.uaI#n.D#jam.r.aag.W.W.E.W#a.p#gai#Q#y.T.C.C.A.5acaq#o#v.O.o.c.c.c.c.F..aB#OaT#B",
+"........#R....#T.w#faj.m.i#n#G#o.zag.O#u#m.F.j.0.K.L.I.I.C.Z#u#5aTaJ.H.E.G.f.#aP.d.##3a.#Z..a...",
+"........a#....#T..#e#F#6.O.a#O.w.6#i#8.G.O.6#X#i.O.x.H.X.H#aaxavaA.l.k.x.t.##S#w.c.lazaA#Z#T....",
+"..............am....ag#D#i#z.Q.o.#.w#e#0.m.Y#d.W.E.x.x#e#t#e#K#2.p.j.#.c.h.##9.7.#.SaD#DaE......",
+"................#N....aC.R.6.4#6.7.F.q.Y#0#e.n.F.O.O#a#w#v.E.E.b.j.c.e.d.#.H#B.#.7#7#U..........",
+"................aA#8#2#T#7.X.7.7.0.0.6ag#o#R#f.r.0#n#p.#.c.#.c.#.#.c.c.#.c#G#R#S#i#0............",
+"..................aL#8#Zaq#8.0.#.4#n.t.c.##waJ#0.G.z.R.r.o.f.d.c.e.#.4.0#o#8#F.#.o........#U....",
+"......................#8#8#DaDaD.T.h.t#8#z.h#Z.0.R.g.m#G#n.l.h.c.##z.0.##G#j.#.UaS#3#8#T#q......",
+"....................aE......#8aK#N#R#6.O.#.B#0#6#o.7#G.u.d.#.c.c.#.#.h#v#v#j#z#8#S#T#UaD........",
+"......................#Z....#NaL#8#jam#B.6#w.7#i.u#7araT#z#z#p#iaTaPat#p#R.#a....Y..............",
+"..........................#R..aEaja#.1#7#A#0.6.c.c.S#6.f.#.d#R.#.e.c.#.7#T......................",
+"................................#F#8#6........#o#o.c.c#K#n#u.o.Y#v#R#k..aI..a.a.................",
+"..............................#9#9....an#Z............#8#0..#0#RaE....#U#Sa....................."
+};
+SIMPLE = T
+BITPIX = 8
+NAXIS = 2
+NAXIS1 = 48
+NAXIS2 = 48
+HISTORY Written by XV 3.10
+END
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SSSSSSSSSSSSSSSSS ƒSSSSSSƒSƒ~©SSŠƒ”SSSSSSSSSSSSSSSSSSSSSSSSSSs‰SSSSiirci/M
+l~oS¤S””SSSSSSSSSSSSSSSSSSSSS~S©•–Y‹yƒ]P‰~_†SSSSSSSSSSSSSSSSSSSSSSƒSSv´
+dz]m_d6‹–´ppid´°i~”SMSSSSSSSSSSSSSSSSS©SSS®v~‰EBƒ‰i_y6&lldpƒ†Š§SSSS
+SSSSSSSSSSSr§§R&6p&ƒTL%yc'&pTydXªƒ†nSSSSSSSSSSSS´ƒTYc6m¦ƒ@?L//
+YTis/SSSSŠSSSSSSSSSSœ|†‹L__TT]’i~_/Tciy~ƒdƒSSSSSSSSSSSSSSvSS¥L]Y‰
+_=+Mƒ]+=EESml99 @z_‹ŠSSSSSSSSSSSSSS’rdpI/3]ƒ%MZI955]c]r|) &_P§r©SSS
+SSSS–SS†S]s‰Ew3]d@E]vdE5@L@S™“œ'"56ƒm'œœƒ†SSSSSS~SS†3_•%cyi?’Eib= TFHCCERi†
+´¦@9@°ƒ”ƒS”SSSSƒSS†d6¤c7d/’II9IS)b—‚rREED[…ilE/=S¢w´zSSS”o|’sms§C
+b+"@I/bº‘xbEHDZ…ZƒiE5°œS´ƒSSS©¤Sœ]sidi…Fl5@I) ׿º±¬—~[CC9||w|f_´|Sœœš
+§©Ss3ƒ–Si@Sd5"B/uá×ËÁµœˆrCEDT†bƒci&œ6]SSœ`´S§šLviBjivP9Y/LWÞ×áʺ±˜‚[H
+HB|b–bB]BƒL´Sƒ”SS”š7‰)7…Z|]p Ec79ÞÞáÕÅ«¥ˆrHEPbŒ–ZvT&œSrSSS©n|]Sjc®M° LF
+L@@Lc¦×áåáËÁ¥˜~XE@sbºvI_–SSSSSs S©d¬™m%p~r[EHEEiWœ×éáÊ«¡ˆ~RE0"rª_9¢_¤®SSS§§¤is™ªITEµˆxnHECDBu´××´¿¥•pLZ;@b`ƒv?y|©´S†i’^ylsT%Õº±¥˜‚bECEBS•´×ÀÁ¥˜XSS@B†mRšr@‰'œœ”SS SLcªWƒ|m@bÕËÅÅ¥˜xYCCClC_ºÕÁœuljL"Y†|Y^7_Ly¦†SSSS¤@…†Sj±á×ÕŵˆrHCHF"97Lyd…9'bw•E]Œ?m§§ƒSSSSœvvœ´œºéÞÕ˺µ˜xYCH6;?S†]…††‹"0]¤ƒL^‰TsfSƒSSSScpv†bœ’‘ééåÕ¿º¥ŠbE6irM_rr|L"bYIT¢/5bƒ_LSS©SœiiS’S]+9ÁéåÕ˺œ—nEBru[DDE@IC…†v~i f‹S+‰©S©SSS¬Sp|p‰IÁååË´ºˆbDC‘—ˆrRDEBlpdWƒY7¤T=Y‰¯S©”SSs”WFšc5&áËÀËÁ¥uRI±µ±¡—xYEEFdjI]9^r7+p&BÍS”|SSƒSS|‹œ@=•ÅÕÁ—rITÕ¿¿º—rHCDcBIpcy)7?s§S§SSœ§´F’|fL?@@+Y3+ºá×Êŵœ‚[CE@PSTEjI"§SS¹SSSSº]ƒ)ƒf?6YY@L/%ºéååÊÁ±•‚EHFmCL|iIZP6§Sœ|SSSSs§¯†)sl/@'Llic3Ááåå×Áµ˜uRH@=r_|SSLT'R†SsSSSS||S^]S36?@6/psB«áéå×ȵœ‚YE@FBi|Y@PBS|Ù§SSSSS¹b‚prWB'6MSEááéËűœ‚RES]bvb_PdSÃ||SSSSS|œœccƒIC6/0";9ˆËËÊ´«‘xHF@?œ…IY6L§§SSSSSS†”sySSsvI^?"+";/6ÞÊÁµˆ_R;5S†SEL§´œSsSSSSSSS§´SsFvTM]M6 ; +x˜xlIpZrW0'~§ÃSÃSSSSSSSS§”ISp¬b´¤º‰00/I//ISB"Y]®¯´SSSSSSSSSSƒS|YSrc†ƒ’mZc+6"+=pS‹rSÍSSSSSSSSSSSSSnS|sœœ¢^lcIrSL?"50+//I9SIZ–S¤SSSSSSSSSSSSSilSS¢®§–|Pffb|3cjIB+"S+)]Z¤SSTSSSSSSSSSSSSSSSsrSS©†œs¤rTr9Mƒ†r@0'"+9?E|‹ ƒƒ ´SSSSSSSSSSSSSSSSSS–SS)ƒSS©~)FISrMsY5ƒœºSS|´SSSSSSSSSSSSSSSSSSSSSy•p”SSSS©p]ciw@ƒºƒ|iSSSSSSSSSSSSSSSSSSSSSSSSƒ|¯°–~´œ§SS§S|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS§ƒƒ”§†¤”SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMSSSSS||SSSSSSSSSSSSSSSSSSSSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
diff --git a/examples/demo/opengl/printpreview.ui b/examples/demo/opengl/printpreview.ui
new file mode 100644
index 0000000..559f0cf
--- /dev/null
+++ b/examples/demo/opengl/printpreview.ui
@@ -0,0 +1,277 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PrintPreview</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PrintPreview</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>634</width>
+ <height>195</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Print Preview</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Preview</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>pixmapLabel</cstring>
+ </property>
+ <property name="text">
+ <string>TextLabel1</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="0" column="1">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Modify</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkInvert</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Invert Colors</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkMirror</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Mirror</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkFlip</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Flip</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkLeft</cstring>
+ </property>
+ <property name="text">
+ <string>Rotate 90° &amp;left</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>checkRight</cstring>
+ </property>
+ <property name="text">
+ <string>Rotate 90° &amp;right</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="caption">
+ <string></string>
+ </property>
+ <property name="text">
+ <string>&amp;Print</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Discard</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>PrintPreview</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>PrintPreview</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>checkLeft</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>checkRight</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkRight</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>checkLeft</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkInvert</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PrintPreview</receiver>
+ <slot>invertColors(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkMirror</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PrintPreview</receiver>
+ <slot>mirror(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkFlip</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PrintPreview</receiver>
+ <slot>flip(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkLeft</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PrintPreview</receiver>
+ <slot>rotateLeft(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkRight</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PrintPreview</receiver>
+ <slot>rotateRight(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">qimage.h</include>
+ <include location="global" impldecl="in declaration">qpixmap.h</include>
+ <include location="local" impldecl="in implementation">printpreview.ui.h</include>
+</includes>
+<variables>
+ <variable>QPixmap pix</variable>
+</variables>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot>updatePreview()</slot>
+ <slot>flip( bool )</slot>
+ <slot>invertColors( bool )</slot>
+ <slot>mirror( bool )</slot>
+ <slot>rotateLeft( bool )</slot>
+ <slot>rotateRight( bool )</slot>
+ <slot>setPixmap( const QPixmap &amp; pm )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/demo/opengl/printpreview.ui.h b/examples/demo/opengl/printpreview.ui.h
new file mode 100644
index 0000000..db5dbfb
--- /dev/null
+++ b/examples/demo/opengl/printpreview.ui.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions respectively slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+void PrintPreview::init()
+{
+
+}
+
+void PrintPreview::destroy()
+{
+
+}
+
+void PrintPreview::updatePreview()
+{
+ QImage img = pix.convertToImage();
+ if ( checkInvert->isChecked() ) {
+ img.invertPixels();
+ }
+ if ( checkMirror->isChecked() ) {
+ img = img.mirror( TRUE, FALSE );
+ }
+ if ( checkFlip->isChecked() ) {
+ img = img.mirror( FALSE, TRUE );
+ }
+ if ( checkLeft->isEnabled() && checkLeft->isChecked() ) {
+ }
+ if ( checkRight->isEnabled() && checkRight->isChecked() ) {
+ }
+ QPixmap pm;
+ pm.convertFromImage( img );
+ pixmapLabel->setPixmap( pm );
+}
+
+void PrintPreview::flip( bool )
+{
+ updatePreview();
+}
+
+void PrintPreview::invertColors( bool )
+{
+ updatePreview();
+}
+
+void PrintPreview::mirror( bool )
+{
+ updatePreview();
+}
+
+void PrintPreview::rotateLeft( bool )
+{
+ updatePreview();
+}
+
+void PrintPreview::rotateRight( bool )
+{
+ updatePreview();
+}
+
+void PrintPreview::setPixmap( const QPixmap & pm )
+{
+ pix = pm;
+ updatePreview();
+}
diff --git a/examples/demo/opengl/qtlogo.bmp b/examples/demo/opengl/qtlogo.bmp
new file mode 100644
index 0000000..b7f9215
--- /dev/null
+++ b/examples/demo/opengl/qtlogo.bmp
Binary files differ
diff --git a/examples/demo/opengl/qtlogo.png b/examples/demo/opengl/qtlogo.png
new file mode 100644
index 0000000..e6e3bee
--- /dev/null
+++ b/examples/demo/opengl/qtlogo.png
Binary files differ
diff --git a/examples/demo/opengl/snapshot.xpm b/examples/demo/opengl/snapshot.xpm
new file mode 100644
index 0000000..1c7180c
--- /dev/null
+++ b/examples/demo/opengl/snapshot.xpm
@@ -0,0 +1,238 @@
+/* XPM */
+static char *camera[] = {
+/* width height num_colors chars_per_pixel */
+" 32 32 151 2",
+/* colors */
+".. c None",
+".# c #1f1f1f",
+".a c #202020",
+".b c #2f2720",
+".c c #302020",
+".d c #302820",
+".e c #3f2720",
+".f c #3f2820",
+".g c #3f2f2f",
+".h c #3f3730",
+".i c #402820",
+".j c #402f20",
+".k c #403730",
+".l c #4f2820",
+".m c #4f302f",
+".n c #4f403f",
+".o c #4f484f",
+".p c #50302f",
+".q c #50403f",
+".r c #5f2f20",
+".s c #5f3020",
+".t c #5f3830",
+".u c #5f4f30",
+".v c #5f4f50",
+".w c #5f5760",
+".x c #60372f",
+".y c #60382f",
+".z c #60482f",
+".A c #604f40",
+".B c #60504f",
+".C c #60606f",
+".D c #6f4030",
+".E c #6f4730",
+".F c #6f676f",
+".G c #6f7790",
+".H c #70402f",
+".I c #704030",
+".J c #704830",
+".K c #704f3f",
+".L c #705f50",
+".M c #706860",
+".N c #707780",
+".O c #7f6850",
+".P c #7f706f",
+".Q c #804f2f",
+".R c #80573f",
+".S c #805f40",
+".T c #806740",
+".U c #807060",
+".V c #807f80",
+".W c #80808f",
+".X c #8090b0",
+".Y c #80a0d0",
+".Z c #8f5730",
+".0 c #8f5840",
+".1 c #8f7f7f",
+".2 c #8f8f90",
+".3 c #905f40",
+".4 c #906740",
+".5 c #90684f",
+".6 c #907f6f",
+".7 c #908780",
+".8 c #908f8f",
+".9 c #9097a0",
+"#. c #909fb0",
+"## c #90a7cf",
+"#a c #9f5f30",
+"#b c #9f684f",
+"#c c #9f7750",
+"#d c #9f887f",
+"#e c #9f8f80",
+"#f c #9f9790",
+"#g c #9f98a0",
+"#h c #9fa0af",
+"#i c #9fafd0",
+"#j c #9fafdf",
+"#k c #a06f4f",
+"#l c #a0703f",
+"#m c #a07f5f",
+"#n c #a0906f",
+"#o c #a09780",
+"#p c #a09890",
+"#q c #a09f9f",
+"#r c #a0b0c0",
+"#s c #a0b7e0",
+"#t c #af7850",
+"#u c #af875f",
+"#v c #af978f",
+"#w c #af9fa0",
+"#x c #afa09f",
+"#y c #afa0a0",
+"#z c #afa7af",
+"#A c #afa8a0",
+"#B c #afa8b0",
+"#C c #afafcf",
+"#D c #afb7d0",
+"#E c #b07f50",
+"#F c #b07f5f",
+"#G c #b0a08f",
+"#H c #b0a79f",
+"#I c #b0a8af",
+"#J c #b0afa0",
+"#K c #b0b0b0",
+"#L c #b0c7ef",
+"#M c #bf875f",
+"#N c #bfa89f",
+"#O c #bfaf9f",
+"#P c #bfb0a0",
+"#Q c #bfb0af",
+"#R c #bfb7b0",
+"#S c #bfb8bf",
+"#T c #c0b09f",
+"#U c #c0b7af",
+"#V c #c0b8af",
+"#W c #c0b8bf",
+"#X c #c0bfb0",
+"#Y c #c0c0bf",
+"#Z c #c0d0df",
+"#0 c #cf9f6f",
+"#1 c #cfc0b0",
+"#2 c #cfc0c0",
+"#3 c #cfd7f0",
+"#4 c #d0bfa0",
+"#5 c #d0c8c0",
+"#6 c #d0cfc0",
+"#7 c #d0cfd0",
+"#8 c #d0d7a0",
+"#9 c #dfcfbf",
+"a. c #dfd7cf",
+"a# c #dfd7df",
+"aa c #dfd8df",
+"ab c #dfe0bf",
+"ac c #dfe7ff",
+"ad c #e0d7af",
+"ae c #e0d7d0",
+"af c #e0d8df",
+"ag c #e0e0e0",
+"ah c #efe0e0",
+"ai c #efe7e0",
+"aj c #efe7ef",
+"ak c #efe88f",
+"al c #efe8f0",
+"am c #eff0a0",
+"an c #f0e0c0",
+"ao c #f0e7e0",
+"ap c #f0e8e0",
+"aq c #f0f0ef",
+"ar c #f0f0ff",
+"as c #f0f8ff",
+"at c #fff7ff",
+"au c #fff8f0",
+/* pixels */
+"............................................#o#N#N#v#P..........",
+"........................................#H#U#H#N#U#5ae#Y#H......",
+"......................................#H#v#e#N#U#1aeaeahah#H....",
+"....................................#H#v.1#d#O#Y#5aeahapaqaa#H..",
+"..................................#H#N.1.M.7#Ya#aeagapatapap#5..",
+"..................................#1#y.V.7#q#I#S#Ya#agajalalah#O",
+"...................8#y.V.P.h.h...1a.#1#P#W#q.V.9#.#.#Kaaatauau#1",
+".............8#y#q#y#I#R#Y#q.e.c#Papapaual#B.G###r#i.X#Calauau#1",
+".........p.f.8#K#S#R#K#S#S#S#q.b#1auauauau.X#rakab#L.Y#iasauau#7",
+".......p.l.j.n#d#K#R#R#S#K#K#S#p#Pauauauau#D#8amac#L.Y##auauaual",
+".....p.j.e.p.i.q#d#A#I#W#W#Q#S#S#Pauauauau#D#Zacac#L#j#sauauauag",
+"...m.p.m.f.e.i.l.S#Raaaaagalatal#Xauauatah#K#L#3ac#3#j#3auauau#6",
+"...l.m.m.e.i.y#b.Laiauauauauauau#Pauauahafaf#7#r#r#i#Dauauauauae",
+"...e.f.j.b.e#b.R.haaauauauauauau#Hahaoaf#5#6#7#K#h#Ba#ajauauag#H",
+".D.D.l.b.a.f#M.h.#aaauauauauauau.P#5aeae#1#Y#6#w.2.9#g#z#7#7ae..",
+".p.s.s.b.a.f#F.t.baiaualagahalag.E#dae#1#P#J#Y#y.F.C.N.W.2#f#H..",
+".e.p.p.a.a.f#E.D.calau.F.#.u#n#2.K.f#4#X#x.8#y#A.F.o.w.C.7#H....",
+".t.x.f.a.a.e#E.D.caqau.g.z.A.A#J.R.f.O#Y#U#f#y#P#N.M.v#d#x......",
+"...i.c.b.a.f#E.D.calaq.Bad#G.d#I.E.#.q#o#N#X#P#P#P#v#A#x........",
+"...e.a.a.b.f#t.x.capap.M.L.k.oae.D.#.K.R.f.B#Y#1#1#V............",
+"...e.b.b.b.f#t.t.calau#P.n.n#Qau.y.#.R.R.#.c....................",
+"...i.e.c.b.f#t.x.haqauau#Y#Yaqau.p.#.R.R.c.h....................",
+"...l.c.e.e.j#t.s.tauau#6.q.q#Nau.h.c.T.0.c.j....................",
+"...c.e.i.i.j#F.x.Dauau.U.S.1.q#5.D.c.5.R.c.j....................",
+"...e.i.l.l.y#b.x.taq#5.A#4an.1#9.H.c#c.Z.c.p....................",
+"...e.l.l.l.3.0.r.5auae.U#N#O#e#9.D.c#m.4.r.I....................",
+"...c.r.x.r.0.J#t#0arau#9.6#d#9au.J.c.R.3.s.I....................",
+"...e.x.y.y.3.3.Z#uauauauauauauah.Q.l.D.0.x......................",
+".....l.H.I.Z#k.y#mauauauau#9#v.4.J.r............................",
+".......y.I.J#k.x.3#T#q#m.3.Q.Q.y.s..............................",
+".........y.Z#t#l#a.Z.J.y.H.x....................................",
+"...........y#l.I.x.x.x.........................................."
+};
+SIMPLE = T
+BITPIX = 8
+NAXIS = 2
+NAXIS1 = 32
+NAXIS2 = 32
+HISTORY Written by XV 3.10
+END
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SSSSSDxNCCCSSSSSSSSSSSSSSSSSSSSSSSSSDd„xmdRDMCSSSSSSSSSSSSSSSSSSSSSDNRzCk²Ÿ…kZZD
+=SSSSSSSSSSSSSSSSS4MNdzD…ùùùùÒžoR=SSSSSSSSSSSSSSS.CDDkkdŽùùùùùùåZ4MgCSSSSSSSSSSS
+S%=C=gR„¨òùÒ‚ŽÒùR%ak=NSSSSSSSSSSS.444kg=qùÙs®²’ÒM%…o=NSSSSSSSSSSS./44DwCDïÉRÀà„Ò
+M%~d%:SSSSSSSSSSS%.//2ŠCMùùse„EÉM%qa%2SSSSSSSSSSS4%..2„=DùùÍEE®ù8%ig%2SSSSSSSSSS
+S/.%(.„C8ïùù¿¿ïù:aa%8SSSSSSSSSSS.(((.„D%ëù²EEµùDaa%SSSSSSSSSSS. (.„C%ééib9KÙ
+MWa.U¿Â¹SSSSSSS/%( .ˆM%ëïUÓ¢)«QE–®½²²²ž©¥SSSSDC. .ˆM%ïù4LRR­a.l¿¸˜¥²®iTŽ¥SSS
+.:: .ˆM%ëùkOÅW.À½¥¥©kK[b‰¨SS:==( .ŠD(èùëàåëàQŽÙ²­¿¥kbv‚˜¨SMM4( .”8Ûùùùùùù
+uÉÙÙ¿ͤ–›«ÏÏÙSS..2(.wa8Ûùùùùùù¨åéÛÉÍÏ°¢«Ûëùùà¨S4::./Dwbèùùùùùù²ùùåÛÛÏ­­®¸ùùùùÙ
+S:::../4e¸ÛÛàëûë½ùùûå°ÅØèرØùùùÍSS:2.:/EŽ©«»»µ»»²ùùùù¸ÌèèűµùùùàSSS:42EŽ°¸¸»°°»™
+²ùùùù¸ÌãèÅœ¥ùùùëSSSS:.°»¸°»»»Ÿ(Âùùùù­ÜÚÅœ®öùùÏSSSSSS¥Ÿ¥«¸¿Ÿ.%²ééùë«x¥­®´ëùùÂ
+SSSSSSSSS¥u88S„ز»Ÿ–œœ°ÛûùùÂSSSSSSSSSSSSSSSSSÂ¥‰Ÿ«»¿Ûàëëëå²SSSSSSSSSSSSSSSS
+S¨®„i‰¿ÛÙàéûééÉSSSSSSSSSSSSSSSSSSS¨ž„Ž²¿ÉÙåéïÛ¨SSSSSSSSSSSSSSSSSSSS¨ž’®¸ÂÙÙåå¨SSSSSSSSSSSSSSSSSSSSSS¨¸¨®¸ÉÙ¿¨SSSSSSSSSSSSSSSSSSSSSSSSS–®®ž²SSSSS€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
diff --git a/examples/demo/opengl/texture.xpm b/examples/demo/opengl/texture.xpm
new file mode 100644
index 0000000..3c423e9
--- /dev/null
+++ b/examples/demo/opengl/texture.xpm
@@ -0,0 +1,130 @@
+/* XPM */
+static char *Monalisa[] = {
+/* width height num_colors chars_per_pixel */
+" 48 48 27 1",
+/* colors */
+". c #000000",
+"# c #281808",
+"a c #38240c",
+"b c #492c10",
+"c c #553414",
+"d c #593818",
+"e c #5a5a5a",
+"f c #65411c",
+"g c #794d24",
+"h c #7d5124",
+"i c #86592c",
+"j c #966534",
+"k c #9a6938",
+"l c #aa7545",
+"m c #ae7949",
+"n c #b68251",
+"o c #be8a59",
+"p c #c79665",
+"q c #cf9e6d",
+"r c #d3a275",
+"s c #d7aa7d",
+"t c #dfb28a",
+"u c #e3ba92",
+"v c #ebc7a6",
+"w c #ebcbae",
+"x c #ffffff",
+"y c None",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"e..............................................x",
+"e.oppqnnoononoonnoonpppooqpooonopppqppoonnpoopox",
+"e.oloonpnoonpooooopnpolljjllnpnqoopooopnnnnpoopx",
+"e.looooopnoonpoppoplifbbbbccdgloppppoqpoooopoqqx",
+"e.ooopqppqpoopopppibbdcababbddcdloppqoolpnppppqx",
+"e.pporpppppqppqoogbcdgabbbbbaccdckppqqpoopoqrrrx",
+"e.rpqqqooppoprrrgbccgdbcbbaababccbjppqqppopoqrrx",
+"e.pqppqsqpppqrrkbbdilkigcbabbabbdcclpqpqopppqqqx",
+"e.oqqqppqpqqrtpcgnrstrrnmifbbbbccccdnpqrqqqoqqqx",
+"e.qpqpqpqpqstrjdnruwwwusrnigcbabccdchrrsrqrqqprx",
+"e.oqqpqqpqrttoajrvwwwwwwrrlhdbbaacdcborqrrrrqrrx",
+"e.qqqrrtrstwtfdntwvvwvwwuqmjgcbbbacbbirqpqrrrrsx",
+"e.qrrrrrrrtvofdntwvwwvwutpmkidcbaaababpnopppprrx",
+"e.srprrrprspidhouwwvvwvtsrpnkjfbbaaaabjknnmnpprx",
+"e.rrsrrssssoddiruvvvvwvwttrrokgccbbabagjkkkmpnpx",
+"e.stwrwrwrvkddipuuvvvvtssrrpnkfdcbbaaafiijkllmnx",
+"e.lnrsrwrvpjddfppoqutslllmmkjifcddbbbbffhiklknmx",
+"e.kjjrsrwrmfddffkkjpslfilifdbhgcccbbbbcfgghjkkkx",
+"e.ijjrwrrrofdddblafmtiimmahfklhbccbabacfffgjjjhx",
+"e.hjjppklonddakoonlrtilrrnkornicccbbaacgfggfihfx",
+"e.fhfkiidjkdbakttrsrtmosstttrmhddddcbcbdffhkfghx",
+"e.dffafhfffhaairuutusqmwuwurplhdfddcdccggggghffx",
+"e.dddddfdddaddhruututnrswutrlkfcdfdfdcchjjkkmmkx",
+"e.daffdadaddaadrstrutomustsokffddddcdccddfhihjkx",
+"e.fgddddabadddalrsotpiktutpmkidcddfddcdddddghfgx",
+"e.fcddddbabbdbainrsnfairspnkigdcdfccdcccdddddfdx",
+"e.ddddbbddbbbadfmlsrkmmmmomkjgddfdfgdccdfffffffx",
+"e.ddcdadbbabddahlnlnmiiioonlffdbfdccddddfffffffx",
+"e.cdbbdbdcbcdbdakorrmmkmopniifdcddddcddddffgfgfx",
+"e.cddcbdddcabddadkrqmlmmnlkfhdbccccddcccdfdfgfgx",
+"e.dgffffhhcfadbddalsvtonkjffddcdccddcdccdggfgggx",
+"e.dcdddffgdadddbadaoqomkffffdbbbcbdddcbccfffgfgx",
+"e.cdddgilkfbcdbdaaaaiffffdfdbddbccddccbbcffdfgfx",
+"e.fhggghkkhddbdbaaaaadfafddbfbddccccbcbbcfddfgdx",
+"e.hkhmllkkidabdbbaaaafdfadbddffdcbabbbbabdffdfgx",
+"e.imlllhliifddbbb#baakjffddfhhhfcbdbbbbbbfdfiffx",
+"e.hljhllhjhfbdbbaaadafmlkihhhiihdbbbbabbbdfgghgx",
+"e.dhlggiiigdccdbaa#abgmlmkkjkklkhdbdbbdaabbccccx",
+"e.hbadfdcbcbaabaaabdfimnnmllmnmkiddbdddbbbabddcx",
+"e.gbbabbbabbbcbbbbbinrppoonppppojfdffddcbbabcbcx",
+"e.dba#abcbabcbcbdhknrtrtrrrrrrroliffidccccbdcghx",
+"e.fbab#acbbcbbccinsrtttssttwssrpkfigifcbbcbbbcfx",
+"e.daacbbdcbbbbdborpwttwwttwswsrpmigfgdbbdbbbbcdx",
+"e.dcccbcddcbddfirtuwwwswswswrwprlfigfdcddccbacdx",
+"e.fdcdcddbbcddgmrswwwuwtswwtwsrpjiiffccbcfddcbcx",
+"e.fdfhccbbbbfhiowwswwwtwutwttwrpjfiggbcdhgdfcbbx",
+"exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+};
+SIMPLE = T
+BITPIX = 8
+NAXIS = 2
+NAXIS1 = 48
+NAXIS2 = 48
+HISTORY Written by XV 3.10
+COMMENT the GIMP was here
+END
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZ€G>GY::1111GYa”ÑѲÑÑÑ»ÑÁ»Ñ»»Ñ«Ÿ
+nGaUU1:>YU>G:11ÿZ€G>:>:>>11:>>Uƒ«²ÑÑÑÁÑ»²ÑѻѲ«ŸnaaGG::1:G>>:1:ÿZ€>:::1:>>:1>>Ga
+«»ÁÑÑѲѲѲѫџ«GaUG>:>>::1':>ÿZ€>'':11>:1111>1”«ŸÑ»»ÑÑ»»Ñ²Ñ²«ŸƒaUGU>11>1111:>ÿ
+Z€G1'1':11:11::aŒ²«»»»²²»»Ñ²²«ŸrGaUaG:11:111:GÿZ€>1''1:1'1:1:1>YrŒ«»«»«««««««”
+aGGa>::::1>:UYÿZ€U11'111'111:11111aŒ«ŸŸ””ŒŸŸŸŸ”nG>GG>>:11'1:1:ÿZ€Y1'>G>:1:1''1'
+''1>GaƒŒŒƒƒŒƒra>>1>>>111'1>>:ÿZ€>YUUaaaU>::>1'''1UƒƒrrnrrrY>1>11>''11::::ÿ
+Z€YnYYnYG1>11'''>'GƒraYYYaaY>1111'111>GUUYUÿZ€aƒYaaG>>1111''rnGG>>GYYYG
+:1>111111G>GaGGÿZ€YrYƒrra>'1>11''''G>G'>1>>GG>:1'1111'1>GG>GUÿZ€GYUUUYrrY>>1>1
+'''''>G'G>>1G1>>::::1:11:G>>GU>ÿZ€:>>>UarG1:>1>''''aGGGG>G>1>>1::>>::11:GG>GUGÿ
+Z€>:>>>GGU>'>>>1'>'”§”ƒrGGGG>111:1>>>:1::GGGUGUÿZ€>UGGGGYY:G'>1>>'²Î»”ŒrnGG>>:>
+::>>:>::>UUGUUUÿZ€:>>:1>>>:'1>>'>r«§ƒƒƒŒrGY>1::::>>:::>G>GUGUÿZ€:>11>1>:1:>1>'
+r”««ƒƒrƒ”ŸŒaaG>:>>>>:>>>>GGUGUGÿZ€>>:>'>11'1>>'YŒŒƒaaa””ŒGG>1G>::>>>>GGGGGGGÿZ€>>>>11>>111'>Gƒ²«rƒƒƒƒ”ƒrnU>>G>GU>::>GGGGGGGÿZ€G:>>>>1'11>1'aŒ«²ŒG'a«²ŸŒraU>:>G::>:::>>>>>G>ÿZ€GU>>>>'1'>>>'«²”»Ÿar»Á»Ÿƒra>:>>G>>:>>>>>UYGUÿZ€>'GG>'>'>>''>«²»«Á»”ƒÁ²»²”rGG>>>>:>::>>GYaYnrÿZ€>>>>>G>>>'>>Y«ÁÁ»Á»Œ«²ÑÁ»«rG:>G>G>::YnnrrƒƒrÿZ€>GG'GYGGGY''a«ÁÁ»Á²§ƒÑÁÑÁ«ŸY>G>>:>::UUUUUYGGÿZ€GYGraa>nr>1'r»»«²«»ƒ”²²»»»«ƒY>>>>:1:1>GGYrGUYÿZ€YnnŸŸr”Œ>>'r””Œ«»a««Œr”«Œa:::11'':UGUUGaYGÿZ€ann«Ñ«««”G>>>1'Gƒ»aaƒƒ'YGrY1::1'1':GGGUnnnYÿZ€rnn«²«Ñ«ƒG>>GGrrnŸ²GaaG>1YU:::1111:GUUYnrrrÿZ€Œ«²«Ñ«ÎŸn>>GŸŸ”§Á»²ƒƒrnaG:>>1111GGYarrŒƒÿZ€²»Ñ«Ñ«Ñ«Îr>>aŸÁÁÎÎÎλ²²««ŸŒrG>:11'''GaanrƒŒÿZ€««²««²²²²”>>a«ÁÎÎÎÎÑÎÑ»»««”rU::11'1'UnrrrƒŸŒŸÿZ€²«Ÿ«««Ÿ«²Ÿa>Y”ÁÑÑÎÎÑ벫ŸŒrnG11''''1nrŒŒƒŒŸŸ«ÿZ€§«««««««»Î”G>Œ»ÑÎÑÑÎÑÁ»Ÿƒra>:1'''1'1ŸŒ”ŸŸŸŸ««ÿZ€§§§««»«²»Ñ»G>Œ»ÑÎÎÑÎÑÑÁ§ƒnU:111':11a«§Ÿ§««««²ÿZ€”§§Ÿ§§Ÿ§«»»”'n«ÎÑÑÑÑÑÑ««Y>11'':>:1”«§««««§««ÿZ€§Ÿ§Ÿ§Ÿ§Ÿ§²»«n>Œ«ÁÑÑÑÁ²«ŒaU:1'1::>:Y««²«§«§§Ÿ«ÿZ€”§§§ŸŸ§Ÿ§§«»Ÿ:UŒ«²»««ŒƒaG1111::::>ŒŸ§«§§§”§§§ÿZ€Ÿ§ŸŸ§²§ŸŸŸ§««r11>araU:1'11'11>::Ÿ§Ÿ§”ŸŸŸ§§§ÿZ€«Ÿ§§§””ŸŸ”Ÿ«««U1::U>1:11''1'1::1nŸŸ§§ŸŸ”Ÿ”§««ÿZ€ŸŸ”«ŸŸŸŸŸ§ŸŸ§””U1:>U'11111'::>:rŸŸ§§Ÿ””Ÿ”§«««ÿZ€”””Ÿ§ŸŸ§Ÿ””Ÿ”ŸŸŸa11>:'1'11>>:>”ŸŸ§””ŸŒŸŸŸŸ§ÿZ€”””””ŸŒ””ŒŸ”ŸŸ”ŸaG1111::>U”ŸŸŸŸ”§Ÿ””””Ÿ”§§ÿZ€”””ŒŸŒ””ŒŸ”””””ŸŒŸ”nnŒŸŒ§””Ÿ”””ŸŒŒŒŒŸ””ŸÿZ€”ŸŸ§ŒŒ””Œ”Œ””ŒŒ””ŒŸŸŸ””§Ÿ”””Œ”ŸŸŸ§ŸŸ””ŒŒŸ””Ÿ”ÿZ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
diff --git a/examples/demo/opengl/wirebox.xpm b/examples/demo/opengl/wirebox.xpm
new file mode 100644
index 0000000..77ca534
--- /dev/null
+++ b/examples/demo/opengl/wirebox.xpm
@@ -0,0 +1,155 @@
+/* XPM */
+static char * EscherCube_xpm[] = {
+"48 48 104 2",
+" c None",
+". c #30C230C22081",
+"X c #30C230C230C2",
+"o c #30C2410330C2",
+"O c #410330C24103",
+"+ c #410341034103",
+"@ c #514451445144",
+"# c #514461855144",
+"$ c #618551446185",
+"% c #618561856185",
+"& c #71C671C671C6",
+"* c #71C6820771C6",
+"= c #965882078617",
+"- c #861792488617",
+"; c #965892489658",
+": c #9658A2899658",
+"> c #9E79A2899E79",
+", c #AEBAAEBA9E79",
+"< c #AEBAAEBAAEBA",
+"1 c #AEBABEFBAEBA",
+"2 c #BEFBBEFBBEFB",
+"3 c #CF3CBEFBCF3C",
+"4 c #CF3CCF3CCF3C",
+"5 c #DF7DCF3CCF3C",
+"6 c #DF7DDF7DCF3C",
+"7 c #DF7DDF7DDF7D",
+"8 c #EFBEDF7DDF7D",
+"9 c #DF7DEFBEDF7D",
+"0 c #EFBEDF7DEFBE",
+"q c #EFBEEFBEDF7D",
+"w c #208130C22081",
+"e c #410351445144",
+"r c #514451446185",
+"t c #71C6618571C6",
+"y c #861771C68617",
+"u c #9E7992489E79",
+"i c #9E79AEBA9E79",
+"p c #BEFBAEBABEFB",
+"a c #BEFBCF3CBEFB",
+"s c #BEFBCF3CCF3C",
+"d c #CF3CCF3CDF7D",
+"f c #CF3CDF7DCF3C",
+"g c #DF7DDF7DEFBE",
+"h c #208120812081",
+"j c #30C2208130C2",
+"k c #410330C230C2",
+"l c #4103410330C2",
+"z c #410351444103",
+"x c #618551445144",
+"c c #618561855144",
+"v c #618571C66185",
+"b c #861771C671C6",
+"n c #8617820771C6",
+"m c #965882079658",
+"M c #9E7992489658",
+"N c #AEBAA289AEBA",
+"B c #BEFBAEBAAEBA",
+"V c #DF7DCF3CDF7D",
+"C c #CF3CDF7DDF7D",
+"Z c #208120811040",
+"A c #965892488617",
+"S c #104020812081",
+"D c #861782078617",
+"F c #861792489658",
+"G c #965892489E79",
+"H c #104020811040",
+"J c #208110402081",
+"K c #30C220812081",
+"L c #BEFBBEFBCF3C",
+"P c #104010401040",
+"I c #208110401040",
+"U c #618571C671C6",
+"Y c #71C671C68617",
+"T c #71C682078617",
+"R c #CF3CBEFBBEFB",
+"E c #CF3CCF3CBEFB",
+"W c #000010401040",
+"Q c #104010402081",
+"! c #9E79AEBAAEBA",
+"~ c #104010400000",
+"^ c #AEBAA2899E79",
+"/ c #71C671C66185",
+"( c #000010400000",
+") c #000000000000",
+"_ c #104000001040",
+"` c #2081208130C2",
+"' c #9658A2899E79",
+"] c #104000000000",
+"[ c #000000001040",
+"{ c #30C241034103",
+"} c #9E79A289AEBA",
+"| c #AEBABEFBBEFB",
+" . c #514461856185",
+".. c #9E79A2899658",
+"X. c #71C661856185",
+"o. c #30C230C24103",
+"O. c #514441035144",
+"+. c #514451444103",
+"@. c #410341035144",
+"#. c #AEBAAEBABEFB",
+"$. c #208130C230C2",
+"%. c #6185618571C6",
+"&. c #514441034103",
+"*. c #861782079658",
+" . X o O + @ # $ % & * = - ; : > , < 1 2 2 3 4 5 6 7 7 8 9 0 q ",
+" w X X O + @ e r % t & y - ; : u i < < p a 3 s d f 7 7 g 9 0 9 ; ",
+" h j X k l + z x c t v b n m ; M > N < B 2 2 a 3 4 V 6 7 7 0 9 m ; ",
+" h h w X f d f d f V f V f 7 f 7 C 7 f V f V f d f V f 7 9 g 9 m ; ; ",
+" Z h w j - 4 4 5 4 5 4 5 4 V f V 6 V f V f V 4 5 4 5 4 V 7 7 7 m A ; ; ",
+" S h h j - D s 4 4 4 4 4 4 4 4 d f V f d f d 4 d 4 4 4 V C 7 7 m - ; F G ",
+" H J Z K * D D m ; M 5 4 V 7 = D m - ; ; ",
+" H h S h * y D L F ; : 4 f V C D D m a ; ; G ",
+" P I H J & b n 2 2 m A M 3 4 5 f y D = 2 2 A ; ; ",
+" P P H J U Y & p 1 2 - ; : 4 4 d f y T D 1 p 1 ; F G ",
+" P P H J % t & < < < m ; u R E 4 f b * y B < < A ; ; ",
+" W P P Q % t v < ! < - ; : L a 4 4 & * y < < ! ; ; G ",
+" ~ P ~ I c $ % > ^ > m ; M 2 2 3 4 t / b ^ i ^ ; M ; ",
+" ( P W P # $ % > > > F ; : p a 3 s t U & > > > ; ; G ",
+" ) _ ( _ @ $ # M ; u m ; u p 2 2 a % v t M ; u ; M ; ",
+" ( _ ( P P P H h h ` w X o : ; F F ; : & * D - G ' > i < 1 2 a % v t : ; F ; : u ",
+" ) ] ( _ ~ P P I Z h w j X O m - m ; ; M & y - m ; > i N < 2 2 $ c % m - m ; M : ",
+") [ ( _ W P P Q H h h j X O { D D - F G : y T m ; u > } < p | r .% D D - G : u ",
+"V f 5 4 5 f V f V f V f V f V y * y m ; u f 5 f V f 5 4 V f x @ $ y * y : u ..",
+"4 d f 4 f d f d 4 d f V f V f U & U F G : d f d f d f 4 4 d @ r # U & U G : > ",
+"3 4 3 E 4 E 4 4 3 4 4 4 5 4 5 t v X.; ; u 4 4 4 4 E 4 E 3 4 @ @ x t v X.; u ..",
+"a 4 a o.{ + .% v ; G > 3 a 4 e @ # .% v u ' > ",
+"3 2 3 X O o $ # $ ; ; u 2 3 2 O.+.@ $ # $ : u > ",
+"a 2 a X o + @ @ @ ; u ' 2 2 2 z @ @ @ @ @ u > } ",
+"p < p X k l O.z O.; : u 1 p < O.+.@ O.z O...> i ",
+"1 < 1 o.o + @.z @.; G > #.1 < z O.@ + @.z > > } ",
+"N , N X O o l + o ; ; u 1 1 1 O.+.@ O l + : u > ",
+"i } i o.o + O o o.; u o + z @ # % v } i } e @ @ } < #.| L a 4 f V o o.o G ' > ",
+"> ..u o O + . X . ; o O + O.@ $ % & u u ..@ @ x , < 1 2 2 3 4 5 6 X . X ; u ..",
+"' u : O + + j $.j $.o.{ O.e r % %.U G : u @ r # < < p 2 3 s d f 7 $.j $.u : u ",
+"; A M l + + h j . K h j h K h h h h ; ; A x @ $ h h h h h K h j 6 7 7 0 : u ..",
+"- m - + { @. h h w %.w h h h h h S h S m - m # r # h S h S h h h f 7 9 g F G : ",
+"y D D l + + Z h h t % h Z J Z J Z J Z J D y D x # $ H J Z J Z J f V 7 7 - M ; ",
+"* y * + z O. S h h & U t y * y @ $ . 4 d C 7 - m ; ",
+"& / b l + + P J Z y & t & & / x c $ E 5 4 V n = D ",
+"v %.v + z O. H J H D * & & v %.# % . a 4 f V * D - ",
+"X.% % + &.z P P H D n y c $ % $ c $ a 3 4 V * y D ",
+"# $ # + z @ P P H J m - D $ # $ # $ % 2 3 4 d * y T ",
+"@ @ x + + z W P P Q m D m @ @ @ $ c % 2 R E 4 & b * ",
+"z O.e + z @ P ~ I ; ; *. @ z O. .% % L s 4 U & * ",
+"&.+ &.l &.+.W P M ; m + &.+ $ c X.2 3 v t & ",
+"{ + { @.z O._ u ' ; + { + .$ % 3 v t & ",
+"O o k + O.P P P H h h ` w X o l + z @ c X./ b n m ; u o O o $ % % % t v ",
+"$.X $.@._ ~ P P I Z h w j X O + + @ # % v & * D - ; : X $.X .% v %.v ",
+"j . j _ W P P Q H h h j X O { + &.@ $ c t & y D m ; > . j . % c X.% ",
+"w j w ` w j w ` w ` h ` h h S h h h h ` h ` w ` w j w ` w j .% % ",
+"h h K h h h h h h h J h J H J Z J H J h h h h h h h J h h h $ % ",
+"S h h h H h S h S h S h H Q H J H Q H h H h S h S h S h S h . "};
diff --git a/examples/demo/qasteroids/bg.png b/examples/demo/qasteroids/bg.png
new file mode 100644
index 0000000..33cdc48
--- /dev/null
+++ b/examples/demo/qasteroids/bg.png
Binary files differ
diff --git a/examples/demo/qasteroids/ledmeter.cpp b/examples/demo/qasteroids/ledmeter.cpp
new file mode 100644
index 0000000..d2113a8
--- /dev/null
+++ b/examples/demo/qasteroids/ledmeter.cpp
@@ -0,0 +1,117 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+
+#include <qpainter.h>
+#include "ledmeter.h"
+
+KALedMeter::KALedMeter( QWidget *parent ) : QFrame( parent )
+{
+ mCRanges.setAutoDelete( TRUE );
+ mRange = 100;
+ mCount = 20;
+ mCurrentCount = 0;
+ mValue = 0;
+ setMinimumWidth( mCount * 2 + frameWidth() );
+}
+
+void KALedMeter::setRange( int r )
+{
+ mRange = r;
+ if ( mRange < 1 )
+ mRange = 1;
+ setValue( mValue );
+ update();
+}
+
+void KALedMeter::setCount( int c )
+{
+ mCount = c;
+ if ( mCount < 1 )
+ mCount = 1;
+ setMinimumWidth( mCount * 2 + frameWidth() );
+ calcColorRanges();
+ setValue( mValue );
+ update();
+}
+
+void KALedMeter::setValue( int v )
+{
+ mValue = v;
+ if ( mValue > mRange )
+ mValue = mRange;
+ else if ( mValue < 0 )
+ mValue = 0;
+ int c = ( mValue + mRange / mCount - 1 ) * mCount / mRange;
+ if ( c != mCurrentCount )
+ {
+ mCurrentCount = c;
+ update();
+ }
+}
+
+void KALedMeter::addColorRange( int pc, const QColor &c )
+{
+ ColorRange *cr = new ColorRange;
+ cr->mPc = pc;
+ cr->mColor = c;
+ mCRanges.append( cr );
+ calcColorRanges();
+}
+
+void KALedMeter::resizeEvent( QResizeEvent *e )
+{
+ QFrame::resizeEvent( e );
+ int w = ( width() - frameWidth() - 2 ) / mCount * mCount;
+ w += frameWidth() + 2;
+ setFrameRect( QRect( 0, 0, w, height() ) );
+}
+
+void KALedMeter::drawContents( QPainter *p )
+{
+ QRect b = contentsRect();
+
+ unsigned cidx = 0;
+ int ncol = mCount;
+ QColor col = colorGroup().foreground();
+
+ if ( !mCRanges.isEmpty() )
+ {
+ col = mCRanges.at( cidx )->mColor;
+ ncol = mCRanges.at( cidx )->mValue;
+ }
+ p->setBrush( col );
+ p->setPen( col );
+
+ int lw = b.width() / mCount;
+ int lx = b.left() + 1;
+ for ( int i = 0; i < mCurrentCount; i++, lx += lw )
+ {
+ if ( i > ncol )
+ {
+ if ( ++cidx < mCRanges.count() )
+ {
+ col = mCRanges.at( cidx )->mColor;
+ ncol = mCRanges.at( cidx )->mValue;
+ p->setBrush( col );
+ p->setPen( col );
+ }
+ }
+
+ p->drawRect( lx, b.top() + 1, lw - 1, b.height() - 2 );
+ }
+}
+
+void KALedMeter::calcColorRanges()
+{
+ int prev = 0;
+ ColorRange *cr;
+ for ( cr = mCRanges.first(); cr; cr = mCRanges.next() )
+ {
+ cr->mValue = prev + cr->mPc * mCount / 100;
+ prev = cr->mValue;
+ }
+}
+
diff --git a/examples/demo/qasteroids/ledmeter.h b/examples/demo/qasteroids/ledmeter.h
new file mode 100644
index 0000000..d0f2091
--- /dev/null
+++ b/examples/demo/qasteroids/ledmeter.h
@@ -0,0 +1,53 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+
+#ifndef __LEDMETER_H__
+#define __LEDMETER_H__
+
+#include <qframe.h>
+#include <qptrlist.h>
+
+
+class KALedMeter : public QFrame
+{
+ Q_OBJECT
+public:
+ KALedMeter( QWidget *parent );
+
+ int range() const { return mRange; }
+ void setRange( int r );
+
+ int count() const { return mCount; }
+ void setCount( int c );
+
+ int value () const { return mValue; }
+
+ void addColorRange( int pc, const QColor &c );
+
+public slots:
+ void setValue( int v );
+
+protected:
+ virtual void resizeEvent( QResizeEvent * );
+ virtual void drawContents( QPainter * );
+ void calcColorRanges();
+
+protected:
+ struct ColorRange
+ {
+ int mPc;
+ int mValue;
+ QColor mColor;
+ };
+
+ int mRange;
+ int mCount;
+ int mCurrentCount;
+ int mValue;
+ QPtrList<ColorRange> mCRanges;
+};
+
+#endif
diff --git a/examples/demo/qasteroids/sounds/Explosion.wav b/examples/demo/qasteroids/sounds/Explosion.wav
new file mode 100644
index 0000000..7b140b1
--- /dev/null
+++ b/examples/demo/qasteroids/sounds/Explosion.wav
Binary files differ
diff --git a/examples/demo/qasteroids/sprites.h b/examples/demo/qasteroids/sprites.h
new file mode 100644
index 0000000..0b0a718
--- /dev/null
+++ b/examples/demo/qasteroids/sprites.h
@@ -0,0 +1,129 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+
+#ifndef __SPRITES_H__
+#define __SPRITES_H__
+
+#include <qcanvas.h>
+
+#define ID_ROCK_LARGE 1024
+#define ID_ROCK_MEDIUM 1025
+#define ID_ROCK_SMALL 1026
+
+#define ID_MISSILE 1030
+
+#define ID_BIT 1040
+#define ID_EXHAUST 1041
+
+#define ID_ENERGY_POWERUP 1310
+#define ID_TELEPORT_POWERUP 1311
+#define ID_BRAKE_POWERUP 1312
+#define ID_SHIELD_POWERUP 1313
+#define ID_SHOOT_POWERUP 1314
+
+#define ID_SHIP 1350
+#define ID_SHIELD 1351
+
+#define MAX_SHIELD_AGE 350
+#define MAX_POWERUP_AGE 500
+#define MAX_MISSILE_AGE 40
+
+class KMissile : public QCanvasSprite
+{
+public:
+ KMissile( QCanvasPixmapArray *s, QCanvas *c ) : QCanvasSprite( s, c )
+ { myAge = 0; }
+
+ virtual int rtti() const { return ID_MISSILE; }
+
+ void growOlder() { myAge++; }
+ bool expired() { return myAge > MAX_MISSILE_AGE; }
+
+private:
+ int myAge;
+};
+
+class KBit : public QCanvasSprite
+{
+public:
+ KBit( QCanvasPixmapArray *s, QCanvas *c ) : QCanvasSprite( s, c )
+ { death = 7; }
+
+ virtual int rtti() const { return ID_BIT; }
+
+ void setDeath( int d ) { death = d; }
+ void growOlder() { death--; }
+ bool expired() { return death <= 0; }
+
+private:
+ int death;
+};
+
+class KExhaust : public QCanvasSprite
+{
+public:
+ KExhaust( QCanvasPixmapArray *s, QCanvas *c ) : QCanvasSprite( s, c )
+ { death = 1; }
+
+ virtual int rtti() const { return ID_EXHAUST; }
+
+ void setDeath( int d ) { death = d; }
+ void growOlder() { death--; }
+ bool expired() { return death <= 0; }
+
+private:
+ int death;
+};
+
+class KPowerup : public QCanvasSprite
+{
+public:
+ KPowerup( QCanvasPixmapArray *s, QCanvas *c, int t ) : QCanvasSprite( s, c ),
+ myAge( 0 ), type(t) { }
+
+ virtual int rtti() const { return type; }
+
+ void growOlder() { myAge++; }
+ bool expired() const { return myAge > MAX_POWERUP_AGE; }
+
+protected:
+ int myAge;
+ int type;
+};
+
+class KRock : public QCanvasSprite
+{
+public:
+ KRock (QCanvasPixmapArray *s, QCanvas *c, int t, int sk, int st) : QCanvasSprite( s, c )
+ { type = t; skip = cskip = sk; step = st; }
+
+ void nextFrame()
+ {
+ if (cskip-- <= 0) {
+ setFrame( (frame()+step+frameCount())%frameCount() );
+ cskip = QABS(skip);
+ }
+ }
+
+ virtual int rtti() const { return type; }
+
+private:
+ int type;
+ int skip;
+ int cskip;
+ int step;
+};
+
+class KShield : public QCanvasSprite
+{
+public:
+ KShield( QCanvasPixmapArray *s, QCanvas *c )
+ : QCanvasSprite( s, c ) {}
+
+ virtual int rtti() const { return ID_SHIELD; }
+};
+
+#endif
diff --git a/examples/demo/qasteroids/sprites/.pbm b/examples/demo/qasteroids/sprites/.pbm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/.pbm
diff --git a/examples/demo/qasteroids/sprites/bits/bits.ini b/examples/demo/qasteroids/sprites/bits/bits.ini
new file mode 100644
index 0000000..cb2976f
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits.ini
@@ -0,0 +1,9 @@
+Cyclic_Animation=On
+Width=12
+Height=12
+Final_frame=16 ;; NR_ROTS
+Antialias=On
+Output_Alpha=On
+Output_to_File=On
+Output_File_Type=n
+Input_File_Name=bits.pov
diff --git a/examples/demo/qasteroids/sprites/bits/bits.pov b/examples/demo/qasteroids/sprites/bits/bits.pov
new file mode 100644
index 0000000..9be7ccb
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits.pov
@@ -0,0 +1,31 @@
+
+#version 3.0
+global_settings { assumed_gamma 2.0 }
+
+#include "colors.inc"
+#include "textures.inc"
+#include "metals.inc"
+
+camera {
+ location <15, -15, -100>
+ look_at <0, 0, 0>
+}
+
+light_source { <50, 50, -50> colour White }
+light_source { <0, 0, -50> colour White }
+
+prism {
+ linear_sweep
+ linear_spline
+ 0,
+ 0.2,
+ 5,
+ <2, 0>, <0, 2>, <-1, 1>, <0, -3>, <2, 0>
+ texture { T_Silver_2A }
+
+ rotate <360*clock, 50, 30>
+ scale <20, 20, 20>
+}
+
+
+
diff --git a/examples/demo/qasteroids/sprites/bits/bits0000.png b/examples/demo/qasteroids/sprites/bits/bits0000.png
new file mode 100644
index 0000000..5ec9d02
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0000.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0001.png b/examples/demo/qasteroids/sprites/bits/bits0001.png
new file mode 100644
index 0000000..07b4012
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0001.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0002.png b/examples/demo/qasteroids/sprites/bits/bits0002.png
new file mode 100644
index 0000000..8333792
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0002.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0003.png b/examples/demo/qasteroids/sprites/bits/bits0003.png
new file mode 100644
index 0000000..9f1fc02
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0003.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0004.png b/examples/demo/qasteroids/sprites/bits/bits0004.png
new file mode 100644
index 0000000..eb1cc09
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0004.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0005.png b/examples/demo/qasteroids/sprites/bits/bits0005.png
new file mode 100644
index 0000000..149be63
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0005.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0006.png b/examples/demo/qasteroids/sprites/bits/bits0006.png
new file mode 100644
index 0000000..4ac75c8
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0006.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0007.png b/examples/demo/qasteroids/sprites/bits/bits0007.png
new file mode 100644
index 0000000..907241d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0007.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0008.png b/examples/demo/qasteroids/sprites/bits/bits0008.png
new file mode 100644
index 0000000..1533268
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0008.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0009.png b/examples/demo/qasteroids/sprites/bits/bits0009.png
new file mode 100644
index 0000000..05402ba
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0009.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0010.png b/examples/demo/qasteroids/sprites/bits/bits0010.png
new file mode 100644
index 0000000..ca4f229
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0010.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0011.png b/examples/demo/qasteroids/sprites/bits/bits0011.png
new file mode 100644
index 0000000..91913c0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0011.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0012.png b/examples/demo/qasteroids/sprites/bits/bits0012.png
new file mode 100644
index 0000000..e55d439
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0012.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0013.png b/examples/demo/qasteroids/sprites/bits/bits0013.png
new file mode 100644
index 0000000..9c73436
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0013.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0014.png b/examples/demo/qasteroids/sprites/bits/bits0014.png
new file mode 100644
index 0000000..f0463a2
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0014.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/bits/bits0015.png b/examples/demo/qasteroids/sprites/bits/bits0015.png
new file mode 100644
index 0000000..bce35aa
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/bits/bits0015.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/exhaust/exhaust.png b/examples/demo/qasteroids/sprites/exhaust/exhaust.png
new file mode 100644
index 0000000..a17ee71
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/exhaust/exhaust.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/missile/missile.png b/examples/demo/qasteroids/sprites/missile/missile.png
new file mode 100644
index 0000000..4283c67
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/missile/missile.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/powerups/brake.png b/examples/demo/qasteroids/sprites/powerups/brake.png
new file mode 100644
index 0000000..75cd649
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/powerups/brake.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/powerups/energy.png b/examples/demo/qasteroids/sprites/powerups/energy.png
new file mode 100644
index 0000000..2d97ac1
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/powerups/energy.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/powerups/shield.png b/examples/demo/qasteroids/sprites/powerups/shield.png
new file mode 100644
index 0000000..bd60555
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/powerups/shield.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/powerups/shoot.png b/examples/demo/qasteroids/sprites/powerups/shoot.png
new file mode 100644
index 0000000..4b2b3e3
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/powerups/shoot.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/powerups/teleport.png b/examples/demo/qasteroids/sprites/powerups/teleport.png
new file mode 100644
index 0000000..121ec9c
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/powerups/teleport.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock1.ini b/examples/demo/qasteroids/sprites/rock1/rock1.ini
new file mode 100644
index 0000000..e42fc76
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock1.ini
@@ -0,0 +1,9 @@
+Cyclic_Animation=On
+Width=48
+Height=48
+Final_frame=32 ;; NR_ROTS
+Antialias=On
+Output_Alpha=On
+Output_to_File=On
+Output_File_Type=n
+Input_File_Name=rock1.pov
diff --git a/examples/demo/qasteroids/sprites/rock1/rock1.pov b/examples/demo/qasteroids/sprites/rock1/rock1.pov
new file mode 100644
index 0000000..58298c0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock1.pov
@@ -0,0 +1,26 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+// #include "stones.inc"
+
+camera {
+ location <2,2,-6>
+ up <0, 1, 0>
+// right <4/3, 0, 0>
+ look_at <0,0,0>
+}
+
+object { light_source { <10, 5, -5> color red 1.1 green 1.1 blue 1.0 } }
+
+#declare Rock =
+mesh {
+ #include "rock.inc" /* collection of triangle or smooth_triangle data */
+}
+
+object {
+ Rock
+ texture { pigment {White} }
+ scale 1.9
+ rotate <60, 45, 360*clock>
+}
+
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10000.png b/examples/demo/qasteroids/sprites/rock1/rock10000.png
new file mode 100644
index 0000000..2e3ff93
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10000.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10001.png b/examples/demo/qasteroids/sprites/rock1/rock10001.png
new file mode 100644
index 0000000..ba70d24
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10001.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10002.png b/examples/demo/qasteroids/sprites/rock1/rock10002.png
new file mode 100644
index 0000000..88d776e
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10002.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10003.png b/examples/demo/qasteroids/sprites/rock1/rock10003.png
new file mode 100644
index 0000000..9db197d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10003.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10004.png b/examples/demo/qasteroids/sprites/rock1/rock10004.png
new file mode 100644
index 0000000..9b92d55
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10004.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10005.png b/examples/demo/qasteroids/sprites/rock1/rock10005.png
new file mode 100644
index 0000000..9cdddf5
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10005.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10006.png b/examples/demo/qasteroids/sprites/rock1/rock10006.png
new file mode 100644
index 0000000..0c421a0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10006.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10007.png b/examples/demo/qasteroids/sprites/rock1/rock10007.png
new file mode 100644
index 0000000..2339c83
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10007.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10008.png b/examples/demo/qasteroids/sprites/rock1/rock10008.png
new file mode 100644
index 0000000..d1eb8aa
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10008.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10009.png b/examples/demo/qasteroids/sprites/rock1/rock10009.png
new file mode 100644
index 0000000..47ada42
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10009.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10010.png b/examples/demo/qasteroids/sprites/rock1/rock10010.png
new file mode 100644
index 0000000..1a2eba0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10010.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10011.png b/examples/demo/qasteroids/sprites/rock1/rock10011.png
new file mode 100644
index 0000000..ec213e1
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10011.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10012.png b/examples/demo/qasteroids/sprites/rock1/rock10012.png
new file mode 100644
index 0000000..3bdb39b
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10012.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10013.png b/examples/demo/qasteroids/sprites/rock1/rock10013.png
new file mode 100644
index 0000000..08de9a0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10013.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10014.png b/examples/demo/qasteroids/sprites/rock1/rock10014.png
new file mode 100644
index 0000000..3b6ce60
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10014.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10015.png b/examples/demo/qasteroids/sprites/rock1/rock10015.png
new file mode 100644
index 0000000..01216dc
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10015.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10016.png b/examples/demo/qasteroids/sprites/rock1/rock10016.png
new file mode 100644
index 0000000..efb612d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10016.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10017.png b/examples/demo/qasteroids/sprites/rock1/rock10017.png
new file mode 100644
index 0000000..97bbfce
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10017.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10018.png b/examples/demo/qasteroids/sprites/rock1/rock10018.png
new file mode 100644
index 0000000..2986267
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10018.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10019.png b/examples/demo/qasteroids/sprites/rock1/rock10019.png
new file mode 100644
index 0000000..80eab6d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10019.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10020.png b/examples/demo/qasteroids/sprites/rock1/rock10020.png
new file mode 100644
index 0000000..78023e0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10020.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10021.png b/examples/demo/qasteroids/sprites/rock1/rock10021.png
new file mode 100644
index 0000000..076a338
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10021.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10022.png b/examples/demo/qasteroids/sprites/rock1/rock10022.png
new file mode 100644
index 0000000..4f8f5ed
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10022.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10023.png b/examples/demo/qasteroids/sprites/rock1/rock10023.png
new file mode 100644
index 0000000..4e6ba04
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10023.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10024.png b/examples/demo/qasteroids/sprites/rock1/rock10024.png
new file mode 100644
index 0000000..1a15fc3
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10024.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10025.png b/examples/demo/qasteroids/sprites/rock1/rock10025.png
new file mode 100644
index 0000000..b627d53
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10025.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10026.png b/examples/demo/qasteroids/sprites/rock1/rock10026.png
new file mode 100644
index 0000000..7df23b1
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10026.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10027.png b/examples/demo/qasteroids/sprites/rock1/rock10027.png
new file mode 100644
index 0000000..d2cb5d3
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10027.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10028.png b/examples/demo/qasteroids/sprites/rock1/rock10028.png
new file mode 100644
index 0000000..68611a6
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10028.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10029.png b/examples/demo/qasteroids/sprites/rock1/rock10029.png
new file mode 100644
index 0000000..44d6a30
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10029.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10030.png b/examples/demo/qasteroids/sprites/rock1/rock10030.png
new file mode 100644
index 0000000..9dca7db
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10030.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock1/rock10031.png b/examples/demo/qasteroids/sprites/rock1/rock10031.png
new file mode 100644
index 0000000..10beae6
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock1/rock10031.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock2.ini b/examples/demo/qasteroids/sprites/rock2/rock2.ini
new file mode 100644
index 0000000..d50e6fa
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock2.ini
@@ -0,0 +1,9 @@
+Cyclic_Animation=On
+Width=32
+Height=32
+Final_frame=32 ;; NR_ROTS
+Antialias=On
+Output_Alpha=On
+Output_to_File=On
+Output_File_Type=n
+Input_File_Name=rock2.pov
diff --git a/examples/demo/qasteroids/sprites/rock2/rock2.pov b/examples/demo/qasteroids/sprites/rock2/rock2.pov
new file mode 100644
index 0000000..2f37a20
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock2.pov
@@ -0,0 +1,26 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+// #include "stones.inc"
+
+camera {
+ location <2,2,-6>
+ up <0, 1, 0>
+// right <4/3, 0, 0>
+ look_at <0,0,0>
+}
+
+object { light_source { <10, 5, -5> color red 1.1 green 1.1 blue 1.0 } }
+
+#declare Rock =
+mesh {
+ #include "rock.inc" /* collection of triangle or smooth_triangle data */
+}
+
+object {
+ Rock
+ texture { pigment {White} }
+ scale 1.9
+ rotate <60, 30, 360*clock>
+}
+
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20000.png b/examples/demo/qasteroids/sprites/rock2/rock20000.png
new file mode 100644
index 0000000..5cb52bb
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20000.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20001.png b/examples/demo/qasteroids/sprites/rock2/rock20001.png
new file mode 100644
index 0000000..c4c85eb
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20001.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20002.png b/examples/demo/qasteroids/sprites/rock2/rock20002.png
new file mode 100644
index 0000000..dea49d7
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20002.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20003.png b/examples/demo/qasteroids/sprites/rock2/rock20003.png
new file mode 100644
index 0000000..39772b8
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20003.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20004.png b/examples/demo/qasteroids/sprites/rock2/rock20004.png
new file mode 100644
index 0000000..fb02ee4
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20004.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20005.png b/examples/demo/qasteroids/sprites/rock2/rock20005.png
new file mode 100644
index 0000000..a81c5ac
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20005.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20006.png b/examples/demo/qasteroids/sprites/rock2/rock20006.png
new file mode 100644
index 0000000..cf5c2f4
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20006.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20007.png b/examples/demo/qasteroids/sprites/rock2/rock20007.png
new file mode 100644
index 0000000..479c21d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20007.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20008.png b/examples/demo/qasteroids/sprites/rock2/rock20008.png
new file mode 100644
index 0000000..871abca
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20008.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20009.png b/examples/demo/qasteroids/sprites/rock2/rock20009.png
new file mode 100644
index 0000000..d5d7860
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20009.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20010.png b/examples/demo/qasteroids/sprites/rock2/rock20010.png
new file mode 100644
index 0000000..1da9953
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20010.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20011.png b/examples/demo/qasteroids/sprites/rock2/rock20011.png
new file mode 100644
index 0000000..2988658
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20011.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20012.png b/examples/demo/qasteroids/sprites/rock2/rock20012.png
new file mode 100644
index 0000000..d104ff9
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20012.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20013.png b/examples/demo/qasteroids/sprites/rock2/rock20013.png
new file mode 100644
index 0000000..e12943d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20013.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20014.png b/examples/demo/qasteroids/sprites/rock2/rock20014.png
new file mode 100644
index 0000000..dc7529c
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20014.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20015.png b/examples/demo/qasteroids/sprites/rock2/rock20015.png
new file mode 100644
index 0000000..3d9d318
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20015.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20016.png b/examples/demo/qasteroids/sprites/rock2/rock20016.png
new file mode 100644
index 0000000..6314f03
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20016.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20017.png b/examples/demo/qasteroids/sprites/rock2/rock20017.png
new file mode 100644
index 0000000..5a8aeef
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20017.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20018.png b/examples/demo/qasteroids/sprites/rock2/rock20018.png
new file mode 100644
index 0000000..f0e5b08
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20018.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20019.png b/examples/demo/qasteroids/sprites/rock2/rock20019.png
new file mode 100644
index 0000000..d731950
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20019.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20020.png b/examples/demo/qasteroids/sprites/rock2/rock20020.png
new file mode 100644
index 0000000..8bc7e20
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20020.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20021.png b/examples/demo/qasteroids/sprites/rock2/rock20021.png
new file mode 100644
index 0000000..b2854b2
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20021.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20022.png b/examples/demo/qasteroids/sprites/rock2/rock20022.png
new file mode 100644
index 0000000..781d620
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20022.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20023.png b/examples/demo/qasteroids/sprites/rock2/rock20023.png
new file mode 100644
index 0000000..1f64b02
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20023.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20024.png b/examples/demo/qasteroids/sprites/rock2/rock20024.png
new file mode 100644
index 0000000..bd19e74
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20024.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20025.png b/examples/demo/qasteroids/sprites/rock2/rock20025.png
new file mode 100644
index 0000000..180f5b6
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20025.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20026.png b/examples/demo/qasteroids/sprites/rock2/rock20026.png
new file mode 100644
index 0000000..f2681d4
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20026.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20027.png b/examples/demo/qasteroids/sprites/rock2/rock20027.png
new file mode 100644
index 0000000..5bc1add
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20027.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20028.png b/examples/demo/qasteroids/sprites/rock2/rock20028.png
new file mode 100644
index 0000000..5621b4d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20028.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20029.png b/examples/demo/qasteroids/sprites/rock2/rock20029.png
new file mode 100644
index 0000000..aec4a34
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20029.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20030.png b/examples/demo/qasteroids/sprites/rock2/rock20030.png
new file mode 100644
index 0000000..121b70e
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20030.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock2/rock20031.png b/examples/demo/qasteroids/sprites/rock2/rock20031.png
new file mode 100644
index 0000000..661b18e
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock2/rock20031.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock3.ini b/examples/demo/qasteroids/sprites/rock3/rock3.ini
new file mode 100644
index 0000000..26a3cf9
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock3.ini
@@ -0,0 +1,9 @@
+Cyclic_Animation=On
+Width=20
+Height=20
+Final_frame=32 ;; NR_ROTS
+Antialias=On
+Output_Alpha=On
+Output_to_File=On
+Output_File_Type=n
+Input_File_Name=rock3.pov
diff --git a/examples/demo/qasteroids/sprites/rock3/rock3.pov b/examples/demo/qasteroids/sprites/rock3/rock3.pov
new file mode 100644
index 0000000..2f37a20
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock3.pov
@@ -0,0 +1,26 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+// #include "stones.inc"
+
+camera {
+ location <2,2,-6>
+ up <0, 1, 0>
+// right <4/3, 0, 0>
+ look_at <0,0,0>
+}
+
+object { light_source { <10, 5, -5> color red 1.1 green 1.1 blue 1.0 } }
+
+#declare Rock =
+mesh {
+ #include "rock.inc" /* collection of triangle or smooth_triangle data */
+}
+
+object {
+ Rock
+ texture { pigment {White} }
+ scale 1.9
+ rotate <60, 30, 360*clock>
+}
+
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30000.png b/examples/demo/qasteroids/sprites/rock3/rock30000.png
new file mode 100644
index 0000000..de1205a
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30000.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30001.png b/examples/demo/qasteroids/sprites/rock3/rock30001.png
new file mode 100644
index 0000000..12ebc00
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30001.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30002.png b/examples/demo/qasteroids/sprites/rock3/rock30002.png
new file mode 100644
index 0000000..265c381
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30002.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30003.png b/examples/demo/qasteroids/sprites/rock3/rock30003.png
new file mode 100644
index 0000000..1ff7a06
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30003.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30004.png b/examples/demo/qasteroids/sprites/rock3/rock30004.png
new file mode 100644
index 0000000..5b505bf
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30004.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30005.png b/examples/demo/qasteroids/sprites/rock3/rock30005.png
new file mode 100644
index 0000000..204c969
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30005.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30006.png b/examples/demo/qasteroids/sprites/rock3/rock30006.png
new file mode 100644
index 0000000..32140cf
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30006.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30007.png b/examples/demo/qasteroids/sprites/rock3/rock30007.png
new file mode 100644
index 0000000..f01baa6
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30007.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30008.png b/examples/demo/qasteroids/sprites/rock3/rock30008.png
new file mode 100644
index 0000000..eee458e
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30008.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30009.png b/examples/demo/qasteroids/sprites/rock3/rock30009.png
new file mode 100644
index 0000000..14412d4
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30009.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30010.png b/examples/demo/qasteroids/sprites/rock3/rock30010.png
new file mode 100644
index 0000000..bb61d54
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30010.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30011.png b/examples/demo/qasteroids/sprites/rock3/rock30011.png
new file mode 100644
index 0000000..8486e5a
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30011.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30012.png b/examples/demo/qasteroids/sprites/rock3/rock30012.png
new file mode 100644
index 0000000..d9ae419
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30012.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30013.png b/examples/demo/qasteroids/sprites/rock3/rock30013.png
new file mode 100644
index 0000000..ce69400
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30013.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30014.png b/examples/demo/qasteroids/sprites/rock3/rock30014.png
new file mode 100644
index 0000000..981e92c
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30014.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30015.png b/examples/demo/qasteroids/sprites/rock3/rock30015.png
new file mode 100644
index 0000000..63f0a69
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30015.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30016.png b/examples/demo/qasteroids/sprites/rock3/rock30016.png
new file mode 100644
index 0000000..72bc42f
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30016.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30017.png b/examples/demo/qasteroids/sprites/rock3/rock30017.png
new file mode 100644
index 0000000..c89f358
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30017.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30018.png b/examples/demo/qasteroids/sprites/rock3/rock30018.png
new file mode 100644
index 0000000..e1ba724
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30018.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30019.png b/examples/demo/qasteroids/sprites/rock3/rock30019.png
new file mode 100644
index 0000000..5f004a7
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30019.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30020.png b/examples/demo/qasteroids/sprites/rock3/rock30020.png
new file mode 100644
index 0000000..58009bf
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30020.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30021.png b/examples/demo/qasteroids/sprites/rock3/rock30021.png
new file mode 100644
index 0000000..8d9549c
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30021.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30022.png b/examples/demo/qasteroids/sprites/rock3/rock30022.png
new file mode 100644
index 0000000..1e8a1c2
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30022.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30023.png b/examples/demo/qasteroids/sprites/rock3/rock30023.png
new file mode 100644
index 0000000..9b960d6
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30023.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30024.png b/examples/demo/qasteroids/sprites/rock3/rock30024.png
new file mode 100644
index 0000000..6c15f2b
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30024.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30025.png b/examples/demo/qasteroids/sprites/rock3/rock30025.png
new file mode 100644
index 0000000..12b05da
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30025.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30026.png b/examples/demo/qasteroids/sprites/rock3/rock30026.png
new file mode 100644
index 0000000..16190e9
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30026.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30027.png b/examples/demo/qasteroids/sprites/rock3/rock30027.png
new file mode 100644
index 0000000..a862501
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30027.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30028.png b/examples/demo/qasteroids/sprites/rock3/rock30028.png
new file mode 100644
index 0000000..e3e0c18
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30028.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30029.png b/examples/demo/qasteroids/sprites/rock3/rock30029.png
new file mode 100644
index 0000000..ec70b84
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30029.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30030.png b/examples/demo/qasteroids/sprites/rock3/rock30030.png
new file mode 100644
index 0000000..0b060d0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30030.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/rock3/rock30031.png b/examples/demo/qasteroids/sprites/rock3/rock30031.png
new file mode 100644
index 0000000..c1dc1b9
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/rock3/rock30031.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/shield/shield0000.png b/examples/demo/qasteroids/sprites/shield/shield0000.png
new file mode 100644
index 0000000..e3434e6
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/shield/shield0000.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/shield/shield0001.png b/examples/demo/qasteroids/sprites/shield/shield0001.png
new file mode 100644
index 0000000..038cf5d
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/shield/shield0001.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/shield/shield0002.png b/examples/demo/qasteroids/sprites/shield/shield0002.png
new file mode 100644
index 0000000..1cf0da0
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/shield/shield0002.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/shield/shield0003.png b/examples/demo/qasteroids/sprites/shield/shield0003.png
new file mode 100644
index 0000000..40c7256
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/shield/shield0003.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/shield/shield0004.png b/examples/demo/qasteroids/sprites/shield/shield0004.png
new file mode 100644
index 0000000..4ee43ba
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/shield/shield0004.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/shield/shield0005.png b/examples/demo/qasteroids/sprites/shield/shield0005.png
new file mode 100644
index 0000000..0122e14
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/shield/shield0005.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/shield/shield0006.png b/examples/demo/qasteroids/sprites/shield/shield0006.png
new file mode 100644
index 0000000..dc5bea3
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/shield/shield0006.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship.ini b/examples/demo/qasteroids/sprites/ship/ship.ini
new file mode 100644
index 0000000..479cc20
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship.ini
@@ -0,0 +1,9 @@
+Cyclic_Animation=On
+Width=42
+Height=42
+Final_frame=32 ;; NR_ROTS
+Antialias=On
+Output_Alpha=On
+Output_to_File=On
+Output_File_Type=n
+Input_File_Name=ship.pov
diff --git a/examples/demo/qasteroids/sprites/ship/ship.pov b/examples/demo/qasteroids/sprites/ship/ship.pov
new file mode 100644
index 0000000..8f185cd
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship.pov
@@ -0,0 +1,128 @@
+
+#version 3.0
+global_settings { assumed_gamma 2.0 }
+
+#include "colors.inc"
+#include "textures.inc"
+#include "metals.inc"
+
+camera {
+ orthographic
+ up <0, 130, 0>
+ right <130, 0, 0>
+ location <0, 0, -130>
+ look_at <0, 0, 0>
+}
+
+light_source { <50, 25, -25> colour White }
+light_source { <0, 0, -100> colour Gray80 }
+
+#declare ShipColor = color red 1.0 green 1.0 blue 0.9
+
+#declare BaseTexture =
+texture {
+ pigment { ShipColor }
+}
+
+#declare Grubby =
+texture {
+ pigment {
+ bozo
+ color_map {
+ [0.0 color rgbt <1, 1, 1, 1>]
+ [0.8 color rgbt <0.9, 0.9, 0.9, 0.5>]
+ [1.0 color rgbt <0.8, 0.8, 0.8, 0.5>]
+ }
+ turbulence 2.0
+ scale 3
+ }
+}
+
+#declare ShipTexture =
+texture { BaseTexture }
+texture { Grubby }
+
+union {
+ cone {
+ <12, 0, 0>, 0.5
+ <11, 0, 0>, 1.0
+ texture { ShipTexture }
+ }
+ cone {
+ <11, 0, 0>, 1.0
+ <8, 0, 0>, 2.0
+ texture { ShipTexture }
+ }
+ cone {
+ <8, 0, 0>, 2.0
+ <3.5, 0, 0>, 3.8
+ texture { ShipTexture }
+ }
+ difference {
+ cone {
+ <8, 0, -0.01>, 2.0
+ <3.5, 0, -0.01>, 3.8
+ pigment { color Gray20 }
+ }
+ box {
+ <9, -4.0, -3.7>,
+ <2, 4.0, 10>
+ rotate <0, -18, 0>
+ }
+ box {
+ <6.5, -4.0, -8>,
+ <10, 4.0, 8>
+ }
+ box {
+ <2, -4.0, -8>,
+ <4.5, 4.0, 8>
+ }
+ }
+ cone {
+ <3.5, 0, 0>, 3.8
+ <2, 0, 0>, 4.0
+ texture { ShipTexture }
+ }
+ cylinder {
+ <2, 0, 0>,
+ <-9, 0, 0>,
+ 4.0
+ texture { ShipTexture }
+ }
+ cone {
+ <-9, 0, 0>, 4.0
+ <-10, 0, 0>, 3.5
+ texture { ShipTexture }
+ }
+ prism {
+ linear_sweep
+ linear_spline
+ 0,
+ 0.5,
+ 4,
+ <7.5, 0>, <-7.5, 10>, <-7.5, -10>, <7.5, 0>
+ rotate <90, 0, 0>
+ texture { T_Silver_2A }
+ texture { ShipTexture }
+ }
+ prism {
+ linear_sweep
+ linear_spline
+ -0.5,
+ 0.5,
+ 4,
+ <4, 0>, <-7.5, 5>, <-7.5, -5>, <4, 0>
+ pigment { color White }
+ }
+ cone {
+ <-12, 0, 0>, 3.0
+ <-10, 0, 0>, 2.0
+ texture { T_Silver_2A }
+ pigment { color Gray60 }
+ }
+
+ rotate <0, 0,-360*clock>
+ scale <5, 5, 5>
+}
+
+
diff --git a/examples/demo/qasteroids/sprites/ship/ship0000.png b/examples/demo/qasteroids/sprites/ship/ship0000.png
new file mode 100644
index 0000000..1d73a6e
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0000.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0001.png b/examples/demo/qasteroids/sprites/ship/ship0001.png
new file mode 100644
index 0000000..d3f4b3f
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0001.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0002.png b/examples/demo/qasteroids/sprites/ship/ship0002.png
new file mode 100644
index 0000000..c5f40fa
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0002.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0003.png b/examples/demo/qasteroids/sprites/ship/ship0003.png
new file mode 100644
index 0000000..a1c8c25
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0003.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0004.png b/examples/demo/qasteroids/sprites/ship/ship0004.png
new file mode 100644
index 0000000..8d3b6d9
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0004.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0005.png b/examples/demo/qasteroids/sprites/ship/ship0005.png
new file mode 100644
index 0000000..15843dd
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0005.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0006.png b/examples/demo/qasteroids/sprites/ship/ship0006.png
new file mode 100644
index 0000000..380509a
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0006.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0007.png b/examples/demo/qasteroids/sprites/ship/ship0007.png
new file mode 100644
index 0000000..633f562
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0007.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0008.png b/examples/demo/qasteroids/sprites/ship/ship0008.png
new file mode 100644
index 0000000..e40ad04
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0008.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0009.png b/examples/demo/qasteroids/sprites/ship/ship0009.png
new file mode 100644
index 0000000..19f3436
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0009.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0010.png b/examples/demo/qasteroids/sprites/ship/ship0010.png
new file mode 100644
index 0000000..b1142f4
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0010.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0011.png b/examples/demo/qasteroids/sprites/ship/ship0011.png
new file mode 100644
index 0000000..b8acd62
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0011.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0012.png b/examples/demo/qasteroids/sprites/ship/ship0012.png
new file mode 100644
index 0000000..06ac9eb
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0012.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0013.png b/examples/demo/qasteroids/sprites/ship/ship0013.png
new file mode 100644
index 0000000..71cf38c
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0013.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0014.png b/examples/demo/qasteroids/sprites/ship/ship0014.png
new file mode 100644
index 0000000..988a77f
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0014.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0015.png b/examples/demo/qasteroids/sprites/ship/ship0015.png
new file mode 100644
index 0000000..1ad2193
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0015.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0016.png b/examples/demo/qasteroids/sprites/ship/ship0016.png
new file mode 100644
index 0000000..c4f7125
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0016.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0017.png b/examples/demo/qasteroids/sprites/ship/ship0017.png
new file mode 100644
index 0000000..09e226e
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0017.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0018.png b/examples/demo/qasteroids/sprites/ship/ship0018.png
new file mode 100644
index 0000000..56b6190
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0018.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0019.png b/examples/demo/qasteroids/sprites/ship/ship0019.png
new file mode 100644
index 0000000..473340a
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0019.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0020.png b/examples/demo/qasteroids/sprites/ship/ship0020.png
new file mode 100644
index 0000000..dcfaa98
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0020.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0021.png b/examples/demo/qasteroids/sprites/ship/ship0021.png
new file mode 100644
index 0000000..f5718a2
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0021.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0022.png b/examples/demo/qasteroids/sprites/ship/ship0022.png
new file mode 100644
index 0000000..d59ca32
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0022.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0023.png b/examples/demo/qasteroids/sprites/ship/ship0023.png
new file mode 100644
index 0000000..8f24927
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0023.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0024.png b/examples/demo/qasteroids/sprites/ship/ship0024.png
new file mode 100644
index 0000000..0cae497
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0024.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0025.png b/examples/demo/qasteroids/sprites/ship/ship0025.png
new file mode 100644
index 0000000..bc7c5db
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0025.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0026.png b/examples/demo/qasteroids/sprites/ship/ship0026.png
new file mode 100644
index 0000000..386a9c7
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0026.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0027.png b/examples/demo/qasteroids/sprites/ship/ship0027.png
new file mode 100644
index 0000000..ad96779
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0027.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0028.png b/examples/demo/qasteroids/sprites/ship/ship0028.png
new file mode 100644
index 0000000..117420f
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0028.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0029.png b/examples/demo/qasteroids/sprites/ship/ship0029.png
new file mode 100644
index 0000000..0677ce1
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0029.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0030.png b/examples/demo/qasteroids/sprites/ship/ship0030.png
new file mode 100644
index 0000000..576625c
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0030.png
Binary files differ
diff --git a/examples/demo/qasteroids/sprites/ship/ship0031.png b/examples/demo/qasteroids/sprites/ship/ship0031.png
new file mode 100644
index 0000000..ba87690
--- /dev/null
+++ b/examples/demo/qasteroids/sprites/ship/ship0031.png
Binary files differ
diff --git a/examples/demo/qasteroids/toplevel.cpp b/examples/demo/qasteroids/toplevel.cpp
new file mode 100644
index 0000000..aafc841
--- /dev/null
+++ b/examples/demo/qasteroids/toplevel.cpp
@@ -0,0 +1,494 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+// --- toplevel.cpp ---
+#include <qaccel.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlcdnumber.h>
+#include <qpushbutton.h>
+
+#include <qapplication.h>
+
+#include "toplevel.h"
+#include "ledmeter.h"
+
+
+#define SB_SCORE 1
+#define SB_LEVEL 2
+#define SB_SHIPS 3
+
+struct SLevel
+{
+ int nrocks;
+ double rockSpeed;
+};
+
+#define MAX_LEVELS 16
+
+SLevel levels[MAX_LEVELS] =
+{
+ { 1, 0.4 },
+ { 1, 0.6 },
+ { 2, 0.5 },
+ { 2, 0.7 },
+ { 2, 0.8 },
+ { 3, 0.6 },
+ { 3, 0.7 },
+ { 3, 0.8 },
+ { 4, 0.6 },
+ { 4, 0.7 },
+ { 4, 0.8 },
+ { 5, 0.7 },
+ { 5, 0.8 },
+ { 5, 0.9 },
+ { 5, 1.0 }
+};
+
+const char *soundEvents[] =
+{
+ "ShipDestroyed",
+ "RockDestroyed",
+ 0
+};
+
+const char *soundDefaults[] =
+{
+ "Explosion.wav",
+ "ploop.wav",
+ 0
+};
+
+
+KAstTopLevel::KAstTopLevel( QWidget *parent, const char *name )
+ : QMainWindow( parent, name, 0 )
+{
+ QWidget *border = new QWidget( this );
+ border->setBackgroundColor( black );
+ setCentralWidget( border );
+
+ QVBoxLayout *borderLayout = new QVBoxLayout( border );
+ borderLayout->addStretch( 1 );
+
+ QWidget *mainWin = new QWidget( border );
+ mainWin->setFixedSize(640, 480);
+ borderLayout->addWidget( mainWin, 0, AlignHCenter );
+
+ borderLayout->addStretch( 1 );
+
+ view = new KAsteroidsView( mainWin );
+ view->setFocusPolicy( StrongFocus );
+ connect( view, SIGNAL( shipKilled() ), SLOT( slotShipKilled() ) );
+ connect( view, SIGNAL( rockHit(int) ), SLOT( slotRockHit(int) ) );
+ connect( view, SIGNAL( rocksRemoved() ), SLOT( slotRocksRemoved() ) );
+ connect( view, SIGNAL( updateVitals() ), SLOT( slotUpdateVitals() ) );
+
+ QVBoxLayout *vb = new QVBoxLayout( mainWin );
+ QHBoxLayout *hb = new QHBoxLayout;
+ QHBoxLayout *hbd = new QHBoxLayout;
+ vb->addLayout( hb );
+
+ QFont labelFont( "helvetica", 24 );
+ QColorGroup grp( darkGreen, black, QColor( 128, 128, 128 ),
+ QColor( 64, 64, 64 ), black, darkGreen, black );
+ QPalette pal( grp, grp, grp );
+
+ mainWin->setPalette( pal );
+
+ hb->addSpacing( 10 );
+
+ QLabel *label;
+ label = new QLabel( tr("Score"), mainWin );
+ label->setFont( labelFont );
+ label->setPalette( pal );
+ label->setFixedWidth( label->sizeHint().width() );
+ hb->addWidget( label );
+
+ scoreLCD = new QLCDNumber( 6, mainWin );
+ scoreLCD->setFrameStyle( QFrame::NoFrame );
+ scoreLCD->setSegmentStyle( QLCDNumber::Flat );
+ scoreLCD->setFixedWidth( 150 );
+ scoreLCD->setPalette( pal );
+ hb->addWidget( scoreLCD );
+ hb->addStretch( 10 );
+
+ label = new QLabel( tr("Level"), mainWin );
+ label->setFont( labelFont );
+ label->setPalette( pal );
+ label->setFixedWidth( label->sizeHint().width() );
+ hb->addWidget( label );
+
+ levelLCD = new QLCDNumber( 2, mainWin );
+ levelLCD->setFrameStyle( QFrame::NoFrame );
+ levelLCD->setSegmentStyle( QLCDNumber::Flat );
+ levelLCD->setFixedWidth( 70 );
+ levelLCD->setPalette( pal );
+ hb->addWidget( levelLCD );
+ hb->addStretch( 10 );
+
+ label = new QLabel( tr("Ships"), mainWin );
+ label->setFont( labelFont );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hb->addWidget( label );
+
+ shipsLCD = new QLCDNumber( 1, mainWin );
+ shipsLCD->setFrameStyle( QFrame::NoFrame );
+ shipsLCD->setSegmentStyle( QLCDNumber::Flat );
+ shipsLCD->setFixedWidth( 40 );
+ shipsLCD->setPalette( pal );
+ hb->addWidget( shipsLCD );
+
+ hb->addStrut( 30 );
+
+ vb->addWidget( view, 10 );
+
+// -- bottom layout:
+ vb->addLayout( hbd );
+
+ QFont smallFont( "helvetica", 14 );
+ hbd->addSpacing( 10 );
+
+ QString sprites_prefix = "qasteroids/sprites/";
+/*
+ label = new QLabel( tr( "T" ), mainWin );
+ label->setFont( smallFont );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ teleportsLCD = new QLCDNumber( 1, mainWin );
+ teleportsLCD->setFrameStyle( QFrame::NoFrame );
+ teleportsLCD->setSegmentStyle( QLCDNumber::Flat );
+ teleportsLCD->setPalette( pal );
+ teleportsLCD->setFixedHeight( 20 );
+ hbd->addWidget( teleportsLCD );
+
+ hbd->addSpacing( 10 );
+*/
+ QPixmap pm( sprites_prefix + "powerups/brake.png" );
+ label = new QLabel( mainWin );
+ label->setPixmap( pm );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ brakesLCD = new QLCDNumber( 1, mainWin );
+ brakesLCD->setFrameStyle( QFrame::NoFrame );
+ brakesLCD->setSegmentStyle( QLCDNumber::Flat );
+ brakesLCD->setPalette( pal );
+ brakesLCD->setFixedHeight( 20 );
+ hbd->addWidget( brakesLCD );
+
+ hbd->addSpacing( 10 );
+
+ pm.load( sprites_prefix + "powerups/shield.png" );
+ label = new QLabel( mainWin );
+ label->setPixmap( pm );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ shieldLCD = new QLCDNumber( 1, mainWin );
+ shieldLCD->setFrameStyle( QFrame::NoFrame );
+ shieldLCD->setSegmentStyle( QLCDNumber::Flat );
+ shieldLCD->setPalette( pal );
+ shieldLCD->setFixedHeight( 20 );
+ hbd->addWidget( shieldLCD );
+
+ hbd->addSpacing( 10 );
+
+ pm.load( sprites_prefix + "powerups/shoot.png" );
+ label = new QLabel( mainWin );
+ label->setPixmap( pm );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ shootLCD = new QLCDNumber( 1, mainWin );
+ shootLCD->setFrameStyle( QFrame::NoFrame );
+ shootLCD->setSegmentStyle( QLCDNumber::Flat );
+ shootLCD->setPalette( pal );
+ shootLCD->setFixedHeight( 20 );
+ hbd->addWidget( shootLCD );
+
+ hbd->addStretch( 1 );
+
+ label = new QLabel( tr( "Fuel" ), mainWin );
+ label->setFont( smallFont );
+ label->setFixedWidth( label->sizeHint().width() + 10 );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ powerMeter = new KALedMeter( mainWin );
+ powerMeter->setFrameStyle( QFrame::Box | QFrame::Plain );
+ powerMeter->setRange( MAX_POWER_LEVEL );
+ powerMeter->addColorRange( 10, darkRed );
+ powerMeter->addColorRange( 20, QColor(160, 96, 0) );
+ powerMeter->addColorRange( 70, darkGreen );
+ powerMeter->setCount( 40 );
+ powerMeter->setPalette( pal );
+ powerMeter->setFixedSize( 200, 12 );
+ hbd->addWidget( powerMeter );
+
+ shipsRemain = 3;
+ showHiscores = FALSE;
+
+ actions.insert( Qt::Key_Up, Thrust );
+ actions.insert( Qt::Key_Left, RotateLeft );
+ actions.insert( Qt::Key_Right, RotateRight );
+ actions.insert( Qt::Key_Space, Shoot );
+ actions.insert( Qt::Key_Z, Teleport );
+ actions.insert( Qt::Key_X, Brake );
+ actions.insert( Qt::Key_S, Shield );
+ actions.insert( Qt::Key_P, Pause );
+ actions.insert( Qt::Key_L, Launch );
+ actions.insert( Qt::Key_N, NewGame );
+
+ view->showText( tr( "Press N to start playing" ), yellow );
+}
+
+KAstTopLevel::~KAstTopLevel()
+{
+}
+
+void KAstTopLevel::playSound( const char * )
+{
+}
+
+void KAstTopLevel::keyPressEvent( QKeyEvent *event )
+{
+ if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
+ {
+ event->ignore();
+ return;
+ }
+
+ Action a = actions[ event->key() ];
+
+ switch ( a )
+ {
+ case RotateLeft:
+ view->rotateLeft( TRUE );
+ break;
+
+ case RotateRight:
+ view->rotateRight( TRUE );
+ break;
+
+ case Thrust:
+ view->thrust( TRUE );
+ break;
+
+ case Shoot:
+ view->shoot( TRUE );
+ break;
+
+ case Shield:
+ view->setShield( TRUE );
+ break;
+
+ case Teleport:
+ view->teleport( TRUE );
+ break;
+
+ case Brake:
+ view->brake( TRUE );
+ break;
+
+ default:
+ event->ignore();
+ return;
+ }
+ event->accept();
+}
+
+void KAstTopLevel::keyReleaseEvent( QKeyEvent *event )
+{
+ if ( event->isAutoRepeat() || !actions.contains( event->key() ) )
+ {
+ event->ignore();
+ return;
+ }
+
+ Action a = actions[ event->key() ];
+
+ switch ( a )
+ {
+ case RotateLeft:
+ view->rotateLeft( FALSE );
+ break;
+
+ case RotateRight:
+ view->rotateRight( FALSE );
+ break;
+
+ case Thrust:
+ view->thrust( FALSE );
+ break;
+
+ case Shoot:
+ view->shoot( FALSE );
+ break;
+
+ case Brake:
+ view->brake( FALSE );
+ break;
+
+ case Shield:
+ view->setShield( FALSE );
+ break;
+
+ case Teleport:
+ view->teleport( FALSE );
+ break;
+
+ case Launch:
+ if ( waitShip )
+ {
+ view->newShip();
+ waitShip = FALSE;
+ view->hideText();
+ }
+ else
+ {
+ event->ignore();
+ return;
+ }
+ break;
+
+ case NewGame:
+ slotNewGame();
+ break;
+/*
+ case Pause:
+ {
+ view->pause( TRUE );
+ QMessageBox::information( this,
+ tr("KAsteroids is paused"),
+ tr("Paused") );
+ view->pause( FALSE );
+ }
+ break;
+*/
+ default:
+ event->ignore();
+ return;
+ }
+
+ event->accept();
+}
+
+void KAstTopLevel::showEvent( QShowEvent *e )
+{
+ QMainWindow::showEvent( e );
+ view->pause( FALSE );
+ view->setFocus();
+}
+
+void KAstTopLevel::hideEvent( QHideEvent *e )
+{
+ QMainWindow::hideEvent( e );
+ view->pause( TRUE );
+}
+
+void KAstTopLevel::slotNewGame()
+{
+ score = 0;
+ shipsRemain = SB_SHIPS;
+ scoreLCD->display( 0 );
+ level = 0;
+ levelLCD->display( level+1 );
+ shipsLCD->display( shipsRemain-1 );
+ view->newGame();
+ view->setRockSpeed( levels[0].rockSpeed );
+ view->addRocks( levels[0].nrocks );
+// view->showText( tr( "Press L to launch." ), yellow );
+ view->newShip();
+ waitShip = FALSE;
+ view->hideText();
+ isPaused = FALSE;
+}
+
+void KAstTopLevel::slotShipKilled()
+{
+ shipsRemain--;
+ shipsLCD->display( shipsRemain-1 );
+
+ playSound( "ShipDestroyed" );
+
+ if ( shipsRemain )
+ {
+ waitShip = TRUE;
+ view->showText( tr( "Ship Destroyed. Press L to launch."), yellow );
+ }
+ else
+ {
+ view->showText( tr("Game Over!"), red );
+ view->endGame();
+ doStats();
+// highscore->addEntry( score, level, showHiscores );
+ }
+}
+
+void KAstTopLevel::slotRockHit( int size )
+{
+ switch ( size )
+ {
+ case 0:
+ score += 10;
+ break;
+
+ case 1:
+ score += 20;
+ break;
+
+ default:
+ score += 40;
+ }
+
+ playSound( "RockDestroyed" );
+
+ scoreLCD->display( score );
+}
+
+void KAstTopLevel::slotRocksRemoved()
+{
+ level++;
+
+ if ( level >= MAX_LEVELS )
+ level = MAX_LEVELS - 1;
+
+ view->setRockSpeed( levels[level-1].rockSpeed );
+ view->addRocks( levels[level-1].nrocks );
+
+ levelLCD->display( level+1 );
+}
+
+void KAstTopLevel::doStats()
+{
+ QString r( "0.00" );
+ if ( view->shots() )
+ r = QString::number( (double)view->hits() / view->shots() * 100.0,
+ 'g', 2 );
+
+/* multi-line text broken in Qt 3
+ QString s = tr( "Game Over\n\nShots fired:\t%1\n Hit:\t%2\n Missed:\t%3\nHit ratio:\t%4 %\n\nPress N for a new game" )
+ .arg(view->shots()).arg(view->hits())
+ .arg(view->shots() - view->hits())
+ .arg(r);
+*/
+
+ view->showText( "Game Over. Press N for a new game.", yellow, FALSE );
+}
+
+void KAstTopLevel::slotUpdateVitals()
+{
+ brakesLCD->display( view->brakeCount() );
+ shieldLCD->display( view->shieldCount() );
+ shootLCD->display( view->shootCount() );
+// teleportsLCD->display( view->teleportCount() );
+ powerMeter->setValue( view->power() );
+}
diff --git a/examples/demo/qasteroids/toplevel.h b/examples/demo/qasteroids/toplevel.h
new file mode 100644
index 0000000..6f1b581
--- /dev/null
+++ b/examples/demo/qasteroids/toplevel.h
@@ -0,0 +1,79 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+
+#ifndef __KAST_TOPLEVEL_H__
+#define __KAST_TOPLEVEL_H__
+
+#include <qmainwindow.h>
+#include <qdict.h>
+#include <qmap.h>
+
+#include "view.h"
+
+
+class KALedMeter;
+class QLCDNumber;
+
+class KAstTopLevel : public QMainWindow
+{
+ Q_OBJECT
+public:
+ KAstTopLevel( QWidget *parent=0, const char *name=0 );
+ virtual ~KAstTopLevel();
+
+private:
+ void playSound( const char *snd );
+ void readSoundMapping();
+ void doStats();
+
+protected:
+ virtual void showEvent( QShowEvent * );
+ virtual void hideEvent( QHideEvent * );
+ virtual void keyPressEvent( QKeyEvent *event );
+ virtual void keyReleaseEvent( QKeyEvent *event );
+
+private slots:
+ void slotNewGame();
+
+ void slotShipKilled();
+ void slotRockHit( int size );
+ void slotRocksRemoved();
+
+ void slotUpdateVitals();
+
+private:
+ KAsteroidsView *view;
+ QLCDNumber *scoreLCD;
+ QLCDNumber *levelLCD;
+ QLCDNumber *shipsLCD;
+
+ QLCDNumber *teleportsLCD;
+// QLCDNumber *bombsLCD;
+ QLCDNumber *brakesLCD;
+ QLCDNumber *shieldLCD;
+ QLCDNumber *shootLCD;
+ KALedMeter *powerMeter;
+
+ bool sound;
+ QDict<QString> soundDict;
+
+ // waiting for user to press Enter to launch a ship
+ bool waitShip;
+ bool isPaused;
+
+ int shipsRemain;
+ int score;
+ int level;
+ bool showHiscores;
+
+ enum Action { Launch, Thrust, RotateLeft, RotateRight, Shoot, Teleport,
+ Brake, Shield, Pause, NewGame };
+
+ QMap<int,Action> actions;
+};
+
+#endif
+
diff --git a/examples/demo/qasteroids/view.cpp b/examples/demo/qasteroids/view.cpp
new file mode 100644
index 0000000..d6ccd5d
--- /dev/null
+++ b/examples/demo/qasteroids/view.cpp
@@ -0,0 +1,908 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <qapplication.h>
+#include <qkeycode.h>
+#include <qaccel.h>
+#include <qmessagebox.h>
+
+#include "view.h"
+
+#define IMG_BACKGROUND "qasteroids/bg.png"
+
+#define REFRESH_DELAY 33
+#define SHIP_SPEED 0.3
+#define MISSILE_SPEED 10.0
+#define SHIP_STEPS 64
+#define ROTATE_RATE 2
+#define SHIELD_ON_COST 1
+#define SHIELD_HIT_COST 30
+#define BRAKE_ON_COST 4
+
+#define MAX_ROCK_SPEED 2.5
+#define MAX_POWERUP_SPEED 1.5
+#define MAX_SHIP_SPEED 12
+#define MAX_BRAKES 5
+#define MAX_SHIELDS 5
+#define MAX_FIREPOWER 5
+
+#define TEXT_SPEED 4
+
+#define PI_X_2 6.283185307
+#ifndef M_PI
+#define M_PI 3.141592654
+#endif
+
+static struct
+{
+ int id;
+ const char *path;
+ int frames;
+}
+kas_animations [] =
+{
+ { ID_ROCK_LARGE, "rock1/rock1%1.png", 32 },
+ { ID_ROCK_MEDIUM, "rock2/rock2%1.png", 32 },
+ { ID_ROCK_SMALL, "rock3/rock3%1.png", 32 },
+ { ID_SHIP, "ship/ship%1.png", 32 },
+ { ID_MISSILE, "missile/missile.png", 1 },
+ { ID_BIT, "bits/bits%1.png", 16 },
+ { ID_EXHAUST, "exhaust/exhaust.png", 1 },
+ { ID_ENERGY_POWERUP, "powerups/energy.png", 1 },
+// { ID_TELEPORT_POWERUP, "powerups/teleport%1.png", 12 },
+ { ID_BRAKE_POWERUP, "powerups/brake.png", 1 },
+ { ID_SHIELD_POWERUP, "powerups/shield.png", 1 },
+ { ID_SHOOT_POWERUP, "powerups/shoot.png", 1 },
+ { ID_SHIELD, "shield/shield%1.png", 6 },
+ { 0, 0, 0 }
+};
+
+
+
+KAsteroidsView::KAsteroidsView( QWidget *parent, const char *name )
+ : QWidget( parent, name ),
+ field(640, 440),
+ view(&field,this)
+{
+ view.setVScrollBarMode( QScrollView::AlwaysOff );
+ view.setHScrollBarMode( QScrollView::AlwaysOff );
+ view.viewport()->setFocusProxy( this );
+ rocks.setAutoDelete( TRUE );
+ missiles.setAutoDelete( TRUE );
+ bits.setAutoDelete( TRUE );
+ powerups.setAutoDelete( TRUE );
+ exhaust.setAutoDelete( TRUE );
+
+ field.setBackgroundColor( black );
+ QPixmap pm( IMG_BACKGROUND );
+ field.setBackgroundPixmap( pm );
+
+ textSprite = new QCanvasText( &field );
+ QFont font( "helvetica", 18 );
+ textSprite->setFont( font );
+
+ shield = 0;
+ shieldOn = FALSE;
+ refreshRate = REFRESH_DELAY;
+
+ initialized = readSprites();
+
+ shieldTimer = new QTimer( this );
+ connect( shieldTimer, SIGNAL(timeout()), this, SLOT(hideShield()) );
+ mTimerId = -1;
+
+ shipPower = MAX_POWER_LEVEL;
+ vitalsChanged = TRUE;
+ can_destroy_powerups = FALSE;
+
+ mPaused = TRUE;
+
+ if ( !initialized ) {
+ textSprite->setText( tr("Error: Cannot read sprite images") );
+ textSprite->setColor( red );
+ textSprite->move( (field.width()-textSprite->boundingRect().width()) / 2,
+ (field.height()-textSprite->boundingRect().height()) / 2 );
+ textSprite->show();
+ }
+}
+
+// - - -
+
+KAsteroidsView::~KAsteroidsView()
+{
+}
+
+// - - -
+
+void KAsteroidsView::reset()
+{
+ if ( !initialized )
+ return;
+ rocks.clear();
+ missiles.clear();
+ bits.clear();
+ powerups.clear();
+ exhaust.clear();
+
+ shotsFired = 0;
+ shotsHit = 0;
+
+ rockSpeed = 1.0;
+ powerupSpeed = 1.0;
+ mFrameNum = 0;
+ mPaused = FALSE;
+
+ ship->hide();
+ shield->hide();
+/*
+ if ( mTimerId >= 0 ) {
+ killTimer( mTimerId );
+ mTimerId = -1;
+ }
+*/
+}
+
+// - --
+
+void KAsteroidsView::newGame()
+{
+ if ( !initialized )
+ return;
+ if ( shieldOn )
+ {
+ shield->hide();
+ shieldOn = FALSE;
+ }
+ reset();
+ if ( mTimerId < 0 )
+ mTimerId = startTimer( REFRESH_DELAY );
+ emit updateVitals();
+}
+
+// - - -
+
+void KAsteroidsView::endGame()
+{
+}
+
+void KAsteroidsView::pause( bool p )
+{
+ if ( !initialized )
+ return;
+ if ( !mPaused && p ) {
+ if ( mTimerId >= 0 ) {
+ killTimer( mTimerId );
+ mTimerId = -1;
+ }
+ } else if ( mPaused && !p )
+ mTimerId = startTimer( REFRESH_DELAY );
+ mPaused = p;
+}
+
+// - - -
+
+void KAsteroidsView::newShip()
+{
+ if ( !initialized )
+ return;
+ ship->move( width()/2, height()/2, 0 );
+ shield->move( width()/2, height()/2, 0 );
+ ship->setVelocity( 0.0, 0.0 );
+ shipDx = 0;
+ shipDy = 0;
+ shipAngle = 0;
+ rotateL = FALSE;
+ rotateR = FALSE;
+ thrustShip = FALSE;
+ shootShip = FALSE;
+ brakeShip = FALSE;
+ teleportShip = FALSE;
+ shieldOn = TRUE;
+ shootDelay = 0;
+ shipPower = MAX_POWER_LEVEL;
+ rotateRate = ROTATE_RATE;
+ rotateSlow = 0;
+
+ mBrakeCount = 0;
+ mTeleportCount = 0;
+ mShootCount = 0;
+
+ ship->show();
+ shield->show();
+ mShieldCount = 1; // just in case the ship appears on a rock.
+ shieldTimer->start( 1000, TRUE );
+}
+
+void KAsteroidsView::setShield( bool s )
+{
+ if ( !initialized )
+ return;
+ if ( shieldTimer->isActive() && !s ) {
+ shieldTimer->stop();
+ hideShield();
+ } else {
+ shieldOn = s && mShieldCount;
+ }
+}
+
+void KAsteroidsView::brake( bool b )
+{
+ if ( !initialized )
+ return;
+ if ( mBrakeCount )
+ {
+ if ( brakeShip && !b )
+ {
+ rotateL = FALSE;
+ rotateR = FALSE;
+ thrustShip = FALSE;
+ rotateRate = ROTATE_RATE;
+ }
+
+ brakeShip = b;
+ }
+}
+
+// - - -
+
+bool KAsteroidsView::readSprites()
+{
+ QString sprites_prefix = "qasteroids/sprites/";
+
+ int i = 0;
+ while ( kas_animations[i].id )
+ {
+ QCanvasPixmapArray *anim =
+ new QCanvasPixmapArray( sprites_prefix + kas_animations[i].path,
+ kas_animations[i].frames );
+ if ( !anim->isValid() )
+ return FALSE;
+ animation.insert( kas_animations[i].id, anim );
+ i++;
+ }
+
+ ship = new QCanvasSprite( animation[ID_SHIP], &field );
+ ship->hide();
+
+ shield = new KShield( animation[ID_SHIELD], &field );
+ shield->hide();
+
+ return (ship->image(0) && shield->image(0));
+}
+
+// - - -
+
+void KAsteroidsView::addRocks( int num )
+{
+ if ( !initialized )
+ return;
+ for ( int i = 0; i < num; i++ )
+ {
+ KRock *rock = new KRock( animation[ID_ROCK_LARGE], &field,
+ ID_ROCK_LARGE, randInt(2), randInt(2) ? -1 : 1 );
+ double dx = (2.0 - randDouble()*4.0) * rockSpeed;
+ double dy = (2.0 - randDouble()*4.0) * rockSpeed;
+ rock->setVelocity( dx, dy );
+ rock->setFrame( randInt( rock->frameCount() ) );
+ if ( dx > 0 )
+ {
+ if ( dy > 0 )
+ rock->move( 5, 5, 0 );
+ else
+ rock->move( 5, field.height() - 25, 0 );
+ }
+ else
+ {
+ if ( dy > 0 )
+ rock->move( field.width() - 25, 5, 0 );
+ else
+ rock->move( field.width() - 25, field.height() - 25, 0 );
+ }
+ rock->show( );
+ rocks.append( rock );
+ }
+}
+
+// - - -
+
+void KAsteroidsView::showText( const QString &text, const QColor &color, bool scroll )
+{
+ if ( !initialized )
+ return;
+ textSprite->setText( text );
+ textSprite->setColor( color );
+
+ if ( scroll ) {
+ textSprite->move( (field.width()-textSprite->boundingRect().width()) / 2,
+ -textSprite->boundingRect().height() );
+ textDy = TEXT_SPEED;
+ } else {
+ textSprite->move( (field.width()-textSprite->boundingRect().width()) / 2,
+ (field.height()-textSprite->boundingRect().height()) / 2 );
+ textDy = 0;
+ }
+ textSprite->show();
+}
+
+// - - -
+
+void KAsteroidsView::hideText()
+{
+ textDy = -TEXT_SPEED;
+}
+
+// - - -
+
+void KAsteroidsView::resizeEvent(QResizeEvent* event)
+{
+ QWidget::resizeEvent(event);
+ field.resize(width()-4, height()-4);
+ view.resize(width(),height());
+}
+
+// - - -
+
+void KAsteroidsView::timerEvent( QTimerEvent * )
+{
+ field.advance();
+
+ QCanvasSprite *rock;
+
+ // move rocks forward
+ for ( rock = rocks.first(); rock; rock = rocks.next() ) {
+ ((KRock *)rock)->nextFrame();
+ wrapSprite( rock );
+ }
+
+ wrapSprite( ship );
+
+ // check for missile collision with rocks.
+ processMissiles();
+
+ // these are generated when a ship explodes
+ for ( KBit *bit = bits.first(); bit; bit = bits.next() )
+ {
+ if ( bit->expired() )
+ {
+ bits.removeRef( bit );
+ }
+ else
+ {
+ bit->growOlder();
+ bit->setFrame( ( bit->frame()+1 ) % bit->frameCount() );
+ }
+ }
+
+ for ( KExhaust *e = exhaust.first(); e; e = exhaust.next() )
+ exhaust.removeRef( e );
+
+ // move / rotate ship.
+ // check for collision with a rock.
+ processShip();
+
+ // move powerups and check for collision with player and missiles
+ processPowerups();
+
+ if ( textSprite->isVisible() )
+ {
+ if ( textDy < 0 &&
+ textSprite->boundingRect().y() <= -textSprite->boundingRect().height() ) {
+ textSprite->hide();
+ } else {
+ textSprite->moveBy( 0, textDy );
+ }
+ if ( textSprite->boundingRect().y() > (field.height()-textSprite->boundingRect().height())/2 )
+ textDy = 0;
+ }
+
+ if ( vitalsChanged && !(mFrameNum % 10) ) {
+ emit updateVitals();
+ vitalsChanged = FALSE;
+ }
+
+ mFrameNum++;
+}
+
+void KAsteroidsView::wrapSprite( QCanvasItem *s )
+{
+ int x = int(s->x() + s->boundingRect().width() / 2);
+ int y = int(s->y() + s->boundingRect().height() / 2);
+
+ if ( x > field.width() )
+ s->move( s->x() - field.width(), s->y() );
+ else if ( x < 0 )
+ s->move( field.width() + s->x(), s->y() );
+
+ if ( y > field.height() )
+ s->move( s->x(), s->y() - field.height() );
+ else if ( y < 0 )
+ s->move( s->x(), field.height() + s->y() );
+}
+
+// - - -
+
+void KAsteroidsView::rockHit( QCanvasItem *hit )
+{
+ KPowerup *nPup = 0;
+ int rnd = int(randDouble()*30.0) % 30;
+ switch( rnd )
+ {
+ case 4:
+ case 5:
+ nPup = new KPowerup( animation[ID_ENERGY_POWERUP], &field,
+ ID_ENERGY_POWERUP );
+ break;
+ case 10:
+// nPup = new KPowerup( animation[ID_TELEPORT_POWERUP], &field,
+// ID_TELEPORT_POWERUP );
+ break;
+ case 15:
+ nPup = new KPowerup( animation[ID_BRAKE_POWERUP], &field,
+ ID_BRAKE_POWERUP );
+ break;
+ case 20:
+ nPup = new KPowerup( animation[ID_SHIELD_POWERUP], &field,
+ ID_SHIELD_POWERUP );
+ break;
+ case 24:
+ case 25:
+ nPup = new KPowerup( animation[ID_SHOOT_POWERUP], &field,
+ ID_SHOOT_POWERUP );
+ break;
+ }
+ if ( nPup )
+ {
+ double r = 0.5 - randDouble();
+ nPup->move( hit->x(), hit->y(), 0 );
+ nPup->setVelocity( hit->xVelocity() + r, hit->yVelocity() + r );
+ nPup->show( );
+ powerups.append( nPup );
+ }
+
+ if ( hit->rtti() == ID_ROCK_LARGE || hit->rtti() == ID_ROCK_MEDIUM )
+ {
+ // break into smaller rocks
+ double addx[4] = { 1.0, 1.0, -1.0, -1.0 };
+ double addy[4] = { -1.0, 1.0, -1.0, 1.0 };
+
+ double dx = hit->xVelocity();
+ double dy = hit->yVelocity();
+
+ double maxRockSpeed = MAX_ROCK_SPEED * rockSpeed;
+ if ( dx > maxRockSpeed )
+ dx = maxRockSpeed;
+ else if ( dx < -maxRockSpeed )
+ dx = -maxRockSpeed;
+ if ( dy > maxRockSpeed )
+ dy = maxRockSpeed;
+ else if ( dy < -maxRockSpeed )
+ dy = -maxRockSpeed;
+
+ QCanvasSprite *nrock;
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ double r = rockSpeed/2 - randDouble()*rockSpeed;
+ if ( hit->rtti() == ID_ROCK_LARGE )
+ {
+ nrock = new KRock( animation[ID_ROCK_MEDIUM], &field,
+ ID_ROCK_MEDIUM, randInt(2), randInt(2) ? -1 : 1 );
+ emit rockHit( 0 );
+ }
+ else
+ {
+ nrock = new KRock( animation[ID_ROCK_SMALL], &field,
+ ID_ROCK_SMALL, randInt(2), randInt(2) ? -1 : 1 );
+ emit rockHit( 1 );
+ }
+
+ nrock->move( hit->x(), hit->y(), 0 );
+ nrock->setVelocity( dx+addx[i]*rockSpeed+r, dy+addy[i]*rockSpeed+r );
+ nrock->setFrame( randInt( nrock->frameCount() ) );
+ nrock->show( );
+ rocks.append( nrock );
+ }
+ }
+ else if ( hit->rtti() == ID_ROCK_SMALL )
+ emit rockHit( 2 );
+ rocks.removeRef( (QCanvasSprite *)hit );
+ if ( rocks.count() == 0 )
+ emit rocksRemoved();
+}
+
+void KAsteroidsView::reducePower( int val )
+{
+ shipPower -= val;
+ if ( shipPower <= 0 )
+ {
+ shipPower = 0;
+ thrustShip = FALSE;
+ if ( shieldOn )
+ {
+ shieldOn = FALSE;
+ shield->hide();
+ }
+ }
+ vitalsChanged = TRUE;
+}
+
+void KAsteroidsView::addExhaust( double x, double y, double dx,
+ double dy, int count )
+{
+ for ( int i = 0; i < count; i++ )
+ {
+ KExhaust *e = new KExhaust( animation[ID_EXHAUST], &field );
+ e->move( x + 2 - randDouble()*4, y + 2 - randDouble()*4 );
+ e->setVelocity( dx, dy );
+ e->show( );
+ exhaust.append( e );
+ }
+}
+
+void KAsteroidsView::processMissiles()
+{
+ KMissile *missile;
+
+ // if a missile has hit a rock, remove missile and break rock into smaller
+ // rocks or remove completely.
+ QPtrListIterator<KMissile> it(missiles);
+
+ for ( ; it.current(); ++it )
+ {
+ missile = it.current();
+ missile->growOlder();
+
+ if ( missile->expired() )
+ {
+ missiles.removeRef( missile );
+ continue;
+ }
+
+ wrapSprite( missile );
+
+ QCanvasItemList hits = missile->collisions( TRUE );
+ QCanvasItemList::Iterator hit;
+ for ( hit = hits.begin(); hit != hits.end(); ++hit )
+ {
+ if ( (*hit)->rtti() >= ID_ROCK_LARGE &&
+ (*hit)->rtti() <= ID_ROCK_SMALL )
+ {
+ shotsHit++;
+ rockHit( *hit );
+ missiles.removeRef( missile );
+ break;
+ }
+ }
+ }
+}
+
+// - - -
+
+void KAsteroidsView::processShip()
+{
+ if ( ship->isVisible() )
+ {
+ if ( shieldOn )
+ {
+ shield->show();
+ reducePower( SHIELD_ON_COST );
+ static int sf = 0;
+ sf++;
+
+ if ( sf % 2 )
+ shield->setFrame( (shield->frame()+1) % shield->frameCount() );
+ shield->move( ship->x() - 9, ship->y() - 9 );
+
+ QCanvasItemList hits = shield->collisions( TRUE );
+ QCanvasItemList::Iterator it;
+ for ( it = hits.begin(); it != hits.end(); ++it )
+ {
+ if ( (*it)->rtti() >= ID_ROCK_LARGE &&
+ (*it)->rtti() <= ID_ROCK_SMALL )
+ {
+ int factor;
+ switch ( (*it)->rtti() )
+ {
+ case ID_ROCK_LARGE:
+ factor = 3;
+ break;
+
+ case ID_ROCK_MEDIUM:
+ factor = 2;
+ break;
+
+ default:
+ factor = 1;
+ }
+
+ if ( factor > mShieldCount )
+ {
+ // shield not strong enough
+ shieldOn = FALSE;
+ break;
+ }
+ rockHit( *it );
+ // the more shields we have the less costly
+ reducePower( factor * (SHIELD_HIT_COST - mShieldCount*2) );
+ }
+ }
+ }
+
+ if ( !shieldOn )
+ {
+ shield->hide();
+ QCanvasItemList hits = ship->collisions( TRUE );
+ QCanvasItemList::Iterator it;
+ for ( it = hits.begin(); it != hits.end(); ++it )
+ {
+ if ( (*it)->rtti() >= ID_ROCK_LARGE &&
+ (*it)->rtti() <= ID_ROCK_SMALL )
+ {
+ KBit *bit;
+ for ( int i = 0; i < 12; i++ )
+ {
+ bit = new KBit( animation[ID_BIT], &field );
+ bit->move( ship->x() + 5 - randDouble() * 10,
+ ship->y() + 5 - randDouble() * 10,
+ randInt(bit->frameCount()) );
+ bit->setVelocity( 1-randDouble()*2,
+ 1-randDouble()*2 );
+ bit->setDeath( 60 + randInt(60) );
+ bit->show( );
+ bits.append( bit );
+ }
+ ship->hide();
+ shield->hide();
+ emit shipKilled();
+ break;
+ }
+ }
+ }
+
+
+ if ( rotateSlow )
+ rotateSlow--;
+
+ if ( rotateL )
+ {
+ shipAngle -= rotateSlow ? 1 : rotateRate;
+ if ( shipAngle < 0 )
+ shipAngle += SHIP_STEPS;
+ }
+
+ if ( rotateR )
+ {
+ shipAngle += rotateSlow ? 1 : rotateRate;
+ if ( shipAngle >= SHIP_STEPS )
+ shipAngle -= SHIP_STEPS;
+ }
+
+ double angle = shipAngle * PI_X_2 / SHIP_STEPS;
+ double cosangle = cos( angle );
+ double sinangle = sin( angle );
+
+ if ( brakeShip )
+ {
+ thrustShip = FALSE;
+ rotateL = FALSE;
+ rotateR = FALSE;
+ rotateRate = ROTATE_RATE;
+ if ( fabs(shipDx) < 2.5 && fabs(shipDy) < 2.5 )
+ {
+ shipDx = 0.0;
+ shipDy = 0.0;
+ ship->setVelocity( shipDx, shipDy );
+ brakeShip = FALSE;
+ }
+ else
+ {
+ double motionAngle = atan2( -shipDy, -shipDx );
+ if ( angle > M_PI )
+ angle -= PI_X_2;
+ double angleDiff = angle - motionAngle;
+ if ( angleDiff > M_PI )
+ angleDiff = PI_X_2 - angleDiff;
+ else if ( angleDiff < -M_PI )
+ angleDiff = PI_X_2 + angleDiff;
+ double fdiff = fabs( angleDiff );
+ if ( fdiff > 0.08 )
+ {
+ if ( angleDiff > 0 )
+ rotateL = TRUE;
+ else if ( angleDiff < 0 )
+ rotateR = TRUE;
+ if ( fdiff > 0.6 )
+ rotateRate = mBrakeCount + 1;
+ else if ( fdiff > 0.4 )
+ rotateRate = 2;
+ else
+ rotateRate = 1;
+
+ if ( rotateRate > 5 )
+ rotateRate = 5;
+ }
+ else if ( fabs(shipDx) > 1 || fabs(shipDy) > 1 )
+ {
+ thrustShip = TRUE;
+ // we'll make braking a bit faster
+ shipDx += cosangle/6 * (mBrakeCount - 1);
+ shipDy += sinangle/6 * (mBrakeCount - 1);
+ reducePower( BRAKE_ON_COST );
+ addExhaust( ship->x() + 20 - cosangle*22,
+ ship->y() + 20 - sinangle*22,
+ shipDx-cosangle, shipDy-sinangle,
+ mBrakeCount+1 );
+ }
+ }
+ }
+
+ if ( thrustShip )
+ {
+ // The ship has a terminal velocity, but trying to go faster
+ // still uses fuel (can go faster diagonally - don't care).
+ double thrustx = cosangle/4;
+ double thrusty = sinangle/4;
+ if ( fabs(shipDx + thrustx) < MAX_SHIP_SPEED )
+ shipDx += thrustx;
+ if ( fabs(shipDy + thrusty) < MAX_SHIP_SPEED )
+ shipDy += thrusty;
+ ship->setVelocity( shipDx, shipDy );
+ reducePower( 1 );
+ addExhaust( ship->x() + 20 - cosangle*20,
+ ship->y() + 20 - sinangle*20,
+ shipDx-cosangle, shipDy-sinangle, 3 );
+ }
+
+ ship->setFrame( shipAngle >> 1 );
+
+ if ( shootShip )
+ {
+ if ( !shootDelay && (int)missiles.count() < mShootCount + 2 )
+ {
+ KMissile *missile = new KMissile( animation[ID_MISSILE], &field );
+ missile->move( 21+ship->x()+cosangle*21,
+ 21+ship->y()+sinangle*21, 0 );
+ missile->setVelocity( shipDx + cosangle*MISSILE_SPEED,
+ shipDy + sinangle*MISSILE_SPEED );
+ missile->show( );
+ missiles.append( missile );
+ shotsFired++;
+ reducePower( 1 );
+
+ shootDelay = 5;
+ }
+
+ if ( shootDelay )
+ shootDelay--;
+ }
+
+ if ( teleportShip )
+ {
+ int ra = rand() % 10;
+ if( ra == 0 )
+ ra += rand() % 20;
+ int xra = ra * 60 + ( (rand() % 20) * (rand() % 20) );
+ int yra = ra * 50 - ( (rand() % 20) * (rand() % 20) );
+ ship->move( xra, yra );
+ }
+
+ vitalsChanged = TRUE;
+ }
+}
+
+// - - -
+
+void KAsteroidsView::processPowerups()
+{
+ if ( !powerups.isEmpty() )
+ {
+ // if player gets the powerup remove it from the screen, if option
+ // "Can destroy powerups" is enabled and a missile hits the powerup
+ // destroy it
+
+ KPowerup *pup;
+ QPtrListIterator<KPowerup> it( powerups );
+
+ for( ; it.current(); ++it )
+ {
+ pup = it.current();
+ pup->growOlder();
+
+ if( pup->expired() )
+ {
+ powerups.removeRef( pup );
+ continue;
+ }
+
+ wrapSprite( pup );
+
+ QCanvasItemList hits = pup->collisions( TRUE );
+ QCanvasItemList::Iterator it;
+ for ( it = hits.begin(); it != hits.end(); ++it )
+ {
+ if ( (*it) == ship )
+ {
+ switch( pup->rtti() )
+ {
+ case ID_ENERGY_POWERUP:
+ shipPower += 150;
+ if ( shipPower > MAX_POWER_LEVEL )
+ shipPower = MAX_POWER_LEVEL;
+ break;
+ case ID_TELEPORT_POWERUP:
+ mTeleportCount++;
+ break;
+ case ID_BRAKE_POWERUP:
+ if ( mBrakeCount < MAX_BRAKES )
+ mBrakeCount++;
+ break;
+ case ID_SHIELD_POWERUP:
+ if ( mShieldCount < MAX_SHIELDS )
+ mShieldCount++;
+ break;
+ case ID_SHOOT_POWERUP:
+ if ( mShootCount < MAX_FIREPOWER )
+ mShootCount++;
+ break;
+ }
+
+ powerups.removeRef( pup );
+ vitalsChanged = TRUE;
+ }
+ else if ( (*it) == shield )
+ {
+ powerups.removeRef( pup );
+ }
+ else if ( (*it)->rtti() == ID_MISSILE )
+ {
+ if ( can_destroy_powerups )
+ {
+ powerups.removeRef( pup );
+ }
+ }
+ }
+ }
+ } // -- if( powerups.isEmpty() )
+}
+
+// - - -
+
+void KAsteroidsView::hideShield()
+{
+ shield->hide();
+ mShieldCount = 0;
+ shieldOn = FALSE;
+}
+
+double KAsteroidsView::randDouble()
+{
+ int v = rand();
+ return (double)v / (double)RAND_MAX;
+}
+
+int KAsteroidsView::randInt( int range )
+{
+ return rand() % range;
+}
+
+void KAsteroidsView::showEvent( QShowEvent *e )
+{
+#if defined( QT_LICENSE_PROFESSIONAL )
+ static bool wasThere = FALSE;
+
+ if ( !wasThere ) {
+ wasThere = TRUE;
+ QMessageBox::information( this, tr("QCanvas demo"),
+ tr("This game has been implemented using the QCanvas class.\n"
+ "The QCanvas class is not part of the Professional Edition. Please \n"
+ "contact Trolltech if you want to upgrade to the Enterprise Edition.") );
+ }
+#endif
+
+ QWidget::showEvent( e );
+}
diff --git a/examples/demo/qasteroids/view.h b/examples/demo/qasteroids/view.h
new file mode 100644
index 0000000..f09d1c3
--- /dev/null
+++ b/examples/demo/qasteroids/view.h
@@ -0,0 +1,138 @@
+/*
+ * KAsteroids - Copyright (c) Martin R. Jones 1997
+ *
+ * Part of the KDE project
+ */
+
+#ifndef __AST_VIEW_H__
+#define __AST_VIEW_H__
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <qintdict.h>
+#include <qtimer.h>
+#include <qcanvas.h>
+#include "sprites.h"
+
+#define MAX_POWER_LEVEL 1000
+
+class KAsteroidsView : public QWidget
+{
+ Q_OBJECT
+public:
+ KAsteroidsView( QWidget *parent = 0, const char *name = 0 );
+ virtual ~KAsteroidsView();
+
+ int refreshRate;
+
+ void reset();
+ void setRockSpeed( double rs ) { rockSpeed = rs; }
+ void addRocks( int num );
+ void newGame();
+ void endGame();
+ void newShip();
+
+ void rotateLeft( bool r ) { rotateL = r; rotateSlow = 5; }
+ void rotateRight( bool r ) { rotateR = r; rotateSlow = 5; }
+ void thrust( bool t ) { thrustShip = t && shipPower > 0; }
+ void shoot( bool s ) { shootShip = s; shootDelay = 0; }
+ void setShield( bool s );
+ void teleport( bool te) { teleportShip = te && mTeleportCount; }
+ void brake( bool b );
+ void pause( bool p);
+
+ void showText( const QString &text, const QColor &color, bool scroll=TRUE );
+ void hideText();
+
+ int shots() const { return shotsFired; }
+ int hits() const { return shotsHit; }
+ int power() const { return shipPower; }
+
+ int teleportCount() const { return mTeleportCount; }
+ int brakeCount() const { return mBrakeCount; }
+ int shieldCount() const { return mShieldCount; }
+ int shootCount() const { return mShootCount; }
+
+signals:
+ void shipKilled();
+ void rockHit( int size );
+ void rocksRemoved();
+ void updateVitals();
+
+private slots:
+ void hideShield();
+
+protected:
+ bool readSprites();
+ void wrapSprite( QCanvasItem * );
+ void rockHit( QCanvasItem * );
+ void reducePower( int val );
+ void addExhaust( double x, double y, double dx, double dy, int count );
+ void processMissiles();
+ void processShip();
+ void processPowerups();
+ void processShield();
+ double randDouble();
+ int randInt( int range );
+
+ virtual void resizeEvent( QResizeEvent *event );
+ virtual void timerEvent( QTimerEvent * );
+
+ void showEvent( QShowEvent * );
+
+private:
+ QCanvas field;
+ QCanvasView view;
+ QIntDict<QCanvasPixmapArray> animation;
+ QPtrList<QCanvasSprite> rocks;
+ QPtrList<KMissile> missiles;
+ QPtrList<KBit> bits;
+ QPtrList<KExhaust> exhaust;
+ QPtrList<KPowerup> powerups;
+ KShield *shield;
+ QCanvasSprite *ship;
+ QCanvasText *textSprite;
+
+ bool rotateL;
+ bool rotateR;
+ bool thrustShip;
+ bool shootShip;
+ bool teleportShip;
+ bool brakeShip;
+ bool pauseShip;
+ bool shieldOn;
+
+ bool vitalsChanged;
+
+ int shipAngle;
+ int rotateSlow;
+ int rotateRate;
+ int shipPower;
+
+ int shotsFired;
+ int shotsHit;
+ int shootDelay;
+
+ int mBrakeCount;
+ int mShieldCount;
+ int mTeleportCount;
+ int mShootCount;
+
+ double shipDx;
+ double shipDy;
+
+ int textDy;
+ int mFrameNum;
+ bool mPaused;
+ int mTimerId;
+
+ double rockSpeed;
+ double powerupSpeed;
+
+ bool can_destroy_powerups;
+
+ QTimer *shieldTimer;
+ bool initialized;
+};
+
+#endif
diff --git a/examples/demo/qthumbwheel.cpp b/examples/demo/qthumbwheel.cpp
new file mode 100644
index 0000000..e510daa
--- /dev/null
+++ b/examples/demo/qthumbwheel.cpp
@@ -0,0 +1,301 @@
+/****************************************************************************
+**
+** Definition of QThumbWheel class
+**
+** Created : 010205
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.QPL
+** included in the packaging of this file. Licensees holding valid Qt
+** Commercial licenses may use this file in accordance with the Qt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qthumbwheel.h"
+
+#ifndef QT_NO_THUMBWHEEL
+#include <qpainter.h>
+#include <qdrawutil.h>
+#include <qpixmap.h>
+#include <math.h>
+
+static const double m_pi = 3.14159265358979323846;
+static const double rad_factor = 180.0 / m_pi;
+
+QThumbWheel::QThumbWheel( QWidget *parent, const char *name )
+ : QFrame( parent, name )
+{
+ orient = Vertical;
+ init();
+}
+
+/*!
+ Destructs the wheel.
+*/
+
+QThumbWheel::~QThumbWheel()
+{
+}
+
+/*!
+ \internal
+ */
+
+void QThumbWheel::init()
+{
+ track = TRUE;
+ mousePressed = FALSE;
+ pressedAt = -1;
+ rat = 1.0;
+ setFrameStyle( WinPanel | Sunken );
+ setMargin( 2 );
+ setFocusPolicy( WheelFocus );
+}
+
+void QThumbWheel::setOrientation( Orientation orientation )
+{
+ orient = orientation;
+ update();
+}
+
+void QThumbWheel::setTracking( bool enable )
+{
+ track = enable;
+}
+
+void QThumbWheel::setTransmissionRatio( double r )
+{
+ rat = r;
+}
+
+/*!
+ Makes QRangeControl::setValue() available as a slot.
+*/
+
+void QThumbWheel::setValue( int value )
+{
+ QRangeControl::setValue( value );
+}
+
+void QThumbWheel::valueChange()
+{
+ repaint( FALSE );
+ emit valueChanged(value());
+}
+
+void QThumbWheel::rangeChange()
+{
+}
+
+void QThumbWheel::stepChange()
+{
+}
+
+/*!
+ \reimp
+*/
+
+void QThumbWheel::keyPressEvent( QKeyEvent *e )
+{
+ switch ( e->key() ) {
+ case Key_Left:
+ if ( orient == Horizontal )
+ subtractLine();
+ break;
+ case Key_Right:
+ if ( orient == Horizontal )
+ addLine();
+ break;
+ case Key_Up:
+ if ( orient == Vertical )
+ subtractLine();
+ break;
+ case Key_Down:
+ if ( orient == Vertical )
+ addLine();
+ break;
+ case Key_PageUp:
+ subtractPage();
+ break;
+ case Key_PageDown:
+ addPage();
+ break;
+ case Key_Home:
+ setValue( minValue() );
+ break;
+ case Key_End:
+ setValue( maxValue() );
+ break;
+ default:
+ e->ignore();
+ return;
+ };
+}
+
+/*!
+ \reimp
+*/
+
+void QThumbWheel::mousePressEvent( QMouseEvent *e )
+{
+ if ( e->button() == LeftButton ) {
+ mousePressed = TRUE;
+ pressedAt = valueFromPosition( e->pos() );
+ }
+}
+
+/*!
+ \reimp
+*/
+
+void QThumbWheel::mouseReleaseEvent( QMouseEvent *e )
+{
+ int movedTo = valueFromPosition( e->pos() );
+ setValue( value() + movedTo - pressedAt );
+ pressedAt = movedTo;
+}
+
+/*!
+ \reimp
+*/
+
+void QThumbWheel::mouseMoveEvent( QMouseEvent *e )
+{
+ if ( !mousePressed )
+ return;
+ if ( track ) {
+ int movedTo = valueFromPosition( e->pos() );
+ setValue( value() + movedTo - pressedAt );
+ pressedAt = movedTo;
+ }
+}
+
+/*!
+ \reimp
+*/
+
+void QThumbWheel::wheelEvent( QWheelEvent *e )
+{
+ int step = ( e->state() & ControlButton ) ? lineStep() : pageStep();
+ setValue( value() - e->delta()*step/120 );
+ e->accept();
+}
+
+/*!\reimp
+*/
+
+void QThumbWheel::focusInEvent( QFocusEvent *e )
+{
+ QWidget::focusInEvent( e );
+}
+
+/*!\reimp
+*/
+
+void QThumbWheel::focusOutEvent( QFocusEvent *e )
+{
+ QWidget::focusOutEvent( e );
+}
+
+void QThumbWheel::drawContents( QPainter *p )
+{
+ QRect cr = contentsRect();
+ // double buffer
+ QPixmap pix( width(), height() );
+ QPainter pt( &pix );
+ QBrush brush = backgroundPixmap() ?
+ QBrush( backgroundColor(), *backgroundPixmap() ) : QBrush( backgroundColor() );
+ pt.fillRect( cr, brush );
+
+ const int n = 17;
+ const double delta = m_pi / double(n);
+ // ### use positionFromValue() with rad*16 or similar
+ double alpha = 2*m_pi*double(value()-minValue())/
+ double(maxValue()-minValue())*transmissionRatio();
+ alpha = fmod(alpha, delta);
+ QPen pen0( colorGroup().midlight() );
+ QPen pen1( colorGroup().dark() );
+
+ if ( orient == Horizontal ) {
+ double r = 0.5*cr.width();
+ int y0 = cr.y()+1;
+ int y1 = cr.bottom()-1;
+ for ( int i = 0; i < n; i++ ) {
+ int x = cr.x() + int((1-cos(delta*double(i)+alpha))*r);
+ pt.setPen( pen0 );
+ pt.drawLine( x, y0, x, y1 );
+ pt.setPen( pen1 );
+ pt.drawLine( x+1, y0, x+1, y1 );
+ }
+ } else {
+ // vertical orientation
+ double r = 0.5*cr.height();
+ int x0 = cr.x()+1;
+ int x1 = cr.right()-1;
+ for ( int i = 0; i < n; i++ ) {
+ int y = cr.y() + int((1-cos(delta*double(i)+alpha))*r);
+ pt.setPen( pen0 );
+ pt.drawLine( x0, y, x1, y );
+ pt.setPen( pen1 );
+ pt.drawLine( x0, y+1, x1, y+1 );
+ }
+ }
+ qDrawShadePanel( &pt, cr, colorGroup());
+
+ pt.end();
+ p->drawPixmap( 0, 0, pix );
+}
+
+int QThumbWheel::valueFromPosition( const QPoint &p )
+{
+ QRect wrec = contentsRect();
+ int pos, min, max;
+ if ( orient == Horizontal ) {
+ pos = p.x();
+ min = wrec.left();
+ max = wrec.right();
+ } else {
+ pos = p.y();
+ min = wrec.top();
+ max = wrec.bottom();
+ }
+ double alpha;
+ if ( pos < min )
+ alpha = 0;
+ else if ( pos > max )
+ alpha = m_pi;
+ else
+ alpha = acos( 1.0 - 2.0*double(pos-min)/double(max-min) );// ### taylor
+ double deg = alpha*rad_factor/transmissionRatio();
+ // ### use valueFromPosition()
+ return minValue() + int((maxValue()-minValue())*deg/360.0);
+}
+
+#endif
diff --git a/examples/demo/qthumbwheel.h b/examples/demo/qthumbwheel.h
new file mode 100644
index 0000000..6945e78
--- /dev/null
+++ b/examples/demo/qthumbwheel.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Definition of QThumbWheel class
+**
+** Created : 010205
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.QPL
+** included in the packaging of this file. Licensees holding valid Qt
+** Commercial licenses may use this file in accordance with the Qt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef QTHUMBWHEEL_H
+#define QTHUMBWHEEL_H
+
+#ifndef QT_H
+#include "qframe.h"
+#include "qrangecontrol.h"
+#endif // QT_H
+
+#ifndef QT_NO_THUMBWHEEL
+
+class QThumbWheel : public QFrame, public QRangeControl
+{
+ Q_OBJECT
+
+public:
+ QThumbWheel( QWidget *parent=0, const char *name=0 );
+ ~QThumbWheel();
+
+ virtual void setOrientation( Orientation );
+ Orientation orientation() const;
+ virtual void setTracking( bool enable );
+ bool tracking() const;
+ virtual void setTransmissionRatio( double r );
+ double transmissionRatio() const;
+
+public slots:
+ virtual void setValue( int );
+
+signals:
+ void valueChanged( int value );
+
+protected:
+ void valueChange();
+ void rangeChange();
+ void stepChange();
+
+ void keyPressEvent( QKeyEvent * );
+ void mousePressEvent( QMouseEvent * );
+ void mouseReleaseEvent( QMouseEvent * );
+ void mouseMoveEvent( QMouseEvent * );
+ void wheelEvent( QWheelEvent * );
+ void focusInEvent( QFocusEvent *e );
+ void focusOutEvent( QFocusEvent *e );
+
+ void drawContents( QPainter * );
+
+private:
+ void init();
+ int valueFromPosition( const QPoint & );
+
+
+ double rat;
+ int pressedAt;
+ Orientation orient;
+ uint track : 1;
+ uint mousePressed : 1;
+
+ class QThumbWheelPrivate;
+ QThumbWheelPrivate *d;
+};
+
+inline QThumbWheel::Orientation QThumbWheel::orientation() const
+{
+ return orient;
+}
+
+inline bool QThumbWheel::tracking() const
+{
+ return (bool)track;
+}
+
+inline double QThumbWheel::transmissionRatio() const
+{
+ return rat;
+}
+
+#endif // QT_NO_WHEEL
+
+#endif // QWHEEL_H
diff --git a/examples/demo/sql/book.sql b/examples/demo/sql/book.sql
new file mode 100644
index 0000000..417ef43
--- /dev/null
+++ b/examples/demo/sql/book.sql
@@ -0,0 +1,42 @@
+-- The following SQL generates the database
+-- used by the 'book' example programs
+-- Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+--
+-- This file is part of an example program for Qt. This example
+-- program may be used, distributed and modified without limitation.
+
+DROP TABLE author;
+DROP TABLE book;
+DROP TABLE sequence;
+
+CREATE TABLE author
+( id integer primary key,
+forename varchar(40),
+surname varchar(40) );
+
+CREATE TABLE book
+( id integer primary key,
+title varchar(40),
+price numeric(10,2),
+authorid integer,
+notes varchar(255) );
+
+create index book_authorid_idx on book( authorid );
+
+CREATE TABLE sequence
+( tablename varchar(10),
+sequence numeric);
+
+INSERT INTO author VALUES ( 0, 'Philip K', 'Dick' );
+INSERT INTO author VALUES ( 1, 'Robert', 'Heinlein' );
+INSERT INTO author VALUES ( 2, 'Sarah', 'Paretsky' );
+
+INSERT INTO book VALUES ( 0, 'The Man Who Japed', 6.99, 0, 'A good book' );
+INSERT INTO book VALUES ( 1, 'The Man in the High Castle', 9.99, 0, 'Worth reading' );
+INSERT INTO book VALUES ( 2, 'The Number of the Beast', 8.99, 1, 'Get this!' );
+INSERT INTO book VALUES ( 3, 'Indemnity Only', 9.99, 2, 'Cool' );
+INSERT INTO book VALUES ( 4, 'Burn Marks', 9.99, 2, 'Need to make notes' );
+INSERT INTO book VALUES ( 5, 'Deadlock', 9.99, 2, 'Hmmm..' );
+
+INSERT INTO sequence VALUES ( 'author', 2 );
+INSERT INTO sequence VALUES ( 'book', 5 );
diff --git a/examples/demo/sql/connect.ui b/examples/demo/sql/connect.ui
new file mode 100644
index 0000000..8031fd0
--- /dev/null
+++ b/examples/demo/sql/connect.ui
@@ -0,0 +1,244 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ConnectDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ConnectDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>303</width>
+ <height>247</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Connect...</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Connection settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>editDatabase</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Database Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboDatabase</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>editPassword</cstring>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Username:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editUsername</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>TextLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Password:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editPassword</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>comboDriver</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editUsername</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>editHostname</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hostname:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>editHostname</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>TextLabel5_2</cstring>
+ </property>
+ <property name="text">
+ <string>P&amp;ort:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>portSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="5" column="1">
+ <property name="name">
+ <cstring>portSpinBox</cstring>
+ </property>
+ <property name="specialValueText">
+ <string>Default</string>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>-1</number>
+ </property>
+ <property name="value">
+ <number>-1</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;river</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboDriver</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout25</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>comboDriver</tabstop>
+ <tabstop>editDatabase</tabstop>
+ <tabstop>editUsername</tabstop>
+ <tabstop>editPassword</tabstop>
+ <tabstop>editHostname</tabstop>
+ <tabstop>portSpinBox</tabstop>
+ <tabstop>PushButton1</tabstop>
+ <tabstop>PushButton2</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">connect.ui.h</include>
+</includes>
+<slots>
+ <slot>init()</slot>
+ <slot>destroy()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/demo/sql/connect.ui.h b/examples/demo/sql/connect.ui.h
new file mode 100644
index 0000000..da1c78f
--- /dev/null
+++ b/examples/demo/sql/connect.ui.h
@@ -0,0 +1,20 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include <qsqldatabase.h>
+
+void ConnectDialog::init()
+{
+ comboDriver->clear();
+ comboDriver->insertStringList( QSqlDatabase::drivers() );
+}
+
+void ConnectDialog::destroy()
+{
+
+}
diff --git a/examples/demo/sql/sqlex.ui b/examples/demo/sql/sqlex.ui
new file mode 100644
index 0000000..48a3605
--- /dev/null
+++ b/examples/demo/sql/sqlex.ui
@@ -0,0 +1,309 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>SqlEx</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SqlEx</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>654</width>
+ <height>438</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>vsplit</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>hsplit</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Tables</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Required</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lv</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <widget class="QDataTable">
+ <property name="name">
+ <cstring>dt</cstring>
+ </property>
+ <property name="frameworkCode" stdset="0">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>gb</cstring>
+ </property>
+ <property name="title">
+ <string>SQL Query</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout22</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>te</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>submitBtn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Submit</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>clearBtn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>C&amp;lear</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout23</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lbl</cstring>
+ </property>
+ <property name="text">
+ <string>Press "Connect" to open a database</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>conBtn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&amp;Connect...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>clearBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>te</receiver>
+ <slot>clear()</slot>
+ </connection>
+ <connection>
+ <sender>conBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlEx</receiver>
+ <slot>dbConnect()</slot>
+ </connection>
+ <connection>
+ <sender>lv</sender>
+ <signal>returnPressed(QListViewItem*)</signal>
+ <receiver>SqlEx</receiver>
+ <slot>showTable(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>lv</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>SqlEx</receiver>
+ <slot>showTable(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>submitBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>SqlEx</receiver>
+ <slot>execQuery()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">sqlex.ui.h</include>
+</includes>
+<slots>
+ <slot>init()</slot>
+ <slot>dbConnect()</slot>
+ <slot>execQuery()</slot>
+ <slot>showTable( QListViewItem * item )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/demo/sql/sqlex.ui.h b/examples/demo/sql/sqlex.ui.h
new file mode 100644
index 0000000..bad4059
--- /dev/null
+++ b/examples/demo/sql/sqlex.ui.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+#include <qsqldriver.h>
+#include <qmessagebox.h>
+#include <qsqldatabase.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qsqlerror.h>
+#include <qsqlcursor.h>
+#include <qsqlselectcursor.h>
+#include <qdatatable.h>
+#include "connect.h"
+
+static void showError( const QSqlError& err, QWidget* parent = 0 )
+{
+ QString errStr ( "The database reported an error\n" );
+ if ( !err.databaseText().isEmpty() )
+ errStr += err.databaseText();
+ if ( !err.driverText().isEmpty() )
+ errStr += err.driverText();
+ QMessageBox::warning( parent, "Error", errStr );
+}
+
+ConnectDialog* conDiag = 0;
+
+void SqlEx::init()
+{
+ hsplit->setResizeMode( lv, QSplitter::KeepSize );
+ vsplit->setResizeMode( gb, QSplitter::KeepSize );
+ submitBtn->setEnabled( FALSE );
+ conDiag = new ConnectDialog( this, "Connection Dialog", TRUE );
+}
+
+void SqlEx::dbConnect()
+{
+ if ( conDiag->exec() != QDialog::Accepted )
+ return;
+ if ( dt->sqlCursor() ) {
+ dt->setSqlCursor( 0 );
+ }
+ // close old connection (if any)
+ if ( QSqlDatabase::contains( "SqlEx" ) ) {
+ QSqlDatabase* oldDb = QSqlDatabase::database( "SqlEx" );
+ oldDb->close();
+ QSqlDatabase::removeDatabase( "SqlEx" );
+ }
+ // open the new connection
+ QSqlDatabase* db = QSqlDatabase::addDatabase( conDiag->comboDriver->currentText(), "SqlEx" );
+ if ( !db ) {
+ QMessageBox::warning( this, "Error", "Could not open database" );
+ return;
+ }
+ db->setHostName( conDiag->editHostname->text() );
+ db->setDatabaseName( conDiag->editDatabase->text() );
+ db->setPort( conDiag->portSpinBox->value() );
+ if ( !db->open( conDiag->editUsername->text(), conDiag->editPassword->text() ) ) {
+ showError( db->lastError(), this );
+ return;
+ }
+ lbl->setText( "Double-Click on a table-name to view the contents" );
+ lv->clear();
+
+ QStringList tables = db->tables();
+ for ( QStringList::Iterator it = tables.begin(); it != tables.end(); ++it ) {
+ QListViewItem* lvi = new QListViewItem( lv, *it );
+ QSqlRecordInfo ri = db->recordInfo ( *it );
+ for ( QSqlRecordInfo::Iterator it = ri.begin(); it != ri.end(); ++it ) {
+ QString req;
+ if ( (*it).isRequired() > 0 ) {
+ req = "Yes";
+ } else if ( (*it).isRequired() == 0 ) {
+ req = "No";
+ } else {
+ req = "?";
+ }
+ QListViewItem* fi = new QListViewItem( lvi, (*it).name(), + QVariant::typeToName( (*it).type() ), req );
+ lvi->insertItem( fi );
+ }
+ lv->insertItem( lvi );
+ }
+ submitBtn->setEnabled( TRUE );
+}
+
+void SqlEx::execQuery()
+{
+ // use a custom cursor to populate the data table
+ QSqlSelectCursor* cursor = new QSqlSelectCursor( te->text(), QSqlDatabase::database( "SqlEx", TRUE ) );
+ if ( cursor->isSelect() ) {
+ dt->setSqlCursor( cursor, TRUE, TRUE );
+ dt->setSort( QStringList() );
+ dt->refresh( QDataTable::RefreshAll );
+ QString txt( "Query OK" );
+ if ( cursor->size() >= 0 )
+ txt += ", returned rows: " + QString::number( cursor->size() );
+ lbl->setText( txt );
+ } else {
+ // an error occured if the cursor is not active
+ if ( !cursor->isActive() ) {
+ showError( cursor->lastError(), this );
+ } else {
+ lbl->setText( QString("Query OK, affected rows: %1").arg( cursor->numRowsAffected() ) );
+ }
+ }
+}
+
+void SqlEx::showTable( QListViewItem * item )
+{
+ // get the table name
+ QListViewItem* i = item->parent();
+ if ( !i ) {
+ i = item;
+ }
+
+ // populate the data table
+ QSqlCursor* cursor = new QSqlCursor( i->text( 0 ), TRUE, QSqlDatabase::database( "SqlEx", TRUE ) );
+ dt->setSqlCursor( cursor, TRUE, TRUE );
+ dt->setSort( cursor->primaryIndex() );
+ dt->refresh( QDataTable::RefreshAll );
+ lbl->setText( "Displaying table " + i->text( 0 ) );
+}
diff --git a/examples/demo/textdrawing/bidi.txt b/examples/demo/textdrawing/bidi.txt
new file mode 100644
index 0000000..7674ab0
--- /dev/null
+++ b/examples/demo/textdrawing/bidi.txt
@@ -0,0 +1,6 @@
+This page contains text in many languages, advertising the Tenth International Unicode Conference. The page is encoded using Unicode UTF-8 and to view it you need a Unicode-capable browser. If you don't have access to such a browser, you may want to visit the individual Web pages, each containing the text in a single language. The text on these Web pages was provided by volunteer translators (see the Credits page). If you would like to offer a language we don't yet have, or have a comment about one of the existing pages, please mail us.
+
+×ירופה, תוכנה וה×ינטרנט: Unicode ×™×•×¦× ×œ×©×•×§ העולמי הירשמו כעת לכנס Unicode הבינל×ומי העשירי, שייערך בין הת××¨×™×›×™× 12Ö¾10 במרץ 1997, במיינץ שבגרמניה. בכנס ישתתפו ×ž×•×ž×—×™× ×ž×›×œ ענפי התעשייה ×‘× ×•×©× ×”×ינטרנט העולמי וה־Unicode, בהת×מה לשוק הבינל×ומי והמקומי, ×‘×™×™×©×•× Unicode במערכות הפעלה וביישומי×, בגופני×, בפריסת טקסט ובמחשוב רב־לשוני. some english inbetween ×›×שר ×”×¢×•×œ× ×¨×•×¦×” לדבר, ×”×•× ×ž×“×‘×¨ ב־Unicode
+
+أوروبا, برمجيات الحاسوب + انترنيت : some english تصبح عالميا مع يونيكود more english تسجّل الآن لحضور المؤتمر الدولي العاشر ليونيكود, الذي سيعقد ÙÙŠ 10-12 آذار 1997 بمدينة ماينتس, ألمانيا. وسيجمع المؤتمر بين خبراء من كاÙØ© قطاعات الصناعة على الشبكة العالمية انترنيت ويونيكود, حيث ستتم, على الصعيدين الدولي والمحلي على حد سواء مناقشة سبل استخدام يونكود ÙÙŠ النظم القائمة ÙˆÙيما يخص التطبيقات الحاسوبية, الخطوط, تصميم النصوص والحوسبة متعددة اللغات. english عندما يريد العالم أن يتكلّم, Ùهو يتحدّث بلغة يونيكود. english...
+
diff --git a/examples/demo/textdrawing/editcopy.png b/examples/demo/textdrawing/editcopy.png
new file mode 100644
index 0000000..2f931cb
--- /dev/null
+++ b/examples/demo/textdrawing/editcopy.png
Binary files differ
diff --git a/examples/demo/textdrawing/editcut.png b/examples/demo/textdrawing/editcut.png
new file mode 100644
index 0000000..54c8e14
--- /dev/null
+++ b/examples/demo/textdrawing/editcut.png
Binary files differ
diff --git a/examples/demo/textdrawing/editdelete.png b/examples/demo/textdrawing/editdelete.png
new file mode 100644
index 0000000..9f0491d
--- /dev/null
+++ b/examples/demo/textdrawing/editdelete.png
Binary files differ
diff --git a/examples/demo/textdrawing/editlower.png b/examples/demo/textdrawing/editlower.png
new file mode 100644
index 0000000..50605f2
--- /dev/null
+++ b/examples/demo/textdrawing/editlower.png
Binary files differ
diff --git a/examples/demo/textdrawing/editpaste.png b/examples/demo/textdrawing/editpaste.png
new file mode 100644
index 0000000..b1b7f85
--- /dev/null
+++ b/examples/demo/textdrawing/editpaste.png
Binary files differ
diff --git a/examples/demo/textdrawing/editraise.png b/examples/demo/textdrawing/editraise.png
new file mode 100644
index 0000000..f157251
--- /dev/null
+++ b/examples/demo/textdrawing/editraise.png
Binary files differ
diff --git a/examples/demo/textdrawing/example.html b/examples/demo/textdrawing/example.html
new file mode 100644
index 0000000..b538002
--- /dev/null
+++ b/examples/demo/textdrawing/example.html
@@ -0,0 +1,340 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head>
+<title>Qt Toolkit - QLabel Class</title><style type="text/css"><!--
+h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
+a:link { color: #004faf; text-decoration: none }
+a:visited { color: #672967; text-decoration: none }body { background: white; color: black; }
+--></style>
+</head><body bgcolor="#ffffff">
+
+<h1 align=center>QLabel Class Reference</h1><br clear="all">
+<p>
+The QLabel widget provides a static information display
+<a href="#details">More...</a>
+<p>
+<code>#include &lt;<a href="qlabel-h.html">qlabel.h</a>&gt;</code>
+<p>
+Inherits <a href="qframe.html">QFrame</a>.
+<p><a href="qlabel-members.html">List of all member functions.</a>
+<h2>Public Members</h2>
+<ul>
+<li><div class="fn"><a href="#39107d"><b>QLabel</b></a> ( QWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#2bafbb"><b>QLabel</b></a> ( const QString &amp; text, QWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#5514c7"><b>QLabel</b></a> ( QWidget * buddy, const QString &amp;, QWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#9958af"><b>~QLabel</b></a> () </div>
+<li><div class="fn">QString <a href="#72cf09"><b>text</b></a> () const</div>
+<li><div class="fn">QPixmap* <a href="#101ecb"><b>pixmap</b></a> () const</div>
+<li><div class="fn">QMovie* <a href="#7dcdfe"><b>movie</b></a> () const</div>
+<li><div class="fn">TextFormat <a href="#0b92ed"><b>textFormat</b></a> () const</div>
+<li><div class="fn">void <a href="#5de3f9"><b>setTextFormat</b></a> ( TextFormat ) </div>
+<li><div class="fn">int <a href="#2fcaa3"><b>alignment</b></a> () const</div>
+<li><div class="fn">virtual void <a href="#1f406e"><b>setAlignment</b></a> ( int ) </div>
+<li><div class="fn">int <a href="#e3c907"><b>indent</b></a> () const</div>
+<li><div class="fn">void <a href="#ed9b8b"><b>setIndent</b></a> ( int ) </div>
+<li><div class="fn">bool autoResize () const <em>(obsolete)</em></div>
+<li><div class="fn">virtual void setAutoResize ( bool ) <em>(obsolete)</em></div>
+<li><div class="fn">bool <a href="#7e1f73"><b>hasScaledContents</b></a> () const</div>
+<li><div class="fn">void <a href="#e9e3cf"><b>setScaledContents</b></a> ( bool ) </div>
+<li><div class="fn">virtual void <a href="#191701"><b>setBuddy</b></a> ( QWidget * ) </div>
+<li><div class="fn">QWidget* <a href="#123954"><b>buddy</b></a> () const</div>
+</ul>
+<h2>Public Slots</h2>
+<ul>
+<li><div class="fn">virtual void <a href="#dffb43"><b>setText</b></a> ( const QString &amp; ) </div>
+<li><div class="fn">virtual void <a href="#f3f301"><b>setPixmap</b></a> ( const QPixmap &amp; ) </div>
+<li><div class="fn">virtual void <a href="#60de9f"><b>setMovie</b></a> ( const QMovie &amp; ) </div>
+<li><div class="fn">virtual void <a href="#301e3c"><b>setNum</b></a> ( int ) </div>
+<li><div class="fn">virtual void <a href="#1a8f6a"><b>setNum</b></a> ( double ) </div>
+<li><div class="fn">void <a href="#be73f3"><b>clear</b></a> () </div>
+</ul>
+<h2>Protected Members</h2>
+<ul>
+<li><div class="fn">virtual void <a href="#fac264"><b>drawContents</b></a> ( QPainter * ) </div>
+<li><div class="fn">virtual void <a href="#479dd2"><b>drawContentsMask</b></a> ( QPainter * ) </div>
+</ul>
+<h2>Properties</h2>
+<table border=1 cellpadding=3 cellspacing=0>
+<tr><th>Type<th>Name<th>READ<th>WRITE<th>Options
+<tr><td>QString<td>text<td>text<td>setText<td>&nbsp;
+<tr><td>TextFormat<td>textFormat<td>textFormat<td>setTextFormat<td>&nbsp;
+<tr><td>QPixmap<td>pixmap<td>pixmap<td>setPixmap<td>&nbsp;
+<tr><td>bool<td>scaledContents<td>hasScaledContents<td>setScaledContents<td>&nbsp;
+<tr><td>Alignment<td>alignment<td>alignment<td>setAlignment<td>&nbsp;
+<tr><td>int<td>indent<td>indent<td>setIndent<td>&nbsp;
+</table>
+<p>
+<hr><h2><a name="details"></a>Detailed Description</h2>
+The QLabel widget provides a static information display
+<p>
+QLabel is used for displaying information in the form of text or
+image to the user. No user interaction functionality is
+provided. The visual appearance of the label can be configured in
+various ways, and it can be used for specifying a focus accelerator
+key for another widget.
+<p>A QLabel can contain any of the following content types:
+<ul>
+<li> A plain text: set by passing a <a href="qstring.html">QString</a> to <a href="#dffb43">setText</a>().
+<li> A rich text: set by passing a QString that contains a rich text to setText().
+<li> A pixmap: set by passing a <a href="qpixmap.html">QPixmap</a> to <a href="#f3f301">setPixmap</a>().
+<li> A movie: set by passing a <a href="qmovie.html">QMovie</a> to <a href="#60de9f">setMovie</a>().
+<li> A number: set by passing an <em>int</em> or a <em>double</em> to <a href="#1a8f6a">setNum</a>(), which converts the number to plain text.
+<li> Nothing: The same as an empty plain text. This is the default. Set by <a href="#be73f3">clear</a>().
+</ul>
+<p>When the content is changed using any of these functions, any
+previous content is cleared.
+<p>The look of a QLabel can be tuned in several ways. All the settings
+of <a href="qframe.html">QFrame</a> are available for specifying a widget frame. The
+positioning of the content within the QLabel widget area can be
+tuned with <a href="#1f406e">setAlignment</a>() and <a href="#ed9b8b">setIndent</a>(). For example, this code
+sets up a sunken panel with a two-line text in the bottom right
+corner (both lines being flush with the right side of the label):
+<p><pre> <a href="qlabel.html">QLabel</a> *label = new <a href="qlabel.html">QLabel</a>;
+ label-&gt;<a href="qframe.html#c0d758">setFrameStyle</a>( QFrame::Panel | QFrame::Sunken );
+ label-&gt;<a href="#dffb43">setText</a>( "first line\nsecond line" );
+ label-&gt;<a href="#1f406e">setAlignment</a>( AlignBottom | AlignRight );
+</pre>
+<p>A QLabel is often used as a label for another, interactive
+widget. For this use, QLabel provides a handy mechanism for adding
+an accelerator key (see <a href="qaccel.html">QAccel</a>) that will set the keyboard focus to
+the other widget (called the QLabel's "buddy"). Example:
+<p><pre> <a href="qlineedit.html">QLineEdit</a>* phoneEdit = new <a href="qlineedit.html">QLineEdit</a>( this, "phoneEdit" );
+ <a href="qlabel.html">QLabel</a>* phoneLabel = new <a href="qlabel.html">QLabel</a>( phoneEdit, "&amp;Phone:", this, "phoneLabel" );
+</pre>
+<p>In this example, keyboard focus is transferred to the label's buddy
+(the <a href="qlineedit.html">QLineEdit</a>) when the user presses <dfn>Alt-P.</dfn> You can also
+use the <a href="#191701">setBuddy</a>() function to accomplish the same.
+<p>
+<p>See also <a href="qlineedit.html">QLineEdit</a>, <a href="qtextview.html">QTextView</a>, <a href="qpixmap.html">QPixmap</a>, <a href="qmovie.html">QMovie</a> and <a href="guibooks.html#fowler">GUI Design Handbook: Label</a>
+<p>Examples:
+ <a href="cursor-cursor-cpp.html#QLabel">cursor/cursor.cpp</a>
+ <a href="layout-layout-cpp.html#QLabel">layout/layout.cpp</a>
+ <a href="popup-popup-cpp.html#QLabel">popup/popup.cpp</a>
+ <a href="menu-menu-cpp.html#QLabel">menu/menu.cpp</a>
+ <a href="progress-progress-cpp.html#QLabel">progress/progress.cpp</a>
+ <a href="qmag-qmag-cpp.html#QLabel">qmag/qmag.cpp</a>
+ <a href="movies-main-cpp.html#QLabel">movies/main.cpp</a>
+ <a href="customlayout-main-cpp.html#QLabel">customlayout/main.cpp</a>
+
+<hr><h2>Member Function Documentation</h2>
+<h3 class="fn"><a name="5514c7"></a>QLabel::QLabel ( <a href="qwidget.html">QWidget</a> * buddy, const <a href="qstring.html">QString</a> &amp; text, <a href="qwidget.html">QWidget</a> * parent, const char * name=0, WFlags f=0 )</h3>
+<p>Constructs a label with a text and a buddy.
+<p>The <em>text</em> is set with <a href="#dffb43">setText</a>(). The <em>buddy</em> is set with <a href="#191701">setBuddy</a>().
+<p>The <em>parent, name</em> and <em>f</em> arguments are passed to the <a href="qframe.html">QFrame</a>
+constructor.
+<p>See also <a href="#dffb43">setText</a>(), <a href="#191701">setBuddy</a>(), <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#c0d758">setFrameStyle</a>() and <a href="#ed9b8b">setIndent</a>().
+<h3 class="fn"><a name="39107d"></a>QLabel::QLabel ( <a href="qwidget.html">QWidget</a> * parent, const char * name=0, WFlags f=0 )</h3>
+<p>Constructs an empty label.
+<p>The <em>parent, name</em> and <em>f</em> arguments are passed to the <a href="qframe.html">QFrame</a>
+constructor.
+<p>See also <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#c0d758">setFrameStyle</a>() and <a href="#ed9b8b">setIndent</a>().
+<h3 class="fn"><a name="2bafbb"></a>QLabel::QLabel ( const <a href="qstring.html">QString</a> &amp; text, <a href="qwidget.html">QWidget</a> * parent, const char * name=0, WFlags f=0 )</h3>
+<p>Constructs a label with a text. The <em>text</em> is set with <a href="#dffb43">setText</a>().
+<p>The <em>parent, name</em> and <em>f</em> arguments are passed to the <a href="qframe.html">QFrame</a>
+constructor.
+<p>See also <a href="#dffb43">setText</a>(), <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#c0d758">setFrameStyle</a>() and <a href="#ed9b8b">setIndent</a>().
+<h3 class="fn"><a name="9958af"></a>QLabel::~QLabel ()</h3>
+<p>Destructs the label.
+<h3 class="fn">int <a name="2fcaa3"></a>QLabel::alignment () const</h3>
+<p>Returns the alignment setting.
+<p>See also <a href="#1f406e">setAlignment</a>().
+<h3 class="fn">bool <a name="75b2a1"></a>QLabel::autoResize () const</h3>
+<p><b>This function is obsolete.</b> It is provided to keep old source working, and will probably be removed in a future version of Qt. We strongly advise against using it in new code.<p>
+<p>Returns TRUE if auto-resizing is enabled, or FALSE if auto-resizing
+is disabled.
+<p>Auto-resizing is disabled by default.
+<p>See also <a href="#c0e104">setAutoResize</a>().
+<h3 class="fn"><a href="qwidget.html">QWidget</a> * <a name="123954"></a>QLabel::buddy () const</h3>
+<p>Returns the buddy of this label, or 0 if no buddy is currently set.
+<p>See also <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="be73f3"></a>QLabel::clear () <code>[slot]</code></h3>
+<p>Clears any label contents. Equivalent with <a href="#dffb43">setText</a>( "" ).
+<h3 class="fn">void <a name="fac264"></a>QLabel::drawContents ( <a href="qpainter.html">QPainter</a> * p ) <code>[virtual protected]</code></h3>
+<p>Draws the label contents using the painter <em>p.</em>
+<p>Reimplemented from <a href="qframe.html#99e687">QFrame.</a>
+<h3 class="fn">void <a name="479dd2"></a>QLabel::drawContentsMask ( <a href="qpainter.html">QPainter</a> * p ) <code>[virtual protected]</code></h3>
+<p>Draws the label contents mask using the painter <em>p.</em>
+Used only in transparent mode.
+<p>See also <a href="qwidget.html#c7a335">QWidget::setAutoMask</a>();.
+<p>Reimplemented from <a href="qframe.html#4cbf11">QFrame.</a>
+<h3 class="fn">void <a name="0435a2"></a>QLabel::fontChange ( const <a href="qfont.html">QFont</a> &amp; ) <code>[virtual protected]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#570a8f">QWidget.</a>
+<h3 class="fn">bool <a name="7e1f73"></a>QLabel::hasScaledContents () const</h3>
+<p>Returns whether the label will scale its contents to fill all
+available space.
+<p>See also <a href="#e9e3cf">setScaledContents</a>().
+<h3 class="fn">int <a name="dae451"></a>QLabel::heightForWidth ( int w ) const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#2e8476">QWidget.</a>
+<h3 class="fn">int <a name="e3c907"></a>QLabel::indent () const</h3>
+<p>Returns the indent of the label.
+<p>See also <a href="#ed9b8b">setIndent</a>().
+<h3 class="fn"><a href="qsize.html">QSize</a> <a name="53c8c7"></a>QLabel::minimumSizeHint () const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#3f0fc2">QWidget.</a>
+<h3 class="fn"><a href="qmovie.html">QMovie</a>* <a name="7dcdfe"></a>QLabel::movie () const</h3>
+<p>If the label contains a movie, returns a pointer to it. Otherwise,
+returns 0.
+<p>See also <a href="#60de9f">setMovie</a>().
+<h3 class="fn"><a href="qpixmap.html">QPixmap</a> * <a name="101ecb"></a>QLabel::pixmap () const</h3>
+<p>If the label contains a pixmap, returns a pointer to it. Otherwise,
+returns 0.
+<p>See also <a href="#f3f301">setPixmap</a>().
+<h3 class="fn">void <a name="3cb6e7"></a>QLabel::resizeEvent ( <a href="qresizeevent.html">QResizeEvent</a> * e ) <code>[virtual protected]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#28c156">QWidget.</a>
+<h3 class="fn">void <a name="1f406e"></a>QLabel::setAlignment ( int alignment ) <code>[virtual]</code></h3>
+<p>Sets the alignment of the label contents.
+<p>The <em>alignment</em> must be a bitwise OR of <a href="qt.html#AlignmentFlags">Qt::AlignmentFlags</a>
+values. The <code>WordBreak, ExpandTabs, SingleLine</code> and <code>ShowPrefix</code> flags apply only if the label contains a plain text, and
+are otherwise ignored. The <code>DontClip</code> flag is always ignored.
+<p>If the label has a buddy, the <code>ShowPrefix</code> flag is forced to TRUE.
+<p>The default alignment is <code>AlignLeft | AlignVCenter |
+ExpandTabs</code> if the label doesn't have a buddy and
+<code>AlignLeft | AlignVCenter | ExpandTabs | ShowPrefix </code> if
+the label has a buddy.
+<p>See also <a href="qt.html#AlignmentFlags">Qt::AlignmentFlags</a>, <a href="#2fcaa3">alignment</a>(), <a href="#191701">setBuddy</a>() and <a href="#dffb43">setText</a>().
+<p>Examples:
+ <a href="cursor-cursor-cpp.html#setAlignment">cursor/cursor.cpp</a>
+ <a href="layout-layout-cpp.html#setAlignment">layout/layout.cpp</a>
+ <a href="popup-popup-cpp.html#setAlignment">popup/popup.cpp</a>
+ <a href="qmag-qmag-cpp.html#setAlignment">qmag/qmag.cpp</a>
+ <a href="customlayout-main-cpp.html#setAlignment">customlayout/main.cpp</a>
+<h3 class="fn">void <a name="1b6d73"></a>QLabel::setAutoMask ( bool b ) <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#c7a335">QWidget.</a>
+<h3 class="fn">void <a name="c0e104"></a>QLabel::setAutoResize ( bool enable ) <code>[virtual]</code></h3>
+<p><b>This function is obsolete.</b> It is provided to keep old source working, and will probably be removed in a future version of Qt. We strongly advise against using it in new code.<p>
+Enables auto-resizing if <em>enable</em> is TRUE, or disables it if <em>enable</em> is FALSE.
+<p>When auto-resizing is enabled, the label will resize itself to fit
+the contents whenever the contents change. The top left corner is
+not moved. This is useful for QLabel widgets that are not managed by
+a <a href="qlayout.html">QLayout</a> (e.g. top-level widgets).
+<p>Auto-resizing is disabled by default.
+<p>See also <a href="#75b2a1">autoResize</a>(), <a href="qwidget.html#ab3108">adjustSize</a>() and <a href="#614dd5">sizeHint</a>().
+<h3 class="fn">void <a name="191701"></a>QLabel::setBuddy ( <a href="qwidget.html">QWidget</a> * buddy ) <code>[virtual]</code></h3>
+<p>Sets the buddy of this label to <em>buddy.</em>
+<p>When the user presses the accelerator key indicated by this label,
+the keyboard focus is transferred to the label's buddy widget.
+<p>The buddy mechanism is only available for QLabels that contain a
+plain text in which one letter is prefixed with '&'. It is this
+letter that is set as the accelerator key. The letter is displayed
+underlined, and the '&' is not displayed (i.e. the <code>ShowPrefix</code>
+alignment flag is turned on; see <a href="#1f406e">setAlignment</a>()).
+<p>In a dialog, you might create two data entry widgets and a label for
+each, and set up the geometry layout so each label is just to the
+left of its data entry widget (its "buddy"), somewhat like this:
+<p><pre> <a href="qlineedit.html">QLineEdit</a> *nameEd = new <a href="qlineedit.html">QLineEdit</a>( this );
+ <a href="qlabel.html">QLabel</a> *nameLb = new <a href="qlabel.html">QLabel</a>( "&amp;Name:", this );
+ nameLb-&gt;<a href="#191701">setBuddy</a>( nameEd );
+ <a href="qlineedit.html">QLineEdit</a> *phoneEd = new <a href="qlineedit.html">QLineEdit</a>( this );
+ <a href="qlabel.html">QLabel</a> *phoneLb = new <a href="qlabel.html">QLabel</a>( "&amp;Phone:", this );
+ phoneLb-&gt;<a href="#191701">setBuddy</a>( phoneEd );
+ // ( layout setup not shown )
+</pre>
+<p>With the code above, the focus jumps to the Name field when the user
+presses Alt-N, and to the Phone field when the user presses Alt-P.
+<p>To unset a previously set buddy, call this function with <em>buddy</em>
+set to 0.
+<p>See also <a href="#123954">buddy</a>(), <a href="#dffb43">setText</a>(), <a href="qaccel.html">QAccel</a> and <a href="#1f406e">setAlignment</a>().
+<p>Examples:
+ <a href="layout-layout-cpp.html#setBuddy">layout/layout.cpp</a>
+<h3 class="fn">void <a name="ed9b8b"></a>QLabel::setIndent ( int indent )</h3>
+<p>Sets the indent of the label to <em>indent</em> pixels.
+<p>The indent applies to the left edge if <a href="#2fcaa3">alignment</a>() is <code>AlignLeft,</code>
+to the right edge if alignment() is <code>AlignRight,</code> to the top edge
+if alignment() is <code>AlignTop,</code> and to to the bottom edge if
+alignment() is <code>AlignBottom.</code>
+<p>If <em>indent</em> is negative, or if no indent has been set, the label
+computes the effective indent as follows: If <a href="qframe.html#e0ccef">frameWidth</a>() is 0, the
+effective indent becomes 0. If frameWidth() is greater than 0, the
+effective indent becomes half the width of the "x" character of the
+widget's current <a href="qwidget.html#3a7237">font</a>().
+<p>If <em>indent</em> is non-negative, the effective indent is <em>indent</em>
+pixels.
+<p>See also <a href="#e3c907">indent</a>(), <a href="#1f406e">setAlignment</a>(), <a href="qframe.html#e0ccef">frameWidth</a>() and <a href="qwidget.html#3a7237">font</a>().
+<p>Examples:
+ <a href="movies-main-cpp.html#setIndent">movies/main.cpp</a>
+<h3 class="fn">void <a name="60de9f"></a>QLabel::setMovie ( const <a href="qmovie.html">QMovie</a> &amp; movie ) <code>[virtual slot]</code></h3>
+<p>Sets the label contents to <em>movie.</em> Any previous content is cleared.
+<p>The buddy accelerator, if any, is disabled.
+<p>The label resizes itself if auto-resizing is enabled.
+<p>See also <a href="#7dcdfe">movie</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="1a8f6a"></a>QLabel::setNum ( double num ) <code>[virtual slot]</code></h3>
+<p>Sets the label contents to a plain text containing the printed value
+of <em>num.</em> Does nothing if this is equal to the current contents of
+the label. Any previous content is cleared.
+<p>The buddy accelerator, if any, is disabled.
+<p>The label resizes itself if auto-resizing is enabled.
+<p>See also <a href="#dffb43">setText</a>(), <a href="qstring.html#01d80b">QString::setNum</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="301e3c"></a>QLabel::setNum ( int num ) <code>[virtual slot]</code></h3>
+<p>Sets the label contents to a plain text containing the printed value
+of <em>num.</em> Does nothing if this is equal to the current contents of
+the label. Any previous content is cleared.
+<p>The buddy accelerator, if any, is disabled.
+<p>The label resizes itself if auto-resizing is enabled.
+<p>See also <a href="#dffb43">setText</a>(), <a href="qstring.html#01d80b">QString::setNum</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="f3f301"></a>QLabel::setPixmap ( const <a href="qpixmap.html">QPixmap</a> &amp; pixmap ) <code>[virtual slot]</code></h3>
+<p>Sets the label contents to <em>pixmap.</em> Any previous content is cleared.
+<p>The buddy accelerator, if any, is disabled.
+<p>The label resizes itself if auto-resizing is enabled.
+<p>See also <a href="#101ecb">pixmap</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="e9e3cf"></a>QLabel::setScaledContents ( bool enable )</h3>
+<p>When called with <em>enable</em> == TRUE, and the label shows a pixmap,
+it will scale the pixmap to fill available space.
+<p>See also <a href="#7e1f73">hasScaledContents</a>().
+<h3 class="fn">void <a name="dffb43"></a>QLabel::setText ( const <a href="qstring.html">QString</a> &amp; text ) <code>[virtual slot]</code></h3>
+<p>Sets the label contents to <em>text,</em> or does nothing if <em>text</em> is
+equal to the current contents of the label. Any previous content is
+cleared.
+<p><em>text</em> will be interpreted either as a plain text or as a rich
+text, depending on the text format setting; see <a href="#5de3f9">setTextFormat</a>(). The
+default setting is <code>AutoText,</code> i.e. QLabel will try to auto-detect
+the format of <em>text.</em>
+<p>If <em>text</em> is interpreted as a plain text, and a buddy has been set,
+the buddy accelerator key is updated from the new text.
+<p>The label resizes itself if auto-resizing is enabled.
+<p>Note that Qlabel is well suited to display small rich text documents
+only. For large documents, use <a href="qtextview.html">QTextView</a> instead. It will flicker
+less on resize and can also provide a scrollbar if necessary.
+<p>See also <a href="#72cf09">text</a>(), <a href="#5de3f9">setTextFormat</a>(), <a href="#191701">setBuddy</a>() and <a href="#1f406e">setAlignment</a>().
+<p>Examples:
+ <a href="cursor-cursor-cpp.html#setText">cursor/cursor.cpp</a>
+ <a href="layout-layout-cpp.html#setText">layout/layout.cpp</a>
+ <a href="popup-popup-cpp.html#setText">popup/popup.cpp</a>
+ <a href="qmag-qmag-cpp.html#setText">qmag/qmag.cpp</a>
+ <a href="customlayout-main-cpp.html#setText">customlayout/main.cpp</a>
+<h3 class="fn">void <a name="5de3f9"></a>QLabel::setTextFormat ( <a href="qt.html#TextFormat">Qt::TextFormat</a> format )</h3>
+<p>Sets the text format to <em>format.</em> See the <a href="qt.html#TextFormat">Qt::TextFormat</a> enum for
+an explanation of the possible options.
+<p>The default format is <code>AutoText.</code>
+<p>See also <a href="#0b92ed">textFormat</a>() and <a href="#dffb43">setText</a>().
+<h3 class="fn"><a href="qsize.html">QSize</a> <a name="614dd5"></a>QLabel::sizeHint () const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Examples:
+ <a href="layout-layout-cpp.html#sizeHint">layout/layout.cpp</a>
+<p>Reimplemented from <a href="qwidget.html#290bcd">QWidget.</a>
+<h3 class="fn"><a href="qsizepolicy.html">QSizePolicy</a> <a name="26e1d9"></a>QLabel::sizePolicy () const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#2d5d13">QWidget.</a>
+<h3 class="fn"><a href="qstring.html">QString</a> <a name="72cf09"></a>QLabel::text () const</h3>
+<p>Returns the label text. If the content is a plain or a rich text,
+this is the string that was passed to <a href="#dffb43">setText</a>(). Otherwise, it is an
+empty/null string.
+<p>See also <a href="#dffb43">setText</a>(), <a href="#1a8f6a">setNum</a>() and <a href="#be73f3">clear</a>().
+<h3 class="fn">Qt::TextFormat <a name="0b92ed"></a>QLabel::textFormat() const</h3>
+<p>Returns the current text format.
+<p>See also <a href="#5de3f9">setTextFormat</a>().
+<hr><p>
+Search the documentation, FAQ, qt-interest archive and more (uses
+<a href="http://www.trolltech.com">www.trolltech.com</a>):<br>
+<form method=post action="http://www.trolltech.com/search.cgi">
+<input type=hidden name="version" value="3.0.0-snapshot"><nobr>
+<input size="50" name="search"><input type=submit value="Search">
+</nobr></form><hr><p>
+This file is part of the <a href="index.html">Qt toolkit</a>,
+copyright &copy; 1995-2006
+<a href="http://www.trolltech.com">Trolltech</a>, all rights reserved.<p><address><hr><div align="center">
+<table width="100%" cellspacing="0" border="0"><tr>
+<td>Copyright © 2006 Trolltech<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
+<td align="right"><div align="right">Qt version 3.0.0-snapshot</div>
+</table></div></address></body></html>
diff --git a/examples/demo/textdrawing/filenew.png b/examples/demo/textdrawing/filenew.png
new file mode 100644
index 0000000..be963bf
--- /dev/null
+++ b/examples/demo/textdrawing/filenew.png
Binary files differ
diff --git a/examples/demo/textdrawing/fileopen.png b/examples/demo/textdrawing/fileopen.png
new file mode 100644
index 0000000..6077b81
--- /dev/null
+++ b/examples/demo/textdrawing/fileopen.png
Binary files differ
diff --git a/examples/demo/textdrawing/filesave.png b/examples/demo/textdrawing/filesave.png
new file mode 100644
index 0000000..a1cb03d
--- /dev/null
+++ b/examples/demo/textdrawing/filesave.png
Binary files differ
diff --git a/examples/demo/textdrawing/help.png b/examples/demo/textdrawing/help.png
new file mode 100644
index 0000000..2ab2c25
--- /dev/null
+++ b/examples/demo/textdrawing/help.png
Binary files differ
diff --git a/examples/demo/textdrawing/helpwindow.cpp b/examples/demo/textdrawing/helpwindow.cpp
new file mode 100644
index 0000000..9fa0e7b
--- /dev/null
+++ b/examples/demo/textdrawing/helpwindow.cpp
@@ -0,0 +1,337 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "helpwindow.h"
+#include <qstatusbar.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qiconset.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qstylesheet.h>
+#include <qmessagebox.h>
+#include <qfiledialog.h>
+#include <qapplication.h>
+#include <qcombobox.h>
+#include <qevent.h>
+#include <qlineedit.h>
+#include <qobjectlist.h>
+#include <qfileinfo.h>
+#include <qfile.h>
+#include <qdatastream.h>
+#include <qprinter.h>
+#include <qsimplerichtext.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+
+#include <ctype.h>
+
+HelpWindow::HelpWindow( const QString& home_, const QString& _path,
+ QWidget* parent, const char *name )
+ : QMainWindow( parent, name, WDestructiveClose ),
+ pathCombo( 0 ), selectedURL()
+{
+ readHistory();
+ readBookmarks();
+
+ browser = new QTextBrowser( this );
+ browser->mimeSourceFactory()->setFilePath( _path );
+ browser->setFrameStyle( QFrame::Panel | QFrame::Sunken );
+ connect( browser, SIGNAL( textChanged() ),
+ this, SLOT( textChanged() ) );
+
+ setCentralWidget( browser );
+
+ if ( !home_.isEmpty() )
+ browser->setSource( home_ );
+
+ connect( browser, SIGNAL( highlighted( const QString&) ),
+ statusBar(), SLOT( message( const QString&)) );
+
+ resize( 640,700 );
+
+ QPopupMenu* file = new QPopupMenu( this );
+ file->insertItem( tr("&New Window"), this, SLOT( newWindow() ), ALT | Key_N );
+ file->insertItem( tr("&Open File"), this, SLOT( openFile() ), ALT | Key_O );
+ file->insertItem( tr("&Print"), this, SLOT( print() ), ALT | Key_P );
+
+ // The same three icons are used twice each.
+ QIconSet icon_back( QPixmap("textdrawing/previous.png") );
+ QIconSet icon_forward( QPixmap("textdrawing/next.png") );
+ QIconSet icon_home( QPixmap("textdrawing/home.png") );
+
+ QPopupMenu* go = new QPopupMenu( this );
+ backwardId = go->insertItem( icon_back,
+ tr("&Backward"), browser, SLOT( backward() ),
+ ALT | Key_Left );
+ forwardId = go->insertItem( icon_forward,
+ tr("&Forward"), browser, SLOT( forward() ),
+ ALT | Key_Right );
+ go->insertItem( icon_home, tr("&Home"), browser, SLOT( home() ) );
+
+ hist = new QPopupMenu( this );
+ QStringList::Iterator it = history.begin();
+ for ( ; it != history.end(); ++it )
+ mHistory[ hist->insertItem( *it ) ] = *it;
+ connect( hist, SIGNAL( activated( int ) ),
+ this, SLOT( histChosen( int ) ) );
+
+ bookm = new QPopupMenu( this );
+ bookm->insertItem( tr( "Add Bookmark" ), this, SLOT( addBookmark() ) );
+ bookm->insertSeparator();
+
+ QStringList::Iterator it2 = bookmarks.begin();
+ for ( ; it2 != bookmarks.end(); ++it2 )
+ mBookmarks[ bookm->insertItem( *it2 ) ] = *it2;
+ connect( bookm, SIGNAL( activated( int ) ),
+ this, SLOT( bookmChosen( int ) ) );
+
+ menuBar()->insertItem( tr("&File"), file );
+ menuBar()->insertItem( tr("&Go"), go );
+ menuBar()->insertItem( tr( "History" ), hist );
+ menuBar()->insertItem( tr( "Bookmarks" ), bookm );
+
+ menuBar()->setItemEnabled( forwardId, FALSE);
+ menuBar()->setItemEnabled( backwardId, FALSE);
+ connect( browser, SIGNAL( backwardAvailable( bool ) ),
+ this, SLOT( setBackwardAvailable( bool ) ) );
+ connect( browser, SIGNAL( forwardAvailable( bool ) ),
+ this, SLOT( setForwardAvailable( bool ) ) );
+
+
+ QToolBar* toolbar = new QToolBar( this );
+ addToolBar( toolbar, "Toolbar");
+ QToolButton* button;
+
+ button = new QToolButton( icon_back, tr("Backward"), "", browser, SLOT(backward()), toolbar );
+ connect( browser, SIGNAL( backwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+ button->setEnabled( FALSE );
+ button = new QToolButton( icon_forward, tr("Forward"), "", browser, SLOT(forward()), toolbar );
+ connect( browser, SIGNAL( forwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+ button->setEnabled( FALSE );
+ button = new QToolButton( icon_home, tr("Home"), "", browser, SLOT(home()), toolbar );
+
+ toolbar->addSeparator();
+
+ pathCombo = new QComboBox( TRUE, toolbar );
+ connect( pathCombo, SIGNAL( activated( const QString & ) ),
+ this, SLOT( pathSelected( const QString & ) ) );
+ toolbar->setStretchableWidget( pathCombo );
+ setRightJustification( TRUE );
+ setDockEnabled( DockLeft, FALSE );
+ setDockEnabled( DockRight, FALSE );
+
+ pathCombo->insertItem( home_ );
+
+ browser->setFocus();
+}
+
+
+void HelpWindow::setBackwardAvailable( bool b)
+{
+ menuBar()->setItemEnabled( backwardId, b);
+}
+
+void HelpWindow::setForwardAvailable( bool b)
+{
+ menuBar()->setItemEnabled( forwardId, b);
+}
+
+
+void HelpWindow::textChanged()
+{
+ if ( browser->documentTitle().isNull() )
+ setCaption( browser->context() );
+ else
+ setCaption( browser->documentTitle() ) ;
+
+ selectedURL = caption();
+ if ( !selectedURL.isEmpty() && pathCombo ) {
+ bool exists = FALSE;
+ int i;
+ for ( i = 0; i < pathCombo->count(); ++i ) {
+ if ( pathCombo->text( i ) == selectedURL ) {
+ exists = TRUE;
+ break;
+ }
+ }
+ if ( !exists ) {
+ pathCombo->insertItem( selectedURL, 0 );
+ pathCombo->setCurrentItem( 0 );
+ mHistory[ hist->insertItem( selectedURL ) ] = selectedURL;
+ } else
+ pathCombo->setCurrentItem( i );
+ selectedURL = QString::null;
+ }
+}
+
+HelpWindow::~HelpWindow()
+{
+ history.clear();
+ QMap<int, QString>::Iterator it = mHistory.begin();
+ for ( ; it != mHistory.end(); ++it )
+ history.append( *it );
+
+ QFile f( QDir::currentDirPath() + "/.history" );
+ f.open( IO_WriteOnly );
+ QDataStream s( &f );
+ s << history;
+ f.close();
+
+ bookmarks.clear();
+ QMap<int, QString>::Iterator it2 = mBookmarks.begin();
+ for ( ; it2 != mBookmarks.end(); ++it2 )
+ bookmarks.append( *it2 );
+
+ QFile f2( QDir::currentDirPath() + "/.bookmarks" );
+ f2.open( IO_WriteOnly );
+ QDataStream s2( &f2 );
+ s2 << bookmarks;
+ f2.close();
+}
+
+void HelpWindow::about()
+{
+ QMessageBox::about( this, "HelpViewer Example",
+ "<p>This example implements a simple HTML help viewer "
+ "using Qt's rich text capabilities</p>"
+ "<p>It's just about 100 lines of C++ code, so don't expect too much :-)</p>"
+ );
+}
+
+
+void HelpWindow::aboutQt()
+{
+ QMessageBox::aboutQt( this, "QBrowser" );
+}
+
+void HelpWindow::openFile()
+{
+#ifndef QT_NO_FILEDIALOG
+ QString fn = QFileDialog::getOpenFileName( QString::null, QString::null, this );
+ if ( !fn.isEmpty() )
+ browser->setSource( fn );
+#endif
+}
+
+void HelpWindow::newWindow()
+{
+ ( new HelpWindow(browser->source(), "qbrowser") )->show();
+}
+
+void HelpWindow::print()
+{
+#ifndef QT_NO_PRINTER
+ QPrinter printer;
+ printer.setFullPage(TRUE);
+ if ( printer.setup() ) {
+ QPainter p( &printer );
+ QPaintDeviceMetrics metrics(p.device());
+ int dpix = metrics.logicalDpiX();
+ int dpiy = metrics.logicalDpiY();
+ const int margin = 72; // pt
+ QRect body(margin*dpix/72, margin*dpiy/72,
+ metrics.width()-margin*dpix/72*2,
+ metrics.height()-margin*dpiy/72*2 );
+ QFont font("times", 10);
+ QStringList filePaths = browser->mimeSourceFactory()->filePath();
+ QString file;
+ QStringList::Iterator it = filePaths.begin();
+ for ( ; it != filePaths.end(); ++it ) {
+ file = QUrl( *it, QUrl( browser->source() ).path() ).path();
+ if ( QFile::exists( file ) )
+ break;
+ else
+ file = QString::null;
+ }
+ if ( file.isEmpty() )
+ return;
+ QFile f( file );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+ QTextStream ts( &f );
+ QSimpleRichText richText( ts.read(), font, browser->context(), browser->styleSheet(),
+ browser->mimeSourceFactory(), body.height() );
+ richText.setWidth( &p, body.width() );
+ QRect view( body );
+ int page = 1;
+ do {
+ richText.draw( &p, body.left(), body.top(), view, colorGroup() );
+ view.moveBy( 0, body.height() );
+ p.translate( 0 , -body.height() );
+ p.setFont( font );
+ p.drawText( view.right() - p.fontMetrics().width( QString::number(page) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) );
+ if ( view.top() >= richText.height() )
+ break;
+ printer.newPage();
+ page++;
+ } while (TRUE);
+ }
+#endif
+}
+
+void HelpWindow::pathSelected( const QString &_path )
+{
+ browser->setSource( _path );
+ QMap<int, QString>::Iterator it = mHistory.begin();
+ bool exists = FALSE;
+ for ( ; it != mHistory.end(); ++it ) {
+ if ( *it == _path ) {
+ exists = TRUE;
+ break;
+ }
+ }
+ if ( !exists )
+ mHistory[ hist->insertItem( _path ) ] = _path;
+}
+
+void HelpWindow::readHistory()
+{
+ if ( QFile::exists( QDir::currentDirPath() + "/.history" ) ) {
+ QFile f( QDir::currentDirPath() + "/.history" );
+ f.open( IO_ReadOnly );
+ QDataStream s( &f );
+ s >> history;
+ f.close();
+ while ( history.count() > 20 )
+ history.remove( history.begin() );
+ }
+}
+
+void HelpWindow::readBookmarks()
+{
+ if ( QFile::exists( QDir::currentDirPath() + "/.bookmarks" ) ) {
+ QFile f( QDir::currentDirPath() + "/.bookmarks" );
+ f.open( IO_ReadOnly );
+ QDataStream s( &f );
+ s >> bookmarks;
+ f.close();
+ }
+}
+
+void HelpWindow::histChosen( int i )
+{
+ if ( mHistory.contains( i ) )
+ browser->setSource( mHistory[ i ] );
+}
+
+void HelpWindow::bookmChosen( int i )
+{
+ if ( mBookmarks.contains( i ) )
+ browser->setSource( mBookmarks[ i ] );
+}
+
+void HelpWindow::addBookmark()
+{
+ mBookmarks[ bookm->insertItem( caption() ) ] = caption();
+}
diff --git a/examples/demo/textdrawing/helpwindow.h b/examples/demo/textdrawing/helpwindow.h
new file mode 100644
index 0000000..3427ad9
--- /dev/null
+++ b/examples/demo/textdrawing/helpwindow.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef HELPWINDOW_H
+#define HELPWINDOW_H
+
+#include <qmainwindow.h>
+#include <qtextbrowser.h>
+#include <qstringlist.h>
+#include <qmap.h>
+#include <qdir.h>
+
+class QComboBox;
+class QPopupMenu;
+
+class HelpWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ HelpWindow( const QString& home_, const QString& path, QWidget* parent = 0, const char *name=0 );
+ ~HelpWindow();
+
+private slots:
+ void setBackwardAvailable( bool );
+ void setForwardAvailable( bool );
+
+ void textChanged();
+ void about();
+ void aboutQt();
+ void openFile();
+ void newWindow();
+ void print();
+
+ void pathSelected( const QString & );
+ void histChosen( int );
+ void bookmChosen( int );
+ void addBookmark();
+
+private:
+ void readHistory();
+ void readBookmarks();
+
+ QTextBrowser* browser;
+ QComboBox *pathCombo;
+ int backwardId, forwardId;
+ QString selectedURL;
+ QStringList history, bookmarks;
+ QMap<int, QString> mHistory, mBookmarks;
+ QPopupMenu *hist, *bookm;
+
+};
+
+
+
+
+
+#endif
+
diff --git a/examples/demo/textdrawing/home.png b/examples/demo/textdrawing/home.png
new file mode 100644
index 0000000..aa150a3
--- /dev/null
+++ b/examples/demo/textdrawing/home.png
Binary files differ
diff --git a/examples/demo/textdrawing/next.png b/examples/demo/textdrawing/next.png
new file mode 100644
index 0000000..4b29ff4
--- /dev/null
+++ b/examples/demo/textdrawing/next.png
Binary files differ
diff --git a/examples/demo/textdrawing/previous.png b/examples/demo/textdrawing/previous.png
new file mode 100644
index 0000000..4e3556c
--- /dev/null
+++ b/examples/demo/textdrawing/previous.png
Binary files differ
diff --git a/examples/demo/textdrawing/print.png b/examples/demo/textdrawing/print.png
new file mode 100644
index 0000000..57e3e53
--- /dev/null
+++ b/examples/demo/textdrawing/print.png
Binary files differ
diff --git a/examples/demo/textdrawing/redo.png b/examples/demo/textdrawing/redo.png
new file mode 100644
index 0000000..bae07d3
--- /dev/null
+++ b/examples/demo/textdrawing/redo.png
Binary files differ
diff --git a/examples/demo/textdrawing/textbold.png b/examples/demo/textdrawing/textbold.png
new file mode 100644
index 0000000..7b5be47
--- /dev/null
+++ b/examples/demo/textdrawing/textbold.png
Binary files differ
diff --git a/examples/demo/textdrawing/textcenter.png b/examples/demo/textdrawing/textcenter.png
new file mode 100644
index 0000000..5c68b09
--- /dev/null
+++ b/examples/demo/textdrawing/textcenter.png
Binary files differ
diff --git a/examples/demo/textdrawing/textedit.cpp b/examples/demo/textdrawing/textedit.cpp
new file mode 100644
index 0000000..9aebf54
--- /dev/null
+++ b/examples/demo/textdrawing/textedit.cpp
@@ -0,0 +1,477 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "textedit.h"
+
+#include <qtextedit.h>
+#include <qaction.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qtoolbar.h>
+#include <qtabwidget.h>
+#include <qapplication.h>
+#include <qfontdatabase.h>
+#include <qcombobox.h>
+#include <qlineedit.h>
+#include <qfileinfo.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qprinter.h>
+#include <qpaintdevicemetrics.h>
+#include <qsimplerichtext.h>
+#include <qcolordialog.h>
+#include <qpainter.h>
+
+TextEdit::TextEdit( QWidget *parent, const char *name )
+ : QMainWindow( parent, name, 0 )
+{
+ setupFileActions();
+ setupEditActions();
+ setupTextActions();
+
+ tabWidget = new QTabWidget( this );
+ connect( tabWidget, SIGNAL( currentChanged( QWidget * ) ),
+ this, SLOT( editorChanged( QWidget * ) ) );
+ setCentralWidget( tabWidget );
+}
+
+void TextEdit::setupFileActions()
+{
+ QToolBar *tb = new QToolBar( this );
+ QPopupMenu *menu = new QPopupMenu( this );
+ menuBar()->insertItem( tr( "&File" ), menu );
+
+ QAction *a;
+ a = new QAction( tr( "New" ), QPixmap( "textdrawing/filenew.png" ), tr( "&New..." ), CTRL + Key_N, this, "fileNew" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new QAction( tr( "Open" ), QPixmap( "textdrawing/fileopen.png" ), tr( "&Open..." ), CTRL + Key_O, this, "fileOpen" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileOpen() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ menu->insertSeparator();
+ a = new QAction( tr( "Save" ), QPixmap( "textdrawing/filesave.png" ), tr( "&Save..." ), CTRL + Key_S, this, "fileSave" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new QAction( tr( "Save As" ), QPixmap(), tr( "Save &As..." ), 0, this, "fileSaveAs" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) );
+ a->addTo( menu );
+ menu->insertSeparator();
+ a = new QAction( tr( "Print" ), QPixmap( "textdrawing/print.png" ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrint() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new QAction( tr( "Close" ), QPixmap(), tr( "&Close" ), 0, this, "fileClose" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) );
+ a->addTo( menu );
+}
+
+void TextEdit::setupEditActions()
+{
+ QToolBar *tb = new QToolBar( this );
+ QPopupMenu *menu = new QPopupMenu( this );
+ menuBar()->insertItem( tr( "&Edit" ), menu );
+
+ QAction *a;
+ a = new QAction( tr( "Undo" ), QPixmap( "textdrawing/undo.png" ), tr( "&Undo" ), CTRL + Key_Z, this, "editUndo" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editUndo() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new QAction( tr( "Redo" ), QPixmap( "textdrawing/redo.png" ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editRedo() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ menu->insertSeparator();
+ a = new QAction( tr( "Cut" ), QPixmap( "textdrawing/editcut.png" ), tr( "&Cut" ), CTRL + Key_X, this, "editCut" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new QAction( tr( "Copy" ), QPixmap( "textdrawing/editcopy.png" ), tr( "C&opy" ), CTRL + Key_C, this, "editCopy" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new QAction( tr( "Paste" ), QPixmap( "textdrawing/editpaste.png" ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+}
+
+void TextEdit::setupTextActions()
+{
+ QToolBar *tb = new QToolBar( this );
+ QPopupMenu *menu = new QPopupMenu( this );
+ menuBar()->insertItem( tr( "For&mat" ), menu );
+
+ comboStyle = new QComboBox( FALSE, tb );
+ comboStyle->insertItem( tr("Standard") );
+ comboStyle->insertItem( tr("Bullet List (Disc)") );
+ comboStyle->insertItem( tr("Bullet List (Circle)") );
+ comboStyle->insertItem( tr("Bullet List (Square)") );
+ comboStyle->insertItem( tr("Ordered List (Decimal)") );
+ comboStyle->insertItem( tr("Ordered List (Alpha lower)") );
+ comboStyle->insertItem( tr("Ordered List (Alpha upper)") );
+ connect( comboStyle, SIGNAL( activated( int ) ),
+ this, SLOT( textStyle( int ) ) );
+
+ comboFont = new QComboBox( TRUE, tb );
+ QFontDatabase db;
+ comboFont->insertStringList( db.families() );
+ connect( comboFont, SIGNAL( activated( const QString & ) ),
+ this, SLOT( textFamily( const QString & ) ) );
+ comboFont->lineEdit()->setText( QApplication::font().family() );
+
+ comboSize = new QComboBox( TRUE, tb );
+ QValueList<int> sizes = db.standardSizes();
+ QValueList<int>::Iterator it = sizes.begin();
+ for ( ; it != sizes.end(); ++it )
+ comboSize->insertItem( QString::number( *it ) );
+ connect( comboSize, SIGNAL( activated( const QString & ) ),
+ this, SLOT( textSize( const QString & ) ) );
+ comboSize->lineEdit()->setText( QString::number( QApplication::font().pointSize() ) );
+
+ actionTextBold = new QAction( tr( "Bold" ), QPixmap( "textdrawing/textbold.png" ), tr( "&Bold" ), CTRL + Key_B, this, "textBold" );
+ connect( actionTextBold, SIGNAL( activated() ), this, SLOT( textBold() ) );
+ actionTextBold->addTo( tb );
+ actionTextBold->addTo( menu );
+ actionTextBold->setToggleAction( TRUE );
+ actionTextItalic = new QAction( tr( "Italic" ), QPixmap( "textdrawing/textitalic.png" ), tr( "&Italic" ), CTRL + Key_I, this, "textItalic" );
+ connect( actionTextItalic, SIGNAL( activated() ), this, SLOT( textItalic() ) );
+ actionTextItalic->addTo( tb );
+ actionTextItalic->addTo( menu );
+ actionTextItalic->setToggleAction( TRUE );
+ actionTextUnderline = new QAction( tr( "Underline" ), QPixmap( "textdrawing/textunderline.png" ), tr( "&Underline" ), CTRL + Key_U, this, "textUnderline" );
+ connect( actionTextUnderline, SIGNAL( activated() ), this, SLOT( textUnderline() ) );
+ actionTextUnderline->addTo( tb );
+ actionTextUnderline->addTo( menu );
+ actionTextUnderline->setToggleAction( TRUE );
+ menu->insertSeparator();
+
+ QActionGroup *grp = new QActionGroup( this );
+ grp->setExclusive( TRUE );
+ connect( grp, SIGNAL( selected( QAction* ) ), this, SLOT( textAlign( QAction* ) ) );
+
+ actionAlignLeft = new QAction( tr( "Left" ), QPixmap( "textdrawing/textleft.png" ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" );
+ actionAlignLeft->addTo( tb );
+ actionAlignLeft->addTo( menu );
+ actionAlignLeft->setToggleAction( TRUE );
+ actionAlignCenter = new QAction( tr( "Center" ), QPixmap( "textdrawing/textcenter.png" ), tr( "C&enter" ), CTRL + Key_M, grp, "textCenter" );
+ actionAlignCenter->addTo( tb );
+ actionAlignCenter->addTo( menu );
+ actionAlignCenter->setToggleAction( TRUE );
+ actionAlignRight = new QAction( tr( "Right" ), QPixmap( "textdrawing/textright.png" ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" );
+ actionAlignRight->addTo( tb );
+ actionAlignRight->addTo( menu );
+ actionAlignRight->setToggleAction( TRUE );
+ actionAlignJustify = new QAction( tr( "Justify" ), QPixmap( "textdrawing/textjustify.png" ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" );
+ actionAlignJustify->addTo( tb );
+ actionAlignJustify->addTo( menu );
+ actionAlignJustify->setToggleAction( TRUE );
+
+ menu->insertSeparator();
+
+ QPixmap pix( 16, 16 );
+ pix.fill( black );
+ actionTextColor = new QAction( tr( "Color" ), pix, tr( "&Color..." ), 0, this, "textColor" );
+ connect( actionTextColor, SIGNAL( activated() ), this, SLOT( textColor() ) );
+ actionTextColor->addTo( tb );
+ actionTextColor->addTo( menu );
+}
+
+void TextEdit::load( const QString &f )
+{
+ if ( !QFile::exists( f ) )
+ return;
+ QTextEdit *edit = new QTextEdit( tabWidget );
+ doConnections( edit );
+ tabWidget->addTab( edit, QFileInfo( f ).fileName() );
+
+ QFile fl( f );
+ fl.open( IO_ReadOnly );
+ QByteArray array = fl.readAll();
+ array.resize( array.size() +1 );
+ array[ (int)array.size() - 1 ] = '\0';
+ QString text = ( f.find( "bidi.txt" ) != -1 ? QString::fromUtf8( array.data() ) : QString::fromLatin1( array.data() ) );
+ edit->setText( text );
+
+ edit->viewport()->setFocus();
+ edit->setTextFormat( Qt::RichText );
+}
+
+QTextEdit *TextEdit::currentEditor() const
+{
+ if ( tabWidget->currentPage() &&
+ tabWidget->currentPage()->inherits( "QTextEdit" ) )
+ return (QTextEdit*)tabWidget->currentPage();
+ return 0;
+}
+
+void TextEdit::doConnections( QTextEdit *e )
+{
+ connect( e, SIGNAL( currentFontChanged( const QFont & ) ),
+ this, SLOT( fontChanged( const QFont & ) ) );
+ connect( e, SIGNAL( currentColorChanged( const QColor & ) ),
+ this, SLOT( colorChanged( const QColor & ) ) );
+ connect( e, SIGNAL( currentAlignmentChanged( int ) ),
+ this, SLOT( alignmentChanged( int ) ) );
+}
+
+void TextEdit::fileNew()
+{
+ QTextEdit *edit = new QTextEdit( tabWidget );
+ doConnections( edit );
+ tabWidget->addTab( edit, tr( "noname" ) );
+ tabWidget->showPage( edit );
+ edit->viewport()->setFocus();
+}
+
+void TextEdit::fileOpen()
+{
+ QString fn = QFileDialog::getOpenFileName( QString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+ if ( !fn.isEmpty() )
+ load( fn );
+}
+
+void TextEdit::fileSave()
+{
+ if ( !currentEditor() )
+ return;
+ QString fn;
+ if ( filenames.find( currentEditor() ) == filenames.end() ) {
+ fileSaveAs();
+ } else {
+ QFile file( *filenames.find( currentEditor() ) );
+ if ( !file.open( IO_WriteOnly ) )
+ return;
+ QTextStream ts( &file );
+ ts << currentEditor()->text();
+ }
+}
+
+void TextEdit::fileSaveAs()
+{
+ if ( !currentEditor() )
+ return;
+ QString fn = QFileDialog::getSaveFileName( QString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+ if ( !fn.isEmpty() ) {
+ filenames.replace( currentEditor(), fn );
+ fileSave();
+ tabWidget->setTabLabel( currentEditor(), QFileInfo( fn ).fileName() );
+ }
+}
+
+void TextEdit::filePrint()
+{
+ if ( !currentEditor() )
+ return;
+#ifndef QT_NO_PRINTER
+ QPrinter printer;
+ printer.setFullPage(TRUE);
+ QPaintDeviceMetrics screen( this );
+ printer.setResolution( screen.logicalDpiY() );
+ if ( printer.setup( this ) ) {
+ QPainter p( &printer );
+ QPaintDeviceMetrics metrics( p.device() );
+ int dpix = metrics.logicalDpiX();
+ int dpiy = metrics.logicalDpiY();
+ const int margin = 72; // pt
+ QRect body( margin * dpix / 72, margin * dpiy / 72,
+ metrics.width() - margin * dpix / 72 * 2,
+ metrics.height() - margin * dpiy / 72 * 2 );
+ QFont font( "times", 10 );
+ QSimpleRichText richText( currentEditor()->text(), font, currentEditor()->context(), currentEditor()->styleSheet(),
+ currentEditor()->mimeSourceFactory(), body.height() );
+ richText.setWidth( &p, body.width() );
+ QRect view( body );
+ int page = 1;
+ do {
+ richText.draw( &p, body.left(), body.top(), view, colorGroup() );
+ view.moveBy( 0, body.height() );
+ p.translate( 0 , -body.height() );
+ p.setFont( font );
+ p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) );
+ if ( view.top() >= richText.height() )
+ break;
+ printer.newPage();
+ page++;
+ } while (TRUE);
+ }
+#endif
+}
+
+void TextEdit::fileClose()
+{
+ delete currentEditor();
+ if ( currentEditor() )
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::fileExit()
+{
+ qApp->quit();
+}
+
+void TextEdit::editUndo()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->undo();
+}
+
+void TextEdit::editRedo()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->redo();
+}
+
+void TextEdit::editCut()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->cut();
+}
+
+void TextEdit::editCopy()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->copy();
+}
+
+void TextEdit::editPaste()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->paste();
+}
+
+void TextEdit::textBold()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setBold( actionTextBold->isOn() );
+}
+
+void TextEdit::textUnderline()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setUnderline( actionTextUnderline->isOn() );
+}
+
+void TextEdit::textItalic()
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setItalic( actionTextItalic->isOn() );
+}
+
+void TextEdit::textFamily( const QString &f )
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setFamily( f );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textSize( const QString &p )
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setPointSize( p.toInt() );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textStyle( int i )
+{
+ if ( !currentEditor() )
+ return;
+ if ( i == 0 )
+ currentEditor()->setParagType( QStyleSheetItem::DisplayBlock, QStyleSheetItem::ListDisc );
+ else if ( i == 1 )
+ currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDisc );
+ else if ( i == 2 )
+ currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListCircle );
+ else if ( i == 3 )
+ currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListSquare );
+ else if ( i == 4 )
+ currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDecimal );
+ else if ( i == 5 )
+ currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListLowerAlpha );
+ else if ( i == 6 )
+ currentEditor()->setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListUpperAlpha );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textColor()
+{
+ if ( !currentEditor() )
+ return;
+ QColor col = QColorDialog::getColor( currentEditor()->color(), this );
+ if ( !col.isValid() )
+ return;
+ currentEditor()->setColor( col );
+ QPixmap pix( 16, 16 );
+ pix.fill( col );
+ actionTextColor->setIconSet( pix );
+}
+
+void TextEdit::textAlign( QAction *a )
+{
+ if ( !currentEditor() )
+ return;
+ if ( a == actionAlignLeft )
+ currentEditor()->setAlignment( AlignLeft );
+ else if ( a == actionAlignCenter )
+ currentEditor()->setAlignment( AlignHCenter );
+ else if ( a == actionAlignRight )
+ currentEditor()->setAlignment( AlignRight );
+ else if ( a == actionAlignJustify )
+ currentEditor()->setAlignment( AlignJustify );
+}
+
+void TextEdit::fontChanged( const QFont &f )
+{
+ comboFont->lineEdit()->setText( f.family() );
+ comboSize->lineEdit()->setText( QString::number( f.pointSize() ) );
+ actionTextBold->setOn( f.bold() );
+ actionTextItalic->setOn( f.italic() );
+ actionTextUnderline->setOn( f.underline() );
+}
+
+void TextEdit::colorChanged( const QColor &c )
+{
+ QPixmap pix( 16, 16 );
+ pix.fill( c );
+ actionTextColor->setIconSet( pix );
+}
+
+void TextEdit::alignmentChanged( int a )
+{
+ if ( ( a == AlignAuto ) || ( a & AlignLeft ))
+ actionAlignLeft->setOn( TRUE );
+ else if ( ( a & AlignHCenter ) )
+ actionAlignCenter->setOn( TRUE );
+ else if ( ( a & AlignRight ) )
+ actionAlignRight->setOn( TRUE );
+ else if ( ( a & AlignJustify ) )
+ actionAlignJustify->setOn( TRUE );
+}
+
+void TextEdit::editorChanged( QWidget * )
+{
+ if ( !currentEditor() )
+ return;
+ fontChanged( currentEditor()->font() );
+ colorChanged( currentEditor()->color() );
+ alignmentChanged( currentEditor()->alignment() );
+}
diff --git a/examples/demo/textdrawing/textedit.h b/examples/demo/textdrawing/textedit.h
new file mode 100644
index 0000000..b1c3d95
--- /dev/null
+++ b/examples/demo/textdrawing/textedit.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TEXTEDIT_H
+#define TEXTEDIT_H
+
+#include <qmainwindow.h>
+#include <qmap.h>
+
+class QAction;
+class QComboBox;
+class QTabWidget;
+class QTextEdit;
+
+class TextEdit : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ TextEdit( QWidget *parent = 0, const char *name = 0 );
+
+ QTextEdit *currentEditor() const;
+ void load( const QString &f );
+
+
+public slots:
+ void fileNew();
+ void fileOpen();
+ void fileSave();
+ void fileSaveAs();
+ void filePrint();
+ void fileClose();
+ void fileExit();
+
+ void editUndo();
+ void editRedo();
+ void editCut();
+ void editCopy();
+ void editPaste();
+
+ void textBold();
+ void textUnderline();
+ void textItalic();
+ void textFamily( const QString &f );
+ void textSize( const QString &p );
+ void textStyle( int s );
+ void textColor();
+ void textAlign( QAction *a );
+
+ void fontChanged( const QFont &f );
+ void colorChanged( const QColor &c );
+ void alignmentChanged( int a );
+ void editorChanged( QWidget * );
+
+
+private:
+ void setupFileActions();
+ void setupEditActions();
+ void setupTextActions();
+ void doConnections( QTextEdit *e );
+
+ QAction *actionTextBold,
+ *actionTextUnderline,
+ *actionTextItalic,
+ *actionTextColor,
+ *actionAlignLeft,
+ *actionAlignCenter,
+ *actionAlignRight,
+ *actionAlignJustify;
+ QComboBox *comboStyle,
+ *comboFont,
+ *comboSize;
+ QTabWidget *tabWidget;
+ QMap<QTextEdit*, QString> filenames;
+
+};
+
+
+#endif
diff --git a/examples/demo/textdrawing/textitalic.png b/examples/demo/textdrawing/textitalic.png
new file mode 100644
index 0000000..68e2b44
--- /dev/null
+++ b/examples/demo/textdrawing/textitalic.png
Binary files differ
diff --git a/examples/demo/textdrawing/textjustify.png b/examples/demo/textdrawing/textjustify.png
new file mode 100644
index 0000000..1c6e5b9
--- /dev/null
+++ b/examples/demo/textdrawing/textjustify.png
Binary files differ
diff --git a/examples/demo/textdrawing/textleft.png b/examples/demo/textdrawing/textleft.png
new file mode 100644
index 0000000..30b0501
--- /dev/null
+++ b/examples/demo/textdrawing/textleft.png
Binary files differ
diff --git a/examples/demo/textdrawing/textright.png b/examples/demo/textdrawing/textright.png
new file mode 100644
index 0000000..73f1cad
--- /dev/null
+++ b/examples/demo/textdrawing/textright.png
Binary files differ
diff --git a/examples/demo/textdrawing/textunderline.png b/examples/demo/textdrawing/textunderline.png
new file mode 100644
index 0000000..3477ccb
--- /dev/null
+++ b/examples/demo/textdrawing/textunderline.png
Binary files differ
diff --git a/examples/demo/textdrawing/undo.png b/examples/demo/textdrawing/undo.png
new file mode 100644
index 0000000..d5b6c16
--- /dev/null
+++ b/examples/demo/textdrawing/undo.png
Binary files differ
diff --git a/examples/demo/translations/demo_ar.qm b/examples/demo/translations/demo_ar.qm
new file mode 100644
index 0000000..fa1da47
--- /dev/null
+++ b/examples/demo/translations/demo_ar.qm
Binary files differ
diff --git a/examples/demo/translations/demo_ar.ts b/examples/demo/translations/demo_ar.ts
new file mode 100644
index 0000000..abe42ad
--- /dev/null
+++ b/examples/demo/translations/demo_ar.ts
@@ -0,0 +1,1492 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>BookForm</name>
+ <message>
+ <source>Book</source>
+ <translation type="obsolete">كتاب</translation>
+ </message>
+ <message>
+ <source>Surname</source>
+ <translation type="obsolete">لقب</translation>
+ </message>
+ <message>
+ <source>surname</source>
+ <translation type="obsolete">لقب</translation>
+ </message>
+ <message>
+ <source>Forename</source>
+ <translation type="obsolete">إسم</translation>
+ </message>
+ <message>
+ <source>forename</source>
+ <translation type="obsolete">إسم</translation>
+ </message>
+ <message>
+ <source>surname ASC</source>
+ <translation type="obsolete">لقب</translation>
+ </message>
+ <message>
+ <source>forename ASC</source>
+ <translation type="obsolete">إسم</translation>
+ </message>
+ <message>
+ <source>(default)</source>
+ <translation type="obsolete">(Ø¥Ùتراضي)</translation>
+ </message>
+ <message>
+ <source>author</source>
+ <translation type="obsolete">مؤلّÙ</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation type="obsolete">عنوان</translation>
+ </message>
+ <message>
+ <source>title</source>
+ <translation type="obsolete">عنوان</translation>
+ </message>
+ <message>
+ <source>Price</source>
+ <translation type="obsolete">سعر</translation>
+ </message>
+ <message>
+ <source>price</source>
+ <translation type="obsolete">سعر</translation>
+ </message>
+ <message>
+ <source>Notes</source>
+ <translation type="obsolete">ملاحظات</translation>
+ </message>
+ <message>
+ <source>notes</source>
+ <translation type="obsolete">ملاحظات</translation>
+ </message>
+ <message>
+ <source>title ASC</source>
+ <translation type="obsolete">عنوان</translation>
+ </message>
+ <message>
+ <source>book</source>
+ <translation type="obsolete">كتاب</translation>
+ </message>
+ <message>
+ <source>&amp;Connect...</source>
+ <translation type="obsolete">&amp;وصل...</translation>
+ </message>
+ <message>
+ <source>&amp;Edit Books</source>
+ <translation type="obsolete">ت&amp;حرير الكتب</translation>
+ </message>
+</context>
+<context>
+ <name>ConnectDialog</name>
+ <message>
+ <source>Connect...</source>
+ <translation>وصل...</translation>
+ </message>
+ <message>
+ <source>Connection settings</source>
+ <translation>إعدادات الوصل</translation>
+ </message>
+ <message>
+ <source>Database Name:</source>
+ <translation>إسم قاعدة البيانات:</translation>
+ </message>
+ <message>
+ <source>&amp;Username:</source>
+ <translation>إسم المست&amp;عمل:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;كلمة السّر:</translation>
+ </message>
+ <message>
+ <source>&amp;Hostname:</source>
+ <translation>إسم الم&amp;ضيÙ:</translation>
+ </message>
+ <message>
+ <source>P&amp;ort:</source>
+ <translation>Ù…&amp;Ù†ÙØ°:</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Ø¥Ùتراضي</translation>
+ </message>
+ <message>
+ <source>D&amp;river</source>
+ <translation>&amp;قائد</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;مواÙقة</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>إ&amp;لغاء</translation>
+ </message>
+</context>
+<context>
+ <name>DnDDemo</name>
+ <message>
+ <source>copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished">نسخ</translation>
+ </message>
+ <message>
+ <source>cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="unfinished">قصّ</translation>
+ </message>
+ <message>
+ <source>paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished">تلصيق</translation>
+ </message>
+ <message>
+ <source>raise</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Raise</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>lower</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lower</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished">جديد</translation>
+ </message>
+ <message>
+ <source>load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished">Ø­Ùظ</translation>
+ </message>
+ <message>
+ <source>undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished">تراجع</translation>
+ </message>
+ <message>
+ <source>redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished">إعادة</translation>
+ </message>
+ <message>
+ <source>delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>home</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished">منزل</translation>
+ </message>
+ <message>
+ <source>Actions</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DnDDemoBase</name>
+ <message>
+ <source>Form1</source>
+ <translation>استمارة1</translation>
+ </message>
+</context>
+<context>
+ <name>EditBookForm</name>
+ <message>
+ <source>Edit Books</source>
+ <translation type="obsolete">تحرير الكتب</translation>
+ </message>
+ <message>
+ <source>title ASC</source>
+ <translation type="obsolete">عنوان</translation>
+ </message>
+ <message>
+ <source>(default)</source>
+ <translation type="obsolete">(Ø¥Ùتراضي)</translation>
+ </message>
+ <message>
+ <source>book</source>
+ <translation type="obsolete">كتاب</translation>
+ </message>
+ <message>
+ <source>Price</source>
+ <translation type="obsolete">سعر</translation>
+ </message>
+ <message>
+ <source>Title</source>
+ <translation type="obsolete">عنوان</translation>
+ </message>
+ <message>
+ <source>title</source>
+ <translation type="obsolete">عنوان</translation>
+ </message>
+ <message>
+ <source>price</source>
+ <translation type="obsolete">سعر</translation>
+ </message>
+ <message>
+ <source>&amp;Insert</source>
+ <translation type="obsolete">إ&amp;دراج</translation>
+ </message>
+ <message>
+ <source>&amp;Update</source>
+ <translation type="obsolete">تحد&amp;يث</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="obsolete">&amp;حذÙ</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="obsolete">إ&amp;غلاق</translation>
+ </message>
+ <message>
+ <source>|&lt; &amp;First</source>
+ <translation type="obsolete">|&lt; ال&amp;أوّل</translation>
+ </message>
+ <message>
+ <source>&lt;&lt; &amp;Prev</source>
+ <translation type="obsolete">&lt;&lt; ال&amp;سّابق</translation>
+ </message>
+ <message>
+ <source>&amp;Next &gt;&gt;</source>
+ <translation type="obsolete">ال&amp;تّالي &gt;&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Last &gt;|</source>
+ <translation type="obsolete">الأ&amp;خير &gt;|</translation>
+ </message>
+ <message>
+ <source>Author</source>
+ <translation type="obsolete">مؤلّÙ</translation>
+ </message>
+ <message>
+ <source>author_view</source>
+ <translation type="obsolete">منظر المؤلّÙ</translation>
+ </message>
+ <message>
+ <source>name</source>
+ <translation type="obsolete">إسم</translation>
+ </message>
+</context>
+<context>
+ <name>FigureEditor</name>
+ <message>
+ <source>Drag the nodes around!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Frame</name>
+ <message>
+ <source>Qt Demo Collection</source>
+ <translation>مجموعة عرض Qt</translation>
+ </message>
+ <message>
+ <source>&amp;Exit</source>
+ <translation>&amp;خروج</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>تحكّم+Q</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;ملÙÙ‘</translation>
+ </message>
+ <message>
+ <source>St&amp;yle</source>
+ <translation>&amp;طراز</translation>
+ </message>
+ <message>
+ <source>Demo Categories</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Widgets</source>
+ <translation type="unfinished">ويدجت</translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SQL Explorer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Graph Drawing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>3D Demo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fractal landscape</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OpenGL info</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Richtext Editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help Browser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Internationalization</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Asteroids</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GLLandscape</name>
+ <message>
+ <source>Wireframe</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Flat shaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Smooth shaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Landscape</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GLLandscapeViewer</name>
+ <message>
+ <source>Qt/OpenGL example</source>
+ <translation>مثال عن Qt/OpenGL</translation>
+ </message>
+ <message>
+ <source>X-rotation</source>
+ <translation>دوران سيني</translation>
+ </message>
+ <message>
+ <source>Y-rotation</source>
+ <translation>دوران صادي</translation>
+ </message>
+ <message>
+ <source>Z-rotation</source>
+ <translation>دوران عيني</translation>
+ </message>
+ <message>
+ <source>Rendering mode</source>
+ <translation>نمط الارجاع</translation>
+ </message>
+ <message>
+ <source>&amp;Wireframe</source>
+ <translation>ع&amp;لبة التّوصيلات</translation>
+ </message>
+ <message>
+ <source>Fl&amp;at shaded</source>
+ <translation>تظليل م&amp;ستوي</translation>
+ </message>
+ <message>
+ <source>&amp;Smooth shaded</source>
+ <translation>تظليل أ&amp;ملس</translation>
+ </message>
+ <message>
+ <source>&amp;Landscape</source>
+ <translation>م&amp;نظر</translation>
+ </message>
+ <message>
+ <source>&amp;Fractalize</source>
+ <translation>&amp;كسر</translation>
+ </message>
+ <message>
+ <source>&amp;Reset grid</source>
+ <translation>إ&amp;عادة وضع الشّبكة</translation>
+ </message>
+ <message>
+ <source>&amp;Animate</source>
+ <translation>ت&amp;حريك</translation>
+ </message>
+ <message>
+ <source>Zoom</source>
+ <translation>تكبير</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>حجم</translation>
+ </message>
+</context>
+<context>
+ <name>GLWorkspace</name>
+ <message>
+ <source>&amp;Scene</source>
+ <translation>م&amp;شهد</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;جديد</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation>جديد</translation>
+ </message>
+ <message>
+ <source>Wirebox</source>
+ <translation>علبة التّوصيلات</translation>
+ </message>
+ <message>
+ <source>&amp;Wirebox</source>
+ <translation>ع&amp;لبة التّوصيلات</translation>
+ </message>
+ <message>
+ <source>Gear</source>
+ <translation>ترس</translation>
+ </message>
+ <message>
+ <source>&amp;Gears</source>
+ <translation>ت&amp;روس</translation>
+ </message>
+ <message>
+ <source>Texture</source>
+ <translation>حبكة</translation>
+ </message>
+ <message>
+ <source>&amp;Texture</source>
+ <translation>&amp;حبكة</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>&amp;طبع</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>طبع</translation>
+ </message>
+ <message>
+ <source>Window Size</source>
+ <translation>حجم النّاÙذة</translation>
+ </message>
+ <message>
+ <source>&amp;Window Size</source>
+ <translation>حجم ال&amp;نّاÙذة</translation>
+ </message>
+ <message>
+ <source>Low Resolution</source>
+ <translation>تمييز منخÙض</translation>
+ </message>
+ <message>
+ <source>&amp;Low Resolution</source>
+ <translation>تمييز من&amp;Ø®Ùض</translation>
+ </message>
+ <message>
+ <source>Medium Resolution</source>
+ <translation>تمييز متوسّط</translation>
+ </message>
+ <message>
+ <source>&amp;Medium Resolution</source>
+ <translation>تمييز مت&amp;وسّط</translation>
+ </message>
+ <message>
+ <source>High Resolution</source>
+ <translation>تمييز عالي</translation>
+ </message>
+ <message>
+ <source>&amp;High Resolution</source>
+ <translation>تمييز &amp;عالي</translation>
+ </message>
+ <message>
+ <source>Setup</source>
+ <translation>إعداد</translation>
+ </message>
+ <message>
+ <source>&amp;Setup...</source>
+ <translation>إع&amp;داد...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>إغلاق</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>إ&amp;غلاق</translation>
+ </message>
+ <message>
+ <source>WireBox</source>
+ <translation type="obsolete">علبة التّوصيلات</translation>
+ </message>
+ <message>
+ <source>Nurbs</source>
+ <translation>نرب</translation>
+ </message>
+</context>
+<context>
+ <name>HelpWindow</name>
+ <message>
+ <source>&amp;New Window</source>
+ <translation>ناÙذة &amp;جديدة</translation>
+ </message>
+ <message>
+ <source>&amp;Open File</source>
+ <translation>&amp;Ùتح ملÙÙ‘</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>&amp;طبع</translation>
+ </message>
+ <message>
+ <source>&amp;Backward</source>
+ <translation>لل&amp;وراء</translation>
+ </message>
+ <message>
+ <source>&amp;Forward</source>
+ <translation>لل&amp;أمام</translation>
+ </message>
+ <message>
+ <source>&amp;Home</source>
+ <translation>م&amp;نزل</translation>
+ </message>
+ <message>
+ <source>Add Bookmark</source>
+ <translation>إضاÙØ© مؤشّر</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;ملÙÙ‘</translation>
+ </message>
+ <message>
+ <source>&amp;Go</source>
+ <translation>إ&amp;ذهب</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>تاريخ</translation>
+ </message>
+ <message>
+ <source>Bookmarks</source>
+ <translation>مؤشّرات</translation>
+ </message>
+ <message>
+ <source>Backward</source>
+ <translation>للوراء</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>للأمام</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>منزل</translation>
+ </message>
+</context>
+<context>
+ <name>I18nDemo</name>
+ <message>
+ <source>Close the current window.</source>
+ <translation>إغلاق النّاÙذة الجارية.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>إغلاق</translation>
+ </message>
+ <message>
+ <source>Close all opened windows.</source>
+ <translation>إغلاق جميع النّواÙØ° المÙتوحة.</translation>
+ </message>
+ <message>
+ <source>Close All</source>
+ <translation>إغلاق الجميع</translation>
+ </message>
+ <message>
+ <source>Tile opened windows.</source>
+ <translation>تطويب النّواÙØ° المÙتوحة.</translation>
+ </message>
+ <message>
+ <source>Tile</source>
+ <translation>تطويب</translation>
+ </message>
+ <message>
+ <source>Cascade opened windows.</source>
+ <translation>تشليل النّواÙØ° المÙتوحة.</translation>
+ </message>
+ <message>
+ <source>Cascade</source>
+ <translation>تشليل</translation>
+ </message>
+ <message>
+ <source>--language--</source>
+ <translation>--اللّغة--</translation>
+ </message>
+ <message>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</source>
+ <translation type="obsolete">&lt;h3&gt;حول Qt&lt;/h3&gt;&lt;p&gt;هذا البرنامج يستعمل Qt إصدار %1ØŒ طقم أدوات C++ لتطوير البرامج البيانية على جميع المنصّات من شركة ترولتك. Qt توÙّر إمكانية حمل Ù†Ùس المصدر إلى ويندوز95\98\NT\2000 ØŒ لينكس، سولاريس، HP-UX Ùˆ العديد من الإصدارات الأخرى ليونيكس مع X11. أنظر &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; للمزيد من المعلومات.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;جديد</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Mac OS X, Linux, Solaris, HP-UX and many other versions of Unix with X11.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>KAstTopLevel</name>
+ <message>
+ <source>Score</source>
+ <translation>حاصل</translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation>مستوى</translation>
+ </message>
+ <message>
+ <source>Ships</source>
+ <translation>مركبات</translation>
+ </message>
+ <message>
+ <source>Fuel</source>
+ <translation>وقود</translation>
+ </message>
+ <message>
+ <source>Press N to start playing</source>
+ <translation>إضغط على N لبدأ اللّعب</translation>
+ </message>
+ <message>
+ <source>Ship Destroyed. Press L to launch.</source>
+ <translation>دمّرت المركبة، إضغط على L للإطلاق.</translation>
+ </message>
+ <message>
+ <source>Game Over!</source>
+ <translation>انتهت اللّعبة!</translation>
+ </message>
+</context>
+<context>
+ <name>KAsteroidsView</name>
+ <message>
+ <source>QCanvas demo</source>
+ <translation>عرض QCanvas</translation>
+ </message>
+ <message>
+ <source>This game has been implemented using the QCanvas class.
+The QCanvas class is not part of the Professional Edition. Please
+contact Trolltech if you want to upgrade to the Enterprise Edition.</source>
+ <translation>تمّ إنجاز هذه اللّعبة باستعمال Ùصيلة QCanvas.
+Ùصيلة QCanvas ليست جزء من التّحريرة الاحتراÙية. تÙضّل
+بالإتّصال بترولتك إن أردت التّرÙيع إلى تحريرة الشّركات.</translation>
+ </message>
+ <message>
+ <source>Error: Cannot read sprite images</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PrintPreview</name>
+ <message>
+ <source>Print Preview</source>
+ <translation>مراجعة الطّبع</translation>
+ </message>
+ <message>
+ <source>Preview</source>
+ <translation>مراجعة</translation>
+ </message>
+ <message>
+ <source>TextLabel1</source>
+ <translation>علامة النّص 1</translation>
+ </message>
+ <message>
+ <source>Modify</source>
+ <translation>تعديل</translation>
+ </message>
+ <message>
+ <source>&amp;Invert Colors</source>
+ <translation>&amp;عكس الألوان</translation>
+ </message>
+ <message>
+ <source>&amp;Mirror</source>
+ <translation>م&amp;رآة</translation>
+ </message>
+ <message>
+ <source>&amp;Flip</source>
+ <translation>&amp;قلب</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;left</source>
+ <translation>دوران ب 90° للي&amp;سار</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;right</source>
+ <translation>دوران ب 90° للي&amp;مين</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>مساع&amp;دة</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>&amp;طبع</translation>
+ </message>
+ <message>
+ <source>&amp;Discard</source>
+ <translation>&amp;نبذ</translation>
+ </message>
+</context>
+<context>
+ <name>SqlEx</name>
+ <message>
+ <source>Form1</source>
+ <translation>استمارة1</translation>
+ </message>
+ <message>
+ <source>Tables</source>
+ <translation>جداول</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>طراز</translation>
+ </message>
+ <message>
+ <source>Required</source>
+ <translation>مطلوب</translation>
+ </message>
+ <message>
+ <source>SQL Query</source>
+ <translation>استÙهام SQL</translation>
+ </message>
+ <message>
+ <source>&amp;Submit</source>
+ <translation>&amp;بعث</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;محو</translation>
+ </message>
+ <message>
+ <source>Press &quot;Connect&quot; to open a database</source>
+ <translation>إضغط على &quot;وصل&quot; Ù„Ùتح قاعدة بيانات</translation>
+ </message>
+ <message>
+ <source>&amp;Connect...</source>
+ <translation>&amp;وصل...</translation>
+ </message>
+</context>
+<context>
+ <name>TextEdit</name>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;ملÙÙ‘</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation>جديد</translation>
+ </message>
+ <message>
+ <source>&amp;New...</source>
+ <translation>&amp;جديد...</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>Ùتح</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation>&amp;Ùتح...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Ø­Ùظ</translation>
+ </message>
+ <message>
+ <source>&amp;Save...</source>
+ <translation>Ø­Ù&amp;ظ...</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>Ø­Ùظ تحت</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation>Ø­Ùظ &amp;تحت...</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>طبع</translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation>طب&amp;ع...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>إغلاق</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>إ&amp;غلاق</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>ت&amp;حرير</translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation>تراجع</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;تراجع</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>إعادة</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>إعا&amp;دة</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>قصّ</translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation>&amp;قصّ</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>نسخ</translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation>&amp;نسخ</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>تلصيق</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>ت&amp;لصيق</translation>
+ </message>
+ <message>
+ <source>For&amp;mat</source>
+ <translation>&amp;طراز</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+ <translation>قياسي</translation>
+ </message>
+ <message>
+ <source>Bullet List (Disc)</source>
+ <translation>قائمة مطّية (قرص)</translation>
+ </message>
+ <message>
+ <source>Bullet List (Circle)</source>
+ <translation>قائمة مطّية (دائرة)</translation>
+ </message>
+ <message>
+ <source>Bullet List (Square)</source>
+ <translation>قائمة مطّية (مربّع)</translation>
+ </message>
+ <message>
+ <source>Ordered List (Decimal)</source>
+ <translation>قائمة مرتّبة (عشرية)</translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha lower)</source>
+ <translation>قائمة مرتّبة (أل٠للتحت)</translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha upper)</source>
+ <translation>قائمة مرتّبة (أل٠للÙوق)</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>بيّن</translation>
+ </message>
+ <message>
+ <source>&amp;Bold</source>
+ <translation>&amp;بيّن</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>مائل</translation>
+ </message>
+ <message>
+ <source>&amp;Italic</source>
+ <translation>ما&amp;ئل</translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <translation>تسطير</translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation>تسطي&amp;ر</translation>
+ </message>
+ <message>
+ <source>Left</source>
+ <translation>يسار</translation>
+ </message>
+ <message>
+ <source>&amp;Left</source>
+ <translation>ي&amp;سار</translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation>توسيط</translation>
+ </message>
+ <message>
+ <source>C&amp;enter</source>
+ <translation>ت&amp;وسيط</translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation>يمين</translation>
+ </message>
+ <message>
+ <source>&amp;Right</source>
+ <translation>&amp;يمين</translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation>ضبط الهامش</translation>
+ </message>
+ <message>
+ <source>&amp;Justify</source>
+ <translation>ضبط ال&amp;هامش</translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation>لون</translation>
+ </message>
+ <message>
+ <source>&amp;Color...</source>
+ <translation>&amp;لون...</translation>
+ </message>
+ <message>
+ <source>noname</source>
+ <translation>دون إسم</translation>
+ </message>
+ <message>
+ <source>HTML-Files (*.htm *.html);;All Files (*)</source>
+ <translation>ملÙّات (html htm);;جميع الملÙّات (*)</translation>
+ </message>
+</context>
+<context>
+ <name>WidgetsBase</name>
+ <message>
+ <source>Widgets</source>
+ <translation>ويدجت</translation>
+ </message>
+ <message>
+ <source>Applix</source>
+ <translation>أبليكس</translation>
+ </message>
+ <message>
+ <source>Binary</source>
+ <translation>ثنائي</translation>
+ </message>
+ <message>
+ <source>Core</source>
+ <translation>نواة</translation>
+ </message>
+ <message>
+ <source>Deb</source>
+ <translation>Deb</translation>
+ </message>
+ <message>
+ <source>Document</source>
+ <translation>وثيقة</translation>
+ </message>
+ <message>
+ <source>Pdf</source>
+ <translation>Pdf</translation>
+ </message>
+ <message>
+ <source>Readme</source>
+ <translation>إقرأني</translation>
+ </message>
+ <message>
+ <source>Shellscript</source>
+ <translation>سلسلة البرنامج الوسيطي</translation>
+ </message>
+ <message>
+ <source>Recycled</source>
+ <translation>مسترجع</translation>
+ </message>
+ <message>
+ <source>Video</source>
+ <translation>Ùيديو</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation type="obsolete">&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;نصّ غنيّ&lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt تدعم النّصوص الغنيّة المقاسة، كالعنوان الآنÙØŒ النّصوص &lt;i&gt;&lt;font &gt;المائلة&lt;/font&gt;&lt;/i&gt;ØŒ &lt;b&gt;&lt;font &gt;البيّنة &lt;/font&gt;&lt;/b&gt;Ùˆ &lt;u&gt;&lt;font &gt;المسطّرة&lt;/font&gt;&lt;/u&gt;ØŒ كما تدعم النّصوص الملوّنة كذلك. هذا &lt;font color=&quot;#ff0000&quot; &gt;أحمر&lt;/font&gt;ØŒ بينما هذا &lt;font color=&quot;#00bb00&quot; &gt;أخضر&lt;/font&gt;ØŒ Ùˆ هذا &lt;font color=&quot;#0000ff&quot; &gt;أزرق&lt;/font&gt;.
+&lt;/p&gt;
+&lt;&gt; &lt;/&gt;</translation>
+ </message>
+ <message>
+ <source>Iconview</source>
+ <translation>منظر بالإيقونات</translation>
+ </message>
+ <message>
+ <source>Item 1</source>
+ <translation>البند 1</translation>
+ </message>
+ <message>
+ <source>Item 2</source>
+ <translation>البند 2</translation>
+ </message>
+ <message>
+ <source>Item 3</source>
+ <translation>البند 3</translation>
+ </message>
+ <message>
+ <source>Item 4</source>
+ <translation>البند 4</translation>
+ </message>
+ <message>
+ <source>Item 5</source>
+ <translation>البند 5</translation>
+ </message>
+ <message>
+ <source>Item 6</source>
+ <translation>البند 6</translation>
+ </message>
+ <message>
+ <source>Item 7</source>
+ <translation>البند 7</translation>
+ </message>
+ <message>
+ <source>Item 8</source>
+ <translation>البند 8</translation>
+ </message>
+ <message>
+ <source>Item 9</source>
+ <translation>البند 9</translation>
+ </message>
+ <message>
+ <source>Item 10</source>
+ <translation>البند 10</translation>
+ </message>
+ <message>
+ <source>Item 11</source>
+ <translation>البند 11</translation>
+ </message>
+ <message>
+ <source>Item 12</source>
+ <translation>البند 12</translation>
+ </message>
+ <message>
+ <source>Item 13</source>
+ <translation>البند 13</translation>
+ </message>
+ <message>
+ <source>Item 14</source>
+ <translation>البند 14</translation>
+ </message>
+ <message>
+ <source>Item 15</source>
+ <translation>البند 15</translation>
+ </message>
+ <message>
+ <source>Item 16</source>
+ <translation>البند 16</translation>
+ </message>
+ <message>
+ <source>Item 17</source>
+ <translation>البند 17</translation>
+ </message>
+ <message>
+ <source>Table</source>
+ <translation>جدول</translation>
+ </message>
+ <message>
+ <source>Tables</source>
+ <translation>جداول</translation>
+ </message>
+ <message>
+ <source>are</source>
+ <translation>تكون</translation>
+ </message>
+ <message>
+ <source>easy</source>
+ <translation>سهل</translation>
+ </message>
+ <message>
+ <source>with</source>
+ <translation>مع</translation>
+ </message>
+ <message>
+ <source>Qt</source>
+ <translation>Qt</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation type="obsolete">6</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation type="obsolete">7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation type="obsolete">8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation type="obsolete">9</translation>
+ </message>
+ <message>
+ <source>10</source>
+ <translation type="obsolete">10</translation>
+ </message>
+ <message>
+ <source>11</source>
+ <translation type="obsolete">11</translation>
+ </message>
+ <message>
+ <source>12</source>
+ <translation type="obsolete">12</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="obsolete">4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation type="obsolete">5</translation>
+ </message>
+ <message>
+ <source>13</source>
+ <translation type="obsolete">13</translation>
+ </message>
+ <message>
+ <source>Listview</source>
+ <translation>منظر بالقائمة</translation>
+ </message>
+ <message>
+ <source>Things</source>
+ <translation>أشياء</translation>
+ </message>
+ <message>
+ <source>Text</source>
+ <translation>نصّ</translation>
+ </message>
+ <message>
+ <source>Stuff</source>
+ <translation>حاجة</translation>
+ </message>
+ <message>
+ <source>Airbrush</source>
+ <translation>Ùرشاة هوائية</translation>
+ </message>
+ <message>
+ <source>What stuff?</source>
+ <translation>أيّ حاجة؟</translation>
+ </message>
+ <message>
+ <source>Eraser</source>
+ <translation>ممحاة</translation>
+ </message>
+ <message>
+ <source>Here?</source>
+ <translation>هنا؟</translation>
+ </message>
+ <message>
+ <source>Pixmap item</source>
+ <translation>بند لخريطة عناصر الصّورة</translation>
+ </message>
+ <message>
+ <source>Nothing</source>
+ <translation>لا شيء</translation>
+ </message>
+ <message>
+ <source>Nothing Again</source>
+ <translation>لا شيء مجدّدا</translation>
+ </message>
+ <message>
+ <source>Pixmap subitem 1</source>
+ <translation>بند تحتي لخريطة عناصر الصّورة 1</translation>
+ </message>
+ <message>
+ <source>Subitem</source>
+ <translation>بند تحتي</translation>
+ </message>
+ <message>
+ <source>Pixmap subitem 2 </source>
+ <translation>بند تحتي لخريطة عناصر الصّورة 2</translation>
+ </message>
+ <message>
+ <source>Group box</source>
+ <translation>علبة المجموعة</translation>
+ </message>
+ <message>
+ <source>Pick a base color:</source>
+ <translation>اختر لونا قاعديّا:</translation>
+ </message>
+ <message>
+ <source>&amp;Reset colors</source>
+ <translation>إ&amp;عادة وضع الألوان</translation>
+ </message>
+ <message>
+ <source>pale green</source>
+ <translation>أخضر شاحب</translation>
+ </message>
+ <message>
+ <source>deep sky blue</source>
+ <translation>أزرق سماوي عميق</translation>
+ </message>
+ <message>
+ <source>steel blue</source>
+ <translation>أزرق Ùولاذي</translation>
+ </message>
+ <message>
+ <source>powder blue</source>
+ <translation>أزرق مسحوقي</translation>
+ </message>
+ <message>
+ <source>sandy brown</source>
+ <translation>بنّي رملي</translation>
+ </message>
+ <message>
+ <source>dark orange</source>
+ <translation>برتقالي داكن</translation>
+ </message>
+ <message>
+ <source>indian red</source>
+ <translation>أحمر هندي</translation>
+ </message>
+ <message>
+ <source>hot pink</source>
+ <translation>وردي حارّ</translation>
+ </message>
+ <message>
+ <source>Enter a color name and hit return:</source>
+ <translation>أدخل إسم لون و إظغط على عودة:</translation>
+ </message>
+ <message>
+ <source>Color test area</source>
+ <translation>منطقة تجربة اللّون</translation>
+ </message>
+ <message>
+ <source>Check boxes</source>
+ <translation>علب الÙحص</translation>
+ </message>
+ <message>
+ <source>Apples</source>
+ <translation>تÙّاح</translation>
+ </message>
+ <message>
+ <source>Banana</source>
+ <translation>موزة</translation>
+ </message>
+ <message>
+ <source>Orange</source>
+ <translation>برتقالي</translation>
+ </message>
+ <message>
+ <source>Radio buttons</source>
+ <translation>أزرار إذاعية</translation>
+ </message>
+ <message>
+ <source>Sprite</source>
+ <translation>شبح</translation>
+ </message>
+ <message>
+ <source>Farris</source>
+ <translation>Ùاريس</translation>
+ </message>
+ <message>
+ <source>Solo</source>
+ <translation>وحيد</translation>
+ </message>
+ <message>
+ <source>Date/Time editors</source>
+ <translation>المحرّرات تاريخ\زمن</translation>
+ </message>
+ <message>
+ <source>DateTime string goes here!</source>
+ <translation>السّلسلة تاريخ\زمن تأتي هنا!</translation>
+ </message>
+ <message>
+ <source>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation type="obsolete">&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;نصّ غنيّ&lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt تدعم النّصوص الغنيّة المقاسة، كالعنوان الآنÙØŒ النّصوص &lt;i&gt;&lt;font &gt;المائلة&lt;/font&gt;&lt;/i&gt;ØŒ &lt;b&gt;&lt;font &gt;البيّنة &lt;/font&gt;&lt;/b&gt;Ùˆ &lt;u&gt;&lt;font &gt;المسطّرة&lt;/font&gt;&lt;/u&gt;ØŒ كما تدعم النّصوص الملوّنة كذلك. هذا &lt;font color=&quot;#ff0000&quot; &gt;أحمر&lt;/font&gt;ØŒ بينما هذا &lt;font color=&quot;#00bb00&quot; &gt;أخضر&lt;/font&gt;ØŒ Ùˆ هذا &lt;font color=&quot;#0000ff&quot; &gt;أزرق&lt;/font&gt;.
+&lt;/p&gt;
+&lt;&gt; &lt;/&gt;</translation>
+ </message>
+ <message>
+ <source>Check Boxes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apple</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cherry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Radio Buttons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Whisky</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Water</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Date/Time Editors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Group Box</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter a color and hit return:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot;font-size:8pt;font-family:MS Shell Dlg&quot;&gt;
+&lt;p style=&quot;margin-top:16px&quot;&gt;&lt;span style=&quot;font-size:12pt;font-weight:600&quot;&gt;Rich Text&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports rich text. This is &lt;span style=&quot;font-style:italic&quot;&gt;italics&lt;/span&gt;, this is &lt;span style=&quot;font-weight:600&quot;&gt;bold&lt;/span&gt;, this is &lt;span style=&quot;text-decoration:underline&quot;&gt;underlined&lt;/span&gt;, this is &lt;span style=&quot;color:#ff0000&quot;&gt;red&lt;/span&gt;, this is &lt;span style=&quot;color:#00ff00&quot;&gt;green&lt;/span&gt;, and this is &lt;span style=&quot;color:#0000ff&quot;&gt;blue&lt;/span&gt;.&lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Icon View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Standard paint tool</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inbox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>143 messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(5 new)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Local</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Draft #1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot;font-size:8pt;font-family:MS Shell Dlg&quot;&gt;
+&lt;p style=&quot;margin-top:18px&quot;&gt;&lt;span style=&quot;font-size:9pt;font-weight:600&quot;&gt;Richtext &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;span style=&quot;font-style:italic&quot;&gt;emphasized&lt;/span&gt;, &lt;span style=&quot;font-weight:600&quot;&gt;bold &lt;/span&gt;and &lt;span style=&quot;text-decoration:underline&quot;&gt;underlined &lt;/span&gt;text, as well as colored text. This is &lt;span style=&quot;color:#ff0000&quot;&gt;red&lt;/span&gt;, while this is &lt;span style=&quot;color:#00bb00&quot;&gt;green&lt;/span&gt;, and this is &lt;span style=&quot;color:#0000ff&quot;&gt;blue&lt;/span&gt;. &lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/demo/translations/demo_de.qm b/examples/demo/translations/demo_de.qm
new file mode 100644
index 0000000..bc1d3d8
--- /dev/null
+++ b/examples/demo/translations/demo_de.qm
Binary files differ
diff --git a/examples/demo/translations/demo_de.ts b/examples/demo/translations/demo_de.ts
new file mode 100644
index 0000000..f4ecc2c
--- /dev/null
+++ b/examples/demo/translations/demo_de.ts
@@ -0,0 +1,1183 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>BookForm</name>
+ <message encoding="UTF-8">
+ <source>Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Surname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>surname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Forename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>forename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>surname ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>forename ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>(default)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>author</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Notes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>notes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Connect...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Edit Books</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ConnectDialog</name>
+ <message encoding="UTF-8">
+ <source>Connect...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connection settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Database Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Username:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Hostname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>P&amp;ort:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>D&amp;river</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DnDDemoBase</name>
+ <message encoding="UTF-8">
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>EditBookForm</name>
+ <message encoding="UTF-8">
+ <source>Edit Books</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>(default)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Update</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>|&lt; &amp;First</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;&lt; &amp;Prev</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Next &gt;&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Last &gt;|</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Author</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>author_view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Frame</name>
+ <message>
+ <source>Qt Demo Collection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Datei</translation>
+ </message>
+ <message>
+ <source>St&amp;yle</source>
+ <translation>St&amp;yle</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>GLLandscapeViewer</name>
+ <message encoding="UTF-8">
+ <source>Qt/OpenGL example</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>X-rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Y-rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Z-rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rendering mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Wireframe</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Fl&amp;at shaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Smooth shaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Landscape</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Fractalize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Reset grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Animate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Zoom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GLWorkspace</name>
+ <message>
+ <source>&amp;Scene</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wirebox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Wirebox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Gear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Gears</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Texture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Texture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Window Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Window Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Low Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Medium Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Medium Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;High Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Setup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Setup...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>WireBox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Nurbs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpWindow</name>
+ <message>
+ <source>&amp;New Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Forward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Home</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Datei</translation>
+ </message>
+ <message>
+ <source>&amp;Go</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bookmarks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>I18nDemo</name>
+ <message>
+ <source>Close the current window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close all opened windows.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tile opened windows.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cascade opened windows.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cascade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>--language--</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>KAstTopLevel</name>
+ <message>
+ <source>Score</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ships</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fuel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Press N to start playing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ship Destroyed. Press L to launch.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Game Over!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>KAsteroidsView</name>
+ <message>
+ <source>QCanvas demo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This game has been implemented using the QCanvas class.
+The QCanvas class is not part of the Professional Edition. Please
+contact Trolltech if you want to upgrade to the Enterprise Edition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PrintPreview</name>
+ <message encoding="UTF-8">
+ <source>Print Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>TextLabel1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Modify</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Invert Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Mirror</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Flip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Discard</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>SqlEx</name>
+ <message encoding="UTF-8">
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Tables</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>SQL Query</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Submit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>C&amp;lear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Press &quot;Connect&quot; to open a database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Connect...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TextEdit</name>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Datei</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>For&amp;mat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Standard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bullet List (Disc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bullet List (Circle)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bullet List (Square)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ordered List (Decimal)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha lower)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha upper)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;enter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Justify</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Color...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>noname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HTML-Files (*.htm *.html);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>WidgetsBase</name>
+ <message encoding="UTF-8">
+ <source>Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Applix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Binary</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Core</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Deb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pdf</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Readme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Shellscript</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Recycled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Video</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Iconview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 13</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 14</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 15</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 16</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 17</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Table</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Tables</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>are</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>easy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>with</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>13</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Listview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Things</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Stuff</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Airbrush</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>What stuff?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Eraser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Here?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Nothing Again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap subitem 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Subitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap subitem 2 </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Group box</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pick a base color:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Reset colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>pale green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>deep sky blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>steel blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>powder blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>sandy brown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>dark orange</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>indian red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>hot pink</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter a color name and hit return:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Color test area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Check boxes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apples</source>
+ <translation>Äpfel</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Banana</source>
+ <translation>Banane</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Orange</source>
+ <translation>Orange</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Radio buttons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sprite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Farris</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Solo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Date/Time editors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>DateTime string goes here!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/demo/translations/demo_fr.qm b/examples/demo/translations/demo_fr.qm
new file mode 100644
index 0000000..6bd22c4
--- /dev/null
+++ b/examples/demo/translations/demo_fr.qm
Binary files differ
diff --git a/examples/demo/translations/demo_fr.ts b/examples/demo/translations/demo_fr.ts
new file mode 100644
index 0000000..67d4534
--- /dev/null
+++ b/examples/demo/translations/demo_fr.ts
@@ -0,0 +1,1183 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>BookForm</name>
+ <message encoding="UTF-8">
+ <source>Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Surname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>surname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Forename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>forename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>surname ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>forename ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>(default)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>author</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Notes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>notes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Connect...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Edit Books</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ConnectDialog</name>
+ <message encoding="UTF-8">
+ <source>Connect...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connection settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Database Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Username:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Hostname:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>P&amp;ort:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>D&amp;river</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DnDDemoBase</name>
+ <message encoding="UTF-8">
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>EditBookForm</name>
+ <message encoding="UTF-8">
+ <source>Edit Books</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title ASC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>(default)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>price</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Insert</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Update</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>|&lt; &amp;First</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;&lt; &amp;Prev</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Next &gt;&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Last &gt;|</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Author</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>author_view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Frame</name>
+ <message>
+ <source>Qt Demo Collection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>St&amp;yle</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>GLLandscapeViewer</name>
+ <message encoding="UTF-8">
+ <source>Qt/OpenGL example</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>X-rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Y-rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Z-rotation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rendering mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Wireframe</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Fl&amp;at shaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Smooth shaded</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Landscape</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Fractalize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Reset grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Animate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Zoom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GLWorkspace</name>
+ <message>
+ <source>&amp;Scene</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wirebox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Wirebox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Gear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Gears</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Texture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Texture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Window Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Window Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Low Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Low Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Medium Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Medium Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>High Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;High Resolution</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Setup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Setup...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>WireBox</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Nurbs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HelpWindow</name>
+ <message>
+ <source>&amp;New Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Forward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Home</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Bookmark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Go</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bookmarks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Backward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>I18nDemo</name>
+ <message>
+ <source>Close the current window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close all opened windows.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tile opened windows.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cascade opened windows.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cascade</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>--language--</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>KAstTopLevel</name>
+ <message>
+ <source>Score</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ships</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fuel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Press N to start playing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ship Destroyed. Press L to launch.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Game Over!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>KAsteroidsView</name>
+ <message>
+ <source>QCanvas demo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This game has been implemented using the QCanvas class.
+The QCanvas class is not part of the Professional Edition. Please
+contact Trolltech if you want to upgrade to the Enterprise Edition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PrintPreview</name>
+ <message encoding="UTF-8">
+ <source>Print Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>TextLabel1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Modify</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Invert Colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Mirror</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Flip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Discard</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>SqlEx</name>
+ <message encoding="UTF-8">
+ <source>Form1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Tables</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>SQL Query</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Submit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>C&amp;lear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Press &quot;Connect&quot; to open a database</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Connect...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TextEdit</name>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>For&amp;mat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Standard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bullet List (Disc)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bullet List (Circle)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bullet List (Square)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ordered List (Decimal)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha lower)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha upper)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;enter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Justify</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Color...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>noname</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HTML-Files (*.htm *.html);;All Files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>WidgetsBase</name>
+ <message encoding="UTF-8">
+ <source>Widgets</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Applix</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Binary</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Core</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Deb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pdf</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Readme</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Shellscript</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Recycled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Video</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Iconview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 13</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 14</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 15</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 16</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 17</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Table</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Tables</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>are</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>easy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>with</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>13</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Listview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Things</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Stuff</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Airbrush</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>What stuff?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Eraser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Here?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap item</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Nothing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Nothing Again</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap subitem 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Subitem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap subitem 2 </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Group box</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pick a base color:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Reset colors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>pale green</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>deep sky blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>steel blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>powder blue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>sandy brown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>dark orange</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>indian red</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>hot pink</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter a color name and hit return:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Color test area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Check boxes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apples</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Banana</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Orange</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Radio buttons</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sprite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Farris</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Solo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Date/Time editors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>DateTime string goes here!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/demo/translations/demo_he.qm b/examples/demo/translations/demo_he.qm
new file mode 100644
index 0000000..34478f1
--- /dev/null
+++ b/examples/demo/translations/demo_he.qm
Binary files differ
diff --git a/examples/demo/translations/demo_he.ts b/examples/demo/translations/demo_he.ts
new file mode 100644
index 0000000..e61a4c4
--- /dev/null
+++ b/examples/demo/translations/demo_he.ts
@@ -0,0 +1,1189 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>BookForm</name>
+ <message encoding="UTF-8">
+ <source>Book</source>
+ <translation>ספר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Surname</source>
+ <translation>×©× ×ž×©×¤×—×”</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>surname</source>
+ <translation>×©× ×ž×©×¤×—×”</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Forename</source>
+ <translation>×©× ×¤×¨×˜×™</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>forename</source>
+ <translation>×©× ×¤×¨×˜×™</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>surname ASC</source>
+ <translation>×©× ×ž×©×¤×—×” ASC</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>forename ASC</source>
+ <translation>×©× ×¤×¨×˜×™ ASC</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>(default)</source>
+ <translation>(ברירת מחדל)</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>author</source>
+ <translation>מחבר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Title</source>
+ <translation>כותרת</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title</source>
+ <translation>כותרת</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Price</source>
+ <translation>מחיר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>price</source>
+ <translation>מחיר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Notes</source>
+ <translation>הערות</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>notes</source>
+ <translation>הערות</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title ASC</source>
+ <translation>כותרת ASC</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>book</source>
+ <translation>ספר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Connect...</source>
+ <translation>&amp;התחברות...</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Edit Books</source>
+ <translation>&amp;ערוך ספרי×</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>ConnectDialog</name>
+ <message encoding="UTF-8">
+ <source>Connect...</source>
+ <translation>התחברות...</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Connection settings</source>
+ <translation>הגדרות התחברות</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Database Name:</source>
+ <translation>×©× ×ž×¡×“ הנתוני×:</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Username:</source>
+ <translation>&amp;×©× ×ž×©×ª×ž×©:</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Password:</source>
+ <translation>&amp;סיסמה:</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Hostname:</source>
+ <translation>×©× &amp;מ×רח:</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>P&amp;ort:</source>
+ <translation>&amp;יצי××”:</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Default</source>
+ <translation>ברירת מחדל</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>D&amp;river</source>
+ <translation>מ&amp;נהל התקן</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;OK</source>
+ <translation>&amp;×ישור</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Cancel</source>
+ <translation>&amp;ביטול</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>DnDDemoBase</name>
+ <message encoding="UTF-8">
+ <source>Form1</source>
+ <translation>טופס1</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>EditBookForm</name>
+ <message encoding="UTF-8">
+ <source>Edit Books</source>
+ <translation>ערוך ספרי×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title ASC</source>
+ <translation>כותרת ASC</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>(default)</source>
+ <translation>(ברירת מחדל)</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>book</source>
+ <translation>ספר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Price</source>
+ <translation>מחיר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Title</source>
+ <translation>כותרת</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>title</source>
+ <translation>כותרת</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>price</source>
+ <translation>מחיר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Insert</source>
+ <translation>ה&amp;וסף</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Update</source>
+ <translation>&amp;עדכן</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Delete</source>
+ <translation>&amp;מחק</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Close</source>
+ <translation>&amp;סגור</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>|&lt; &amp;First</source>
+ <translation>|&lt; ×”&amp;ר×שון</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;&lt; &amp;Prev</source>
+ <translation>&lt;&lt; הקו&amp;ד×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Next &gt;&gt;</source>
+ <translation>×”&amp;×‘× &gt;&gt;</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Last &gt;|</source>
+ <translation>×”×&amp;חרון &gt;|</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Author</source>
+ <translation>מחבר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>author_view</source>
+ <translation>תצוגת_מחבר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>name</source>
+ <translation>ש×</translation>
+ </message>
+</context>
+<context>
+ <name>Frame</name>
+ <message>
+ <source>Qt Demo Collection</source>
+ <translation>×וסף ההדגמות של Qt</translation>
+ </message>
+ <message>
+ <source>&amp;Exit</source>
+ <translation>&amp;יצי××”</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;קובץ</translation>
+ </message>
+ <message>
+ <source>St&amp;yle</source>
+ <translation>&amp;סגנון</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>GLLandscapeViewer</name>
+ <message encoding="UTF-8">
+ <source>Qt/OpenGL example</source>
+ <translation>הדגמה של Qt/OpenGL</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>X-rotation</source>
+ <translation>סיבוב על ציר X</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Y-rotation</source>
+ <translation>סיבוב על ציר Y</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Z-rotation</source>
+ <translation>סיבוב על ציר Z</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rendering mode</source>
+ <translation>מצב הצגה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Wireframe</source>
+ <translation>&amp;רשת</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Fl&amp;at shaded</source>
+ <translation>&amp;שטוח</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Smooth shaded</source>
+ <translation>&amp;חלק</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Landscape</source>
+ <translation>&amp;פני שטח</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Fractalize</source>
+ <translation>&amp;Fractalize</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Reset grid</source>
+ <translation>&amp;×פס רשת</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Animate</source>
+ <translation>&amp;הנפש</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Zoom</source>
+ <translation>התקרבות</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Size</source>
+ <translation>גודל</translation>
+ </message>
+</context>
+<context>
+ <name>GLWorkspace</name>
+ <message>
+ <source>&amp;Scene</source>
+ <translation>ס&amp;צינה</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;חדש</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation>חדש</translation>
+ </message>
+ <message>
+ <source>Wirebox</source>
+ <translation>תיבה</translation>
+ </message>
+ <message>
+ <source>&amp;Wirebox</source>
+ <translation>&amp;תיבה</translation>
+ </message>
+ <message>
+ <source>Gear</source>
+ <translation>גלגלי שיניי×</translation>
+ </message>
+ <message>
+ <source>&amp;Gears</source>
+ <translation>&amp;גלגלי שיניי×</translation>
+ </message>
+ <message>
+ <source>Texture</source>
+ <translation>טקסטורה</translation>
+ </message>
+ <message>
+ <source>&amp;Texture</source>
+ <translation>&amp;טקסטורה</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>ה&amp;דפס</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>הדפס</translation>
+ </message>
+ <message>
+ <source>Window Size</source>
+ <translation>גודל החלון</translation>
+ </message>
+ <message>
+ <source>&amp;Window Size</source>
+ <translation>&amp;גודל החלון</translation>
+ </message>
+ <message>
+ <source>Low Resolution</source>
+ <translation>רזולוציה נמוכה</translation>
+ </message>
+ <message>
+ <source>&amp;Low Resolution</source>
+ <translation>רזולוציה &amp;נמוכה</translation>
+ </message>
+ <message>
+ <source>Medium Resolution</source>
+ <translation>רזולוציה בינונית</translation>
+ </message>
+ <message>
+ <source>&amp;Medium Resolution</source>
+ <translation>רזולוציה &amp;בינונית</translation>
+ </message>
+ <message>
+ <source>High Resolution</source>
+ <translation>רזולוציה גבוהה</translation>
+ </message>
+ <message>
+ <source>&amp;High Resolution</source>
+ <translation>רזולוציה &amp;גבוהה</translation>
+ </message>
+ <message>
+ <source>Setup</source>
+ <translation>הגדרות</translation>
+ </message>
+ <message>
+ <source>&amp;Setup...</source>
+ <translation>&amp;הגדרות...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>סגור</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;סגור</translation>
+ </message>
+ <message>
+ <source>WireBox</source>
+ <translation>תיבה</translation>
+ </message>
+ <message>
+ <source>Nurbs</source>
+ <translation>עקומות</translation>
+ </message>
+</context>
+<context>
+ <name>HelpWindow</name>
+ <message>
+ <source>&amp;New Window</source>
+ <translation>&amp;חלון חדש</translation>
+ </message>
+ <message>
+ <source>&amp;Open File</source>
+ <translation>&amp;פתח קובץ</translation>
+ </message>
+ <message>
+ <source>&amp;Print</source>
+ <translation>ה&amp;דפס</translation>
+ </message>
+ <message>
+ <source>&amp;Backward</source>
+ <translation>&amp;×חורה</translation>
+ </message>
+ <message>
+ <source>&amp;Forward</source>
+ <translation>ק&amp;דימה</translation>
+ </message>
+ <message>
+ <source>&amp;Home</source>
+ <translation>ה&amp;ביתה</translation>
+ </message>
+ <message>
+ <source>Add Bookmark</source>
+ <translation>הוסף סימניה</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;קובץ</translation>
+ </message>
+ <message>
+ <source>&amp;Go</source>
+ <translation>&amp;מעבר</translation>
+ </message>
+ <message>
+ <source>History</source>
+ <translation>היסטוריה</translation>
+ </message>
+ <message>
+ <source>Bookmarks</source>
+ <translation>סימניות</translation>
+ </message>
+ <message>
+ <source>Backward</source>
+ <translation>×חורה</translation>
+ </message>
+ <message>
+ <source>Forward</source>
+ <translation>קדימה</translation>
+ </message>
+ <message>
+ <source>Home</source>
+ <translation>הביתה</translation>
+ </message>
+</context>
+<context>
+ <name>I18nDemo</name>
+ <message>
+ <source>Close the current window.</source>
+ <translation>סגירת החלון הנוכחי.</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>סגור</translation>
+ </message>
+ <message>
+ <source>Close all opened windows.</source>
+ <translation>סגירת כל החלונות הפתוחי×.</translation>
+ </message>
+ <message>
+ <source>Close All</source>
+ <translation>סגור הכל</translation>
+ </message>
+ <message>
+ <source>Tile opened windows.</source>
+ <translation>פרישת החלונות הפתוחי×.</translation>
+ </message>
+ <message>
+ <source>Tile</source>
+ <translation>פרוש</translation>
+ </message>
+ <message>
+ <source>Cascade opened windows.</source>
+ <translation>סידור כל החלונות ×”×¤×ª×•×—×™× ×‘×¦×•×¨×” מדורגת.</translation>
+ </message>
+ <message>
+ <source>Cascade</source>
+ <translation>דרג</translation>
+ </message>
+ <message>
+ <source>--language--</source>
+ <translation>--שפה--</translation>
+ </message>
+ <message>
+ <source>&lt;h3&gt;About Qt&lt;/h3&gt;&lt;p&gt;This program uses Qt version %1, a multiplatform C++ GUI toolkit from Trolltech. Qt provides single-source portability across Windows 95/98/NT/2000, Linux, Solaris, HP-UX and many other versions of Unix with X11.&lt;/p&gt;&lt;p&gt;See &lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; for more information.&lt;/p&gt;</source>
+ <translation>&lt;div dir=rtl&gt;&lt;h3&gt;×ודות Qt&lt;/h3&gt;&lt;/div&gt;&lt;p dir=rtl&gt;תוכנית זו עושה שימוש ב-Qt מרובת פלטפורמות גירסה %1, ערכת כלי ממשק משתמש גרפי ל-++C מ-Qt .Trolltech מספקת ניידות קוד מקור יחיד בין Windows 95/98/NT/2000, Linux, Solaris, HP-UX וגירס×ות רבות נוספות של יוניקס ×¢× X11.&lt;/p&gt;&lt;p dir=rtl&gt;עיין ב-&lt;tt&gt;http://www.trolltech.com/qt/&lt;/tt&gt; למידע נוסף.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>KAstTopLevel</name>
+ <message>
+ <source>Score</source>
+ <translation>ניקוד</translation>
+ </message>
+ <message>
+ <source>Level</source>
+ <translation>שלב</translation>
+ </message>
+ <message>
+ <source>Ships</source>
+ <translation>ספינות</translation>
+ </message>
+ <message>
+ <source>Fuel</source>
+ <translation>דלק</translation>
+ </message>
+ <message>
+ <source>Press N to start playing</source>
+ <translation>הקש N כדי להתחיל לשחק</translation>
+ </message>
+ <message>
+ <source>Ship Destroyed. Press L to launch.</source>
+ <translation>הספינה הושמדה. הקש L לשיגור.</translation>
+ </message>
+ <message>
+ <source>Game Over!</source>
+ <translation>המשחק הסתיי×!</translation>
+ </message>
+</context>
+<context>
+ <name>KAsteroidsView</name>
+ <message>
+ <source>QCanvas demo</source>
+ <translation>הדגמה של QCanvas</translation>
+ </message>
+ <message>
+ <source>This game has been implemented using the QCanvas class.
+The QCanvas class is not part of the Professional Edition. Please
+contact Trolltech if you want to upgrade to the Enterprise Edition.</source>
+ <translation>משחק ×–×” ×™×•×©× ×‘×מצעות המחלקה QCanvas.
+המחלקה QCanvas ××™× ×” חלק מהמהדורה המקצועית. ×× ×
+צור קשר ×¢× Trolltech ×× ×‘×¨×¦×•× ×š לשדרג למהדורה העסקית.</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>PrintPreview</name>
+ <message encoding="UTF-8">
+ <source>Print Preview</source>
+ <translation>תצוגה לפני הדפסה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Preview</source>
+ <translation>תצוגה מקדימה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>TextLabel1</source>
+ <translation>תווית טקסט 1</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Modify</source>
+ <translation>שנה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Invert Colors</source>
+ <translation>&amp;הפוך צבעי×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Mirror</source>
+ <translation>×”&amp;פוך ×ופקית</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Flip</source>
+ <translation>הפוך ×&amp;נכית</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;left</source>
+ <translation>סובב 90° &amp;שמ×לה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Rotate 90° &amp;right</source>
+ <translation>סובב 90° &amp;ימינה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Help</source>
+ <translation>&amp;עזרה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Print</source>
+ <translation>ה&amp;דפס</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Discard</source>
+ <translation>&amp;ביטול</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>SqlEx</name>
+ <message encoding="UTF-8">
+ <source>Form1</source>
+ <translation>טופס1</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Tables</source>
+ <translation>טבל×ות</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Type</source>
+ <translation>סוג</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Required</source>
+ <translation>נדרש</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>SQL Query</source>
+ <translation>ש×ילתת SQL</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Submit</source>
+ <translation>&amp;שלח</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>C&amp;lear</source>
+ <translation>&amp;נקה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Press &quot;Connect&quot; to open a database</source>
+ <translation>לחץ על &quot;התחברות&quot; כדי לפתוח מסד נתוני×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Connect...</source>
+ <translation>&amp;התחברות...</translation>
+ </message>
+</context>
+<context>
+ <name>TextEdit</name>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;קובץ</translation>
+ </message>
+ <message>
+ <source>New</source>
+ <translation>חדש</translation>
+ </message>
+ <message>
+ <source>&amp;New...</source>
+ <translation>&amp;חדש...</translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation>פתח</translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation>&amp;פתיחה...</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>שמור</translation>
+ </message>
+ <message>
+ <source>&amp;Save...</source>
+ <translation>&amp;שמירה...</translation>
+ </message>
+ <message>
+ <source>Save As</source>
+ <translation>שמירה בש×</translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation>שמירה &amp;בש×...</translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation>הדפס</translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation>ה&amp;דפסה...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation>סגור</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;סגור</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;עריכה</translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation>בטל</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;בטל</translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation>בצע שוב</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>בצע &amp;שוב</translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation>גזור</translation>
+ </message>
+ <message>
+ <source>&amp;Cut</source>
+ <translation>&amp;גזור</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>העתק</translation>
+ </message>
+ <message>
+ <source>C&amp;opy</source>
+ <translation>הע&amp;תק</translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation>הדבק</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>ה&amp;דבק</translation>
+ </message>
+ <message>
+ <source>For&amp;mat</source>
+ <translation>עי&amp;צוב</translation>
+ </message>
+ <message>
+ <source>Standard</source>
+ <translation>סטנדרטי</translation>
+ </message>
+ <message>
+ <source>Bullet List (Disc)</source>
+ <translation>רשימת ×ª×‘×œ×™×˜×™× ×ž×œ××™×</translation>
+ </message>
+ <message>
+ <source>Bullet List (Circle)</source>
+ <translation>רשימת ×ª×‘×œ×™×˜×™× ×¢×’×•×œ×™×</translation>
+ </message>
+ <message>
+ <source>Bullet List (Square)</source>
+ <translation>רשימת ×ª×‘×œ×™×˜×™× ×ž×¨×•×‘×¢×™×</translation>
+ </message>
+ <message>
+ <source>Ordered List (Decimal)</source>
+ <translation>רשימה מסודרת לפי מספרי×</translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha lower)</source>
+ <translation>רשימה מסודרת לפי ×ותיות קטנות</translation>
+ </message>
+ <message>
+ <source>Ordered List (Alpha upper)</source>
+ <translation>רשימה מסודרת לפי ×ותיות רישיות</translation>
+ </message>
+ <message>
+ <source>Bold</source>
+ <translation>מודגש</translation>
+ </message>
+ <message>
+ <source>&amp;Bold</source>
+ <translation>&amp;מודגש</translation>
+ </message>
+ <message>
+ <source>Italic</source>
+ <translation>נטוי</translation>
+ </message>
+ <message>
+ <source>&amp;Italic</source>
+ <translation>&amp;נטוי</translation>
+ </message>
+ <message>
+ <source>Underline</source>
+ <translation>קו תחתי</translation>
+ </message>
+ <message>
+ <source>&amp;Underline</source>
+ <translation>&amp;קו תחתי</translation>
+ </message>
+ <message>
+ <source>Left</source>
+ <translation>שמ×לה</translation>
+ </message>
+ <message>
+ <source>&amp;Left</source>
+ <translation>שמ×&amp;לה</translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation>מרכז</translation>
+ </message>
+ <message>
+ <source>C&amp;enter</source>
+ <translation>מ&amp;רכז</translation>
+ </message>
+ <message>
+ <source>Right</source>
+ <translation>ימינה</translation>
+ </message>
+ <message>
+ <source>&amp;Right</source>
+ <translation>&amp;ימינה</translation>
+ </message>
+ <message>
+ <source>Justify</source>
+ <translation>יישר</translation>
+ </message>
+ <message>
+ <source>&amp;Justify</source>
+ <translation>יי&amp;שר</translation>
+ </message>
+ <message>
+ <source>Color</source>
+ <translation>צבע</translation>
+ </message>
+ <message>
+ <source>&amp;Color...</source>
+ <translation>&amp;צבע...</translation>
+ </message>
+ <message>
+ <source>noname</source>
+ <translation>×œ×œ× ×©×</translation>
+ </message>
+ <message>
+ <source>HTML-Files (*.htm *.html);;All Files (*)</source>
+ <translation>קבצי htm *.html) HTML.*);;כל ×”×§×‘×¦×™× (*)</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>WidgetsBase</name>
+ <message encoding="UTF-8">
+ <source>Widgets</source>
+ <translation>פריטי×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Applix</source>
+ <translation>Applix</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Binary</source>
+ <translation>קובץ בינרי</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Core</source>
+ <translation>ליבה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Deb</source>
+ <translation>Deb</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Document</source>
+ <translation>מסמך</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pdf</source>
+ <translation>Pdf</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Readme</source>
+ <translation>Readme</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Shellscript</source>
+ <translation>תסריט מעטפת</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Recycled</source>
+ <translation>ממוחזר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Video</source>
+ <translation>ויד×ו</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;Richtext &lt;/h1&gt;
+&lt;/p&gt;&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation>&lt;p&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;5&quot; &gt;טקסט עשיר &lt;/h1&gt;
+&lt;/p&gt;&lt;p dir=&quot;rtl&quot;&gt;Qt תומך בטקסט עשיר מעוצב, כמו בכותרת לעיל, טקסט &lt;i&gt;&lt;font &gt;נטוי&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;מודגש &lt;/font&gt;&lt;/b&gt;ו&lt;u&gt;&lt;font &gt;קו תחתי&lt;/font&gt;&lt;/u&gt;, וכן טקסט צבעוני. זהו &lt;font color=&quot;#ff0000&quot; &gt;×דו×&lt;/font&gt;, בעוד שזהו &lt;font color=&quot;#00bb00&quot; &gt;ירוק&lt;/font&gt;, וזהו &lt;font color=&quot;#0000ff&quot; &gt;כחול&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Iconview</source>
+ <translation>תצוגת סמלי×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 1</source>
+ <translation>פריט 1</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 2</source>
+ <translation>פריט 2</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 3</source>
+ <translation>פריט 3</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 4</source>
+ <translation>פריט 4</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 5</source>
+ <translation>פריט 5</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 6</source>
+ <translation>פריט 6</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 7</source>
+ <translation>פריט 7</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 8</source>
+ <translation>פריט 8</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 9</source>
+ <translation>פריט 9</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 10</source>
+ <translation>פריט 10</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 11</source>
+ <translation>פריט 11</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 12</source>
+ <translation>פריט 12</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 13</source>
+ <translation>פריט 13</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 14</source>
+ <translation>פריט 14</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 15</source>
+ <translation>פריט 15</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 16</source>
+ <translation>פריט 16</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Item 17</source>
+ <translation>פריט 17</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Table</source>
+ <translation>טבלה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Tables</source>
+ <translation>טבל×ות</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>are</source>
+ <translation>הן</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>easy</source>
+ <translation>עסק</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>with</source>
+ <translation>פשוט</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Qt</source>
+ <translation>×¢×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>6</source>
+ <translation>Qt</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>10</source>
+ <translation>10</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>11</source>
+ <translation>11</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>12</source>
+ <translation>12</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>13</source>
+ <translation>13</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Listview</source>
+ <translation>תצוגת רשימה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Things</source>
+ <translation>דברי×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Text</source>
+ <translation>טקסט</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Stuff</source>
+ <translation>×¢× ×™×™× ×™×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Airbrush</source>
+ <translation>מברשת ×וויר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>What stuff?</source>
+ <translation>××™×–×” ×¢× ×™×™× ×™×?</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Eraser</source>
+ <translation>מחק</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Here?</source>
+ <translation>×›×ן?</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap item</source>
+ <translation>פריט תמונה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Nothing</source>
+ <translation>כלו×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Nothing Again</source>
+ <translation>שוב כלו×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap subitem 1</source>
+ <translation>פריט משנה של תמונה 1</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Subitem</source>
+ <translation>פריט משנה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pixmap subitem 2 </source>
+ <translation>פריט משנה של תמונה 2</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Group box</source>
+ <translation>תיבת קבוצה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Pick a base color:</source>
+ <translation>בחר צבע בסיסי:</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;Reset colors</source>
+ <translation>&amp;×פס צבעי×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>pale green</source>
+ <translation>ירוק בהיר</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>deep sky blue</source>
+ <translation>כחול ×©×ž×™×™× ×›×”×”</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>steel blue</source>
+ <translation>כחול פלדה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>powder blue</source>
+ <translation>כחול ×בקתי</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>sandy brown</source>
+ <translation>×—×•× ×—×•×œ</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>dark orange</source>
+ <translation>×›×ª×•× ×›×”×”</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>indian red</source>
+ <translation>××“×•× ×ינדי×× ×™</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>hot pink</source>
+ <translation>ורוד ×—×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Enter a color name and hit return:</source>
+ <translation>הקלד ×©× ×©×œ צבע והקש על Return:</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Color test area</source>
+ <translation>×יזור לבדיקת הצבע</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Check boxes</source>
+ <translation>תיבות סימון</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Apples</source>
+ <translation>תפוחי×</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Banana</source>
+ <translation>בננה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Orange</source>
+ <translation>תפוז</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Radio buttons</source>
+ <translation>כפתורי בחירה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Sprite</source>
+ <translation>ספרייט</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Farris</source>
+ <translation>קולה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Solo</source>
+ <translation>פ×נטה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Date/Time editors</source>
+ <translation>עורכי ת×ריך\שעה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>DateTime string goes here!</source>
+ <translation>מקומה של מחרוזת הת×ריך והשעה</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;Richtext &lt;/h1&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;i&gt;&lt;font &gt;emphasized&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;bold &lt;/font&gt;&lt;/b&gt;and &lt;u&gt;&lt;font &gt;underlined &lt;/font&gt;&lt;/u&gt;text, as well as colored text. This is &lt;font color=&quot;#ff0000&quot; &gt;red&lt;/font&gt;, while this is &lt;font color=&quot;#00bb00&quot; &gt;green&lt;/font&gt;, and this is &lt;font color=&quot;#0000ff&quot; &gt;blue&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;
+</source>
+ <translation>&lt;div&gt;&lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot; &gt;טקסט עשיר &lt;/h1&gt;&lt;/div&gt;
+&lt;p&gt;Qt תומך בטקסט עשיר מעוצב, כמו בכותרת לעיל, טקסט &lt;i&gt;&lt;font &gt;נטוי&lt;/font&gt;&lt;/i&gt;, &lt;b&gt;&lt;font &gt;מודגש &lt;/font&gt;&lt;/b&gt;ו&lt;u&gt;&lt;font &gt;קו תחתי &lt;/font&gt;&lt;/u&gt;,וכן טקסט צבעוני. זהו &lt;font color=&quot;#ff0000&quot; &gt;×דו×&lt;/font&gt;, בעוד שזהו &lt;font color=&quot;#00bb00&quot; &gt;ירוק&lt;/font&gt;, וזהו &lt;font color=&quot;#0000ff&quot; &gt;כחול&lt;/font&gt;. &lt;/p&gt;
+&lt;&gt; &lt;/&gt;</translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/demo/widgets/widgetsbase.ui b/examples/demo/widgets/widgetsbase.ui
new file mode 100644
index 0000000..f84ed43
--- /dev/null
+++ b/examples/demo/widgets/widgetsbase.ui
@@ -0,0 +1,1269 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>WidgetsBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>WidgetsBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>626</width>
+ <height>575</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Widgets</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>PixmapLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Check Boxes</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Apple</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>CheckBox2</cstring>
+ </property>
+ <property name="text">
+ <string>Banana</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>CheckBox3</cstring>
+ </property>
+ <property name="text">
+ <string>Cherry</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Radio Buttons</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>RadioButton3</cstring>
+ </property>
+ <property name="text">
+ <string>Whisky</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>RadioButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Wine</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>RadioButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Water</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Date/Time Editors</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="AnalogClock" row="0" column="0" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>clock</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>75</width>
+ <height>75</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QDateEdit" row="1" column="1">
+ <property name="name">
+ <cstring>dateEdit</cstring>
+ </property>
+ <property name="date">
+ <date>
+ <year>2000</year>
+ <month>1</month>
+ <day>1</day>
+ </date>
+ </property>
+ </widget>
+ <widget class="QTimeEdit" row="2" column="1">
+ <property name="name">
+ <cstring>timeEdit</cstring>
+ </property>
+ <property name="time">
+ <time>
+ <hour>0</hour>
+ <minute>0</minute>
+ <second>0</second>
+ </time>
+ </property>
+ <property name="autoAdvance">
+ <bool>true</bool>
+ </property>
+ <property name="maxValue">
+ <time>
+ <hour>23</hour>
+ <minute>59</minute>
+ <second>59</second>
+ </time>
+ </property>
+ <property name="minValue">
+ <time>
+ <hour>0</hour>
+ <minute>0</minute>
+ <second>0</second>
+ </time>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>dateTimeLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>2</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Group Box</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLCDNumber" row="0" column="3" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>lcdDisplay</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits">
+ <number>2</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>Filled</enum>
+ </property>
+ </widget>
+ <widget class="QSlider" row="2" column="2">
+ <property name="name">
+ <cstring>slider</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Left</enum>
+ </property>
+ <property name="tickInterval">
+ <number>5</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Pick a base color:</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>pushButton</cstring>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="text">
+ <string>&amp;Reset colors</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <item>
+ <property name="text">
+ <string>pale green</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>deep sky blue</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image2</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>steel blue</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image3</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>powder blue</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image4</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>sandy brown</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image5</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>dark orange</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image6</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>indian red</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image7</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>buttonColorBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>lineEdit</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>LineEditPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="text">
+ <string>hot pink</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>TextLabel1_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Enter a color and hit return:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>spinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QProgressBar" row="0" column="2">
+ <property name="name">
+ <cstring>progressBar</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>colorTest</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="text">
+ <string>Color test area</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox">
+ <item>
+ <property name="text">
+ <string>Applix</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Binary</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image9</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Core</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image10</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Deb</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image11</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Document</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image12</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Pdf</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image13</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Readme</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image14</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Shellscript</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image15</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Recycled</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image16</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Video</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image17</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ListBox3</cstring>
+ </property>
+ <property name="columnMode">
+ <enum>Variable</enum>
+ </property>
+ <property name="rowMode">
+ <enum>FitToHeight</enum>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>TextEdit1</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name="qrichtext" content="1" /&gt;&lt;/head&gt;&lt;body style="font-size:8pt;font-family:MS Shell Dlg"&gt;
+&lt;p style="margin-top:16px"&gt;&lt;span style="font-size:12pt;font-weight:600"&gt;Rich Text&lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports rich text. This is &lt;span style="font-style:italic"&gt;italics&lt;/span&gt;, this is &lt;span style="font-weight:600"&gt;bold&lt;/span&gt;, this is &lt;span style="text-decoration:underline"&gt;underlined&lt;/span&gt;, this is &lt;span style="color:#ff0000"&gt;red&lt;/span&gt;, this is &lt;span style="color:#00ff00"&gt;green&lt;/span&gt;, and this is &lt;span style="color:#0000ff"&gt;blue&lt;/span&gt;.&lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Icon View</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QIconView" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>Item 1</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image18</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 2</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image19</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 3</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image20</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 4</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image21</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 5</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image22</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 6</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image23</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 7</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image24</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 8</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image25</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 9</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image26</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 10</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image27</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 11</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image28</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 12</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image29</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 13</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image30</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 14</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image31</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 15</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image32</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 16</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image33</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 17</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image34</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>IconView1</cstring>
+ </property>
+ <property name="arrangement">
+ <enum>LeftToRight</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>List View</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Things</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Text</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Comment</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <item>
+ <property name="text">
+ <string>Airbrush</string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string>Standard paint tool</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image35</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap>image36</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string>Eraser</string>
+ </property>
+ <property name="text">
+ <string>Standard paint tool</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image37</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap>image36</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Inbox</string>
+ </property>
+ <property name="text">
+ <string>143 messages</string>
+ </property>
+ <property name="text">
+ <string>(5 new)</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image38</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <item>
+ <property name="text">
+ <string>Local</string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <item>
+ <property name="text">
+ <string>Draft #1</string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image39</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ </item>
+ <item>
+ <property name="text">
+ <string>Server</string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ </item>
+ <property name="name">
+ <cstring>ListView3</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Table</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QTable" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Tables</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>are</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>easy</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>with</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Qt</string>
+ </property>
+ </column>
+ <row>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image40</pixmap>
+ </property>
+ </row>
+ <row>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image39</pixmap>
+ </property>
+ </row>
+ <row>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image41</pixmap>
+ </property>
+ </row>
+ <property name="name">
+ <cstring>Table1</cstring>
+ </property>
+ <property name="numRows">
+ <number>13</number>
+ </property>
+ <property name="numCols">
+ <number>12</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>AnalogClock</class>
+ <header location="local">../aclock/aclock.h</header>
+ <sizehint>
+ <width>75</width>
+ <height>75</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>0</hordata>
+ <verdata>3</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image42</pixmap>
+ <slot access="public" specifier="">setTime(const QTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const QTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const QTime&amp;)</slot>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="30595">789cdd9c595323bb96a8dfcfafd871f476a2438d8d6d70dcb80f66c68027663afa4153667a66b00da6e3fef7bbb406d906ea14b54f45c7eede15b9cd47662a25ad594af3effff8e3ae73f1c73ffefd6f2f3333ebbb3f5c619efff8879f8fc7cbfff8cffffb5f7ffb7b696beb8f78d4b62b7f94fffe6f7ffbbb5afce1fe505bf81f722ff16e6463844b78de5c24c6f36ace5ce1fbbb89e9fe7761badfae98ee9f31efd2fdd626c6f3fe5298efef333bba3eb4894bdc7f7fc5ccfdb113e45d199f9926a6fe8d85b9fd3c31f5afc3cced994962ba5f09f3fd2631dddf66e6f1199b98ee6f08d3fd4e27a6f15784cbd47ec1cce3b7c3c4d4de9e30b5e7ab89f17c3613a6f60c3f4fe62fdc24a6f61e9945be2fcc3c9e70c92cfdb98f5c4af2cb34339fcf4e13e379ab84a9bfa1462cfdc92bc23c3f2f89e9fe4b611ecf8899fb9bcbf52c1f77c0ccfd57723ff7cfb488cbfc7c3b6096f1d3f9345e734e2cd72bc72cd75b66799e61e6fb0b9c8f726a3fbf4b4cf3571566fdd2ccdc5e5e4d4cfa72c42cf268106f4bff5e99f979999ce7f6fc3e723d5def99e5fa9dc4a41f1566d1ef4b66b14f6abf5ee1f61cca77bb94ae1f324b7f7b89a9fd7b62b95f85c478def1f515e93f9dafcbfd7e4e2cf767e3c478be6809b37f5b32f378dd2c31d9f385305daf9e99f9f96e3f31f55f58e6a39b98fa8ffa5f29c9f5454f98ede18a99ef572ba6f1dd09b37e305765be7462eaff1b7395e7e35998ee2fde99eb3c1ed4cf8aa9f2fcf8217395fd499399af5779621a5f5798ed6f425c2bf1f8d0bf54cba25fe68959e2c11171d5b33dd484cb75ecef1d71adc4cfdb16e6f19c24a6f35361f21785308f3fcc99f97939c6c7aa91fe29c5ccf2c8e979309eed12b6ef99b93d739698da3b15a6e7bbc0ccf3a5eac23cdfd25e9daecf67ccdcbfa223ccd7df2626fde809f3fd34df6687e7c7b8c4e44fbbc2747db6c7ccfd0f289f5a59ec2353c4b5fa36ca233f61e6e7872d616eef5c98ae37cfc4e9f94b61befe30315e1f8e98797eed6362badf09b37c5f99593f33b9becef3732dccf383e3af99646f19b1e87fd821de2951ffb36be62af52fbf15267db00fccfc3cbd2b4ccff3ef89a9bd3b61ba3fbb498ce7d59299e56d478969be9bc2d47e78484ced7b616ebf4dbccbf39f9f0b73be81f6b1b35de3f90b678969fe9e85f9fe1633f7a758104b7fcc03b1b41fb2c4d83fdf16a6fe996d6696673e4e4ce37915e6eb0f98793e0b254ce70bf44f3b56f43fbf2696f68a6766bedeee314bffdf12e3f54eaee7f92cf689eb3c9fd95298aeb7afc2ec2f50bebbdba2cf66c02cfa5267167b9e12ef56d91f1e0bb33e5c11a7e71d0bd3f37c8b59f4f39099e74bf585f97c2731c907f3a95d9bf4e55598e533606679f909b3f8ffb230db779198e4d915ae627d627ac4d29fc232f37cabc7c4243f1abf353c7e9398c7bf9598ae1f33f37c14e789c9dfa07d4238e7f361c42cf6bb9d98e6e74c98f5b1ce2cfe6f22ccfda909d3786dbabe6ab03f97c4a24fa125ccf1232396f1fa1233f7d76789491f9e852b349efbc4f83cdb66362cef3d613a9ff798033fcf09f37c49fb81da77e7c4b6ccfe6321ccfab24c4cf71f0bb37cc7cc35ceef1e12933d5c08b33ddf301bf6f73631e9ab13667f8ef978dd893f0c87c4c93f05669ecfacc7ccf20ab789717e02e983ab97e87cae13e3f9ec9e99e3952a84d95edf84e97e759e18eff787c2353c9fbd30b3bee5bbc4223fd3666679e40d6299df629418afd73561badece13933e72ff65fe434f98f32d69bf46f3a7af84b93f5e98da5727cc2c2fb39b98e2c79b30b5afd3f59ccf1d0bf3f32e85e9794eae0fd4be7e4d4cfef55d98db6f24a6fcfd4898ed5d25a6f6abc48ef55b4f1253fbfbc25c2fdc25a6f963f939d66f779f98f455eee7f95565669e1f85f99849fea69830737ccae7c4224f759618e5e98c30e95bb6cdccf20a7561badfdf27267d7c1266ff55656679b94298edc90bb3bedd08b33f3a4d4cf63415667b0acc2c4f5f24267f301066fb4ee779bea57f2ccfd04f4cfde90ab3ff1b0bf3f89b89b17fa64c9ce43f4f4cf21f0bb37ebd24a6f3c7c2acbf178969fedf84d99fbf26a678e98479fed2f3a87f5afac7faa5f3c4f47c25ccfd7389e9bc3c9fed39bc2626fd6f08b3ff61fd736ccfba9998da1b08f3f39e12933e6f09737c90feb1bcd57d62b28f8e30d73f3631e547e8df8c937c287b27369cff79cd2cf9d79d30f95b77c8ccfdf1c7c21c2f0e1293feec08733ca8108bbe170fc2acdfbbc26c7f9789291e979859ff0a9f98ec6f294cf7178fc4a26f619998e6a325ccf9fd7662ea5f10e6f83b4c4cf24eedb3becd12537f1ac2d41ff7c6ccfae59689497e7561ceaf6b89295e9484a93fba9d98f255791efb2797aee7f8ac98c55f1e09b3fe0d1393bfef0a537fd4696292ef9630e7c70789a93f37c2d41f7d9798ec51da137fd517e6f9b94b4cfd1d09b33f6f0a73fdb09b98e4c7e3f3ec7f544998e3e58330db03c6175b91fcdecd8945bfed9330e51be13a31e5038e59fc659d58e24dfece2cf2d863e6f92d66c4224fb710667f7b92989eb764e6fe6583c4a42fa7c2ac0f6789c99e47c26c6f9dc4d4fe0133cfbf1d0bb37fde4e4cfd75c29cef1789a93f323ec9bfae1253fcb821f6e2df771293bc2d33db4386fa67bde4f796e6cb4bfccc8f84693cf98330c94bbd33737fb39230dbefae305defa83f5efc81c999597feda930cbf73c313d9faff7922f607f5d55ea8d62482cfecd8d13d3f32f89933fda4d4cf1b124ccf7378559be07c2341ef3c22cfe63204cfaadaaccec2fb2a930c7b7e7c4249f9130e7cb1933c72b7b9398fc5d21ccf9b2494cf96e5998fd7320f6925f1c2626fbde16667fb69798ecbdce2cf5d34d62f2779930e7973bc23c7f3933c7f3fc2931f5f75a98aef734df5ee4616f996b3cff4de19d6d6cff8499fd817d11a6fbb39098f4450b73bcdb12a6f6f25a628bfa21d7f37c678bc4940f968539bf9924267fdf13e6f87e2dccfdbb10e6fc77264cfd51e97aea4f714c2cf254878949df3261ce471689c9de2ac21c2fabc26cff6789c9feb684391eb798251f5c24a6fc6c2accfaf49c98ce2f85d91f9e27267b48f7737cda1326fb323bcc921f961253fb5e989f1f1293beef0bf3fac77b62f2075698ed95e5e3a5fe2b12d3f364be593fd441629a6f9c3f5f15fdca2acce29f6e8559fffa8951deb92796786bcf84b95e1b24267f3415e6f5981361d6f727618ebf37c2f47c27edb1fc6c2d31f983be30e73793c4347ff23c969fb94e4cf1e74d98edbb9598ecfb5598fb5b4a4cfd95f18b3e6c25a6f32fc2349ea210de253e6466fd711789697c6d61d61f9b98e42de367fd312789299e778439df6c2526fb4fe739bfbb4d4cf9dd9130dbdb5662d297d41f1abfae0ab37ea5fbd95f6c33b3fe9adbc4341e234ce3edce12d3f99130d753c3c4a48fe7c29c4f5c24267bde13e67c3fddcff54dba9ec6935f1207f66fbe9b98fa7320ccf656494ce71f85d9bf9c2526fbb815e6fea5f678bdec8199f5dfcc13937fa5fe07d1cf7027ccf3df4f8cf3ef7366c987cb89495fd279f6bf9930d76fbbc2dcfe5362926f5798f43b0c98251f90feb0fc32698fe5e5cf13537f647c22af3c31d997f48fe5e747c26c8f9dc4942f3685a9ff3e9da7fe677562919fdd1766fb3a4e4cfd7b1266fb7a484cf97210e67ab79998f42db5cff6759498ecaf224ce3f1a78969fc17c21c9fa57f529f5e25267d9c09737ee01253bd6384d97fef09737e504e4cfab023ccebc167ccac4f19ce47a8a5785e12e6eb0db3a957f0fc31b3c8774f98c7db16667d9b0b93be6557c275877c2b6cb07ddb2496f92f6e8579fe5f1353be712fccfad417a6f9b63e31e5671d61ea4f7e9818cfab1a33c723ff26ccf3631293fce5f96cdfbe2c4cfd711561b6ef19b3c403793efb73ff28ccfa3e17e6fe4a7fa47ec1781982f8ff9c9e0ffa66707ef31d666edf5e0bf3f56d616abf3bd34a1badfeeca7b6dac1f1f1f36707ddbb76fcabfd40d928ed7ff311be71c4eb329dc3f19b9e4b71f75f9e937ced48bfc773f62732fd4d32899fbf452eb92e707ed70ffafdef96f74fe5f23be624c9c17c3ed6cfb3ac5676d3d7ee773cff37dacb473bf09f64f4a3ebddda3d7f057b59f34d3f920d1f9fecea2f672f5ffba8cff34d722a3ed8d75fcd5e06e2b3e073a847a839e3680bf8b3459bc023fe1e3ec7f1e9fc39fc8bd98bd7133d859e4559c8e70846f5a89fd826c6fa190e0bfca85fe2cf38eac0d7fe75ec65063df4d43be4a99ea31dc4112ef42bfe8e7a1dfdd61b1c2f7a89237ae751fd95ecc5a3b6444d1ba065d3efe69a62cc6b94156ad8b36ee83d1cc91b6be23e9cfb0bd90bcc7dae0f6014b1d78770704e86bdb7d8e368376ffa481fc3284e502e512653bceff477f9b2df229726f4a8893d8abd3e831e9feb0bddd26dddd15dddd397705ce96b7da36ff59dbe87df3fe82d944bbcaff4bb7cd96fb197035d861e29b0ea6d5d819e56754defe85d5d575a296594550e0eabbc0a2a53b92a545f0dd4503fa8910e6afcdf1a5f28764bfc5e8fed123316fa5d4d745b4dd5a37a52cfd0eb173553733ce66ab176c4dfcde0ecab7a534bf5ae1a6a4f1fab7dd0baf0e1191ffddb4ffddd77ec059ed08463a00e58f729871aab4375a48ed5899eaa53d55467ea5c5da816f4b68d7d9eab0e7f76550f8e051eab11c5e3525de95d75ad6ed4adbad30b75af1ef404da7e51fb6a0b46f80e722badd5456a3db7f813f682b15a95e39cc968d4368ca4a25f55153e6b6a47edaabaf2d05c472d8c523d63a0f73de8f5fab1c04ffc07e7bbc6e2a8e2788c71c69ba0df4c065edc83871fa1cf73a0b5cae4fa3b39c577ed85e5c2a3a13b4d8c0da6307d5d330333342392018e640cc7047ada49b2893fa34ccc348e84ff532223f3689eccb3793133b0b793380a98a9d8e39843bcafcbe35fb4976ccd5ee8689a39ccd7420dcdab79334bd417ec39ceb5c861fec581b231ef3c949e5166621a660f47f462f6cd01c8e7d01ca1b78e716a0ab23afe153ff6337b89b29003387ad15773624e4dd39c997318c104fad480ff4fb8b751d3d6e522f622238a5ac69a88c7050cac81f269e9ba699b8e3a8567c368d4911e99ee8f72ef3f175f926665e07d0b75628e55c3f4a081479c51ec0df6d0aef9ad55ef57f6b33ad75dd90efc1747f30ebf07eb3197e6ca5c9b1be8e1047a38c0bc20fb4e5efd1d7b89162f3231b7f0d98791dc81df8dbad5313659fb02e51065d24b76a3d6ecc3a07c7a660ffe35503e5df8c471456fc0a39f997bf360b64c09ec666e6e4df9ab9ae74fda8bf80fb19bbe6e9b6d887ed1922d5bc0047a3549b622beaaf7e1dfca96baf4892359b02c5776363715b09caaa981c597cdcea7b584fc53ffbe1f5fa2878c998a37bbe604645207a7223e094663158dc08ab6181cdd5c7c17c69b19fb396b2dd8fa6a7c5d6bd3753403e4a95bd659af4e6dc07c6d8eda66f4c466ffa2bdc47812b3c057b4936d6571240dd479b480289338069b838f52f25b35b385ed1b6d5acad90148f2d2688e9ef0cf0ed966ba186b66d1d6503b0dced04c793b32d7766cd76249f4d4e8adff7c3e36828c3efa94a85d773c9269940ac88434ab6bc51e504b6c01fecddba97db44ff6d9be186f67766e17f6d5bed9a5a9407c243975ed3bd9bd516c3f0adbe9e2681b760fe2d7315775b1fe194a8cf9e8dbbe6d2faf763fd685f6c01e82c5cf29b6a758bea0f9457b895aa4a10f47f6d89ed853db54437ba62fc083d7ecb9deb217ba6d5bb66d3bb66b7bb61fdbb29731e2707becdd8029860eed95bd86d104ce9e6245b7aa77f2cf72f999bdd81b6861694af6d6dec17c46992894c9bd6ac7a8021339018d419d52cff6c16ed9922ddb6d5bb1555bd3439889580dc72a3a1e2f76c7ccec2ec8ab0ef9db25f96ca763844a1e206a5d1b5a9b39e58cb3309a58c1c51aa86fba1fd7a27fc95e06f6c6397deb3cc493458aed31168a07865ed83ea480c1652e7785836a0b46317603b45acaa74bb8fed2447e36476ee8466eec2631dac6d6a0dd2efa36cb917601630129bba97b744f588fbe613efdb8e6bb36d6dfbe155f208b504df78c4fed905f8a76021683f6e25ee273ddcccdddc2bd46db726fdd191e4b98c3583de75d5aab19609c8ab95d5077eedd35dc9e69bb7d77809a8b728178c5f983b198355cba43bde58e5cac498fb1bafe621dee07f6b29983c2b8dd89aa4166b1445fd94e56b2601b69e3484e5dd39dd98a3b7717eec4b5f4dcb551b7a3c5ce53ee10ebfb58496718cf5fd581da721d184d176d674e76471934fac649f489aee72e4d612b209b67acb63fd656f9677bc18372d2a1bb8a3d00df55a8235b73d7ee0633c7559602b316ed26ca04b2dc6777ab1afa08e5b0de16d51d31cf7e74773092813e70f7b15ae8ce78f575ea1edc962bb9721c0de403ef1c9be6eca1c77106ddb6ab804cc0ea6186861bed675fd80be91dc7783cbbc027572142d6d4aeabc57c9e231965f0ecc7207e38b7e3208ae26ac42bdcf7d1c7345d5d4f303bdd866b46ead4c33441b9d35007deea4390d5b98fafe668ce4337b2d0c83ef8cce7bed0257504a3c9e311e3de462dfa955c1cb2d77355f17dbdf003d35775a84f6274ec611cec609d42b947db0fedccedba23b04abfa9c3c9de2af0f42b900bf8303ff2633f31977eaa6f740b6a15f4b0eace3ffa27ffcc9ad625ed95bc0eb4ecc0bf802df6f5d8cf68edad4beba492276edacb4aef025aeb04350cb20698ef1a46950ecf59876340d4ea999ffb857f05ffb2cf2b44039e89f5357ec83e54097edff06f7ee9df712de0d23a1f6bfd13bbefeee1be637debf7dc7e8cb31c67ba2bb9a8b9dff707906df641c324beacf2c47f2217b8e229f1c89cfa43947e5bea77ce8b418ffd913ff627fa88d7ba78958fdb5be5b607ee0434e9cd9ffaa63fc38812bdc88b2bbb913ff717bae4fb90679d806c5afe0867adc7768347948cd1beed3b906d4edddbfafe4d94cb0fec85c6bb8feb8fb1f60e90ddb520a249cdd8e67a651cdb078da8bb05f8171757fb7c176c6bc1ebc3e1c37afe026c63cf377c2f563c314bf130227fe5aff58debc04c945cd5dfa85390cd2d663752ddb06ca2c7f177fe1e46fe80f998655bd958aff92817f62f4fb42e6cbaa0df5bd1fb632639e7fa24962c71ae96bee4cb66178cbfcaf5e6583fa6b89c43ad439131ae9d55a027db5126d6fa0a8ca50a99c24c595f031fd65177a0655011fb1dbf6b305743d94f52cc899eade5ebe6143a1ead9f464335af93fc6c23be88bd389c570ff37506b6f0842d77576b29b4ea0079d7831b426cbf080a63bae13594676eab883528b7b9d437c1809dc048526d43b9fd8b5dba51881115641b5cf021f0fa81d4395da96b4216f2506cf8b04ff5cba7381af3e2128efd4257d533645d46d656242b8fd668b7423f0c56759ff816acd50ff469940b68840b435b0a238ceddd94e773d51535d595c3d81b906f490fc3244cc3235ae722c5ff09e600edf0e44f2033ca310a07add6e5b2662f6123c638cc04e3cfe721ae41ce5336df4d733a835cb8e4fa6089a5359f45edcc7529bc981db21fd70933bb448ba7b5b386546531f6e2885c988705e45930dfe1d554210b28620ebbb69e139f1c6b8017fde22e308f18ff582ea2e3bcb3e0c8a78537bd831e74259331ca680175dfb12d8765187cb10779a0cbbe0bf5208c240cdd6378c791cc627c92da8433c9183f66b61f1a61cfc5da350ffbba1b0e4c0b3d738fe319cdc202fcf821f84cca5457ef0d7cb49790743cfedc002d239d6cf96bd45e999f1e575c51c34eecb6b6ee0df577730ff2146af426ae063e40cfc8a3a74a9a7361c98d63e6d50a4721ee0dc458310e27e194d74556eb9d0b5aa5094d883153caefc4bed31a91c845de4fa1b98d3542bcb20f39561d5aeda4352f92cb145a3d0be7e08d69efd16cc413f202e085c3459885166957aa4b14e5c258ffa838e7a16ddff425e4000dd4fb43530b1dac93e62952c23fa7e358202f1bfa015bbfac117d8c2f2bb9e4682f8fa0eb25f8ec84eec65a3dc905f262bbb4cdd083fa44711cdedccf9f826c1f7cd33c07f2b013ce4657d51659f6dc9cdba51fdb8bf0aafb90e57888aa109dcdf307b9f4280a842bf76816b4739b8eec47f60287c3fa3aee75f57557a9d50a2bc6e371d4315b846bf7083e658ef5895de92cdadb48bf84a11f87561c49b8e1f50dcb5a463a837996390fb7be61a376d11a728c450ee6be853195ab3c5ae381ffcf4c25dcb922468c1863f879832fea97b0eec7607e32c8167bb45291d620592e46877b7be696ae0db9ebf443fc0dfa389cf86678885e0346d2654fb4b9de1ffd523f6c81164ec0ae32bd8f6b3d587386b7508ab128adf32c521c380aa7a18c7259f9b1afea4a27b1947df75cf783c7353d69533c72dbb44c535f401d9f736b0355814c9476ec14e40a0d7f86ebb3b1765bad144d6515305a8a3b08dba10236179fbd0f7aff44edc0c88ef48d69f173db29fb47efed6e431575a88f7dcd3fd52f228f97241bf2116ffada0e36f596bd64dc2f3901e91690e3c2b5fe86ea4fac5d96b694e2c984fd9559ad63c6750ad50bb5b013766d39aeb2625d1347f36a62bd091a6aaa3896e49195ec11b8505713acc85e203757ec3bbf920b8f95b3f6f8dec495a21d1fb254910b8cc5cec03b521d1ff57c027229412efcee4790ad8c683d22adf5f758265d5aeb8cba9fe94c65c69d050df2cfb0527bd2d3cc46bb3127995bd387791a09d89769c648b029970d7b913c4ce41277b7f7a3dedb17b697c5865c607e745cef9a8046c5d58827a8db8fe2ce9c09a19e79c8566660a77b947facfbaeb4d2da002f7b60975908fd2c73f759eeeecd5c0f402eef6a1f7cda35ca85ec545668638cd2ba0679759ce917cec5bfa85f24978a63e5554e17f516abb00debc7cf4bbbd05bd1d749dd9e6550699dfa465660566d31c64f4d23f65a64227b64c071257d6e46309a7e36004f53852a3aee50417e6eba6ecbb65147bb5cbb48be1c23f48ce5627f602fe27f5cb2178befaf1c43ed1236ec857e8e6b93aff6026a7bca1306a0ef2fe6102aad1ef5c1926dc8da7f6fed7e59d3efa25780e8920dd569d452b2393d56fba6948d421beba4779a45acc8e0ee6c0c3901d98b5ab3edcf727169acf8ee50283464e32ae3ea6bbae6cb40ef2056b7c11b3741c3c6309ffbd1776593e8496371432be4bc462c3e6ca1646f997cfb042bbb56d8caa66a0499655cf5807c019edbca1ee35a39e74bab7c61a6aeb227f2636b7b765fd52f2bb94ca06507f1b5a1efb367cc5853dd8d313856793ddbd2fbe08360e4e0cb1e21323e50a5c5ebf65dae3de6293aacd657da6ab53bd1b67db39d4df516faa59837f4dda3aac7f525be66657533d7855aa79ce2bed8f95775a54d7e6c1cf75ca0f57646ef1c50fd15338ff884b857ea4ddb1d51250d1ab2e54926efd90c7bdd263f463e19578b454e8bb4ee4595760733b2c76c0e9ab58018b530dd7017abfeb84e4dba99e2ff2c7bcddef4f1fabbb53fa8f7fd9abd908cdeed45b6a40a9de7b69b765d5ed4a33dc01a126276f69e3530efa2ff2cda82652d5fb0476b7005b6b67796aacbcb6c0f624a5c67793727aa0f125e4895ac6455666e1e33985da8511566976beb799bf1e5c3dad8535cbb847abf961d58e825ed8ac44a99d7c8c0e76687d911d49d01bdf245760c5e74e62f7d957c8f1d1aaa861579ac50c3f9ede2ac8cd31acb42d628d5a579ce9e400f4edcc2dd404d3361bdece02c2cb2d3e8c542dd8fc09eecaabf5fdacb7a0dbd8f6f885462ceea5fb326afbeaef61f177187c2f6ec33d4fb8d787d76e69bd64509c219cc88ad6559449d7a0c3bd9b96aa10cbaa8591ff6ff31ffbc044dbb70a32ce0ba12565f2c9778751be6ef2de4590b47b26e2bff5c2ef17d87107517e4f390b5396b5f1b4db47edbb7f5ace3dee3ca138ca8e54a5937b4314a627491fac4e8ac975d6657d9757c37036745a5fdccd51a68bc4f6737d96d761765a83a602f5390ce94eb9d0e68c27df6001e6998e4d2ff627d4cd62c452e52619575499d665b694781bc6b43f25c7591955c03d7ee833ec9ca6e6463ee41eb5b52339e832e6edbb23bcb2a90a5b53622aeecf5b3d6822655b35ab693bc9dec20d29eccb92f65bb6637abe3acc7fe524ef671bf325f5f97e7589343cd5ed6cfeed1df912d73f6816b2958e75dba89db8b76a562e57a622f20d3dfc6fc784176a21c9476b3587f066db7b33e8ea6cd75ea6a5702e41c3f2def21dbf833ef43e35e75fcb9edefec6e5c51027d59c9e5edd37af2fa5af2ea28e5caecf887dc64d7e8572caf3ce00e967977d107b7627e94c7b5fa899ee5ce9e3bc89171857b865ab8f48d1cda35b779c8b26c9067616ba34e95f5af45f40a9841533c99ae7240f61eda2ef33c2f62ed99ea588772f9d25ebedaa3859f2ff23e58e30c3c93c4e1e86f799fc42ceddc6de13e48ac5df68375a57c6007308e01e40637f9906d903ce8563ecac7b26f9476cf794429b758edea9286bd43b5b36fdbba426b4471fd0d66678235b0fdb43ef64ff62bd5be5b9867b834eee05f28d97da32c646146ae1b66fa3caea2aafb389a7cea9bf96368e48ffaca1b3dc89fb0668cf956cc27b6f267b02ac810f297d812eed92e3efc9bf39eb4f0ccf6f3996e416e3cc5f79df9bd9cafe2fe4ff62b9d3fcfe7797c42c35ca0475d60ce451a31b745fe6adbfe51bfd9f804c8cff2b77c99bfe78d7c2fc4b779a136c963a5a56034fbf9813dc80f4df4dfb3756d93deafad55cef9881eee323f32377ae1aa711d747defed17df87b1a1c88ff313dc4d325cef8b4fa31eccf253ffa46fc133c79d8b92d9d5a3bc09754603df15f798e90c20036dc2685e41ce8dfc0c24ddc23df44d8dda904efa9ce5e79063045dce2f300288bffd13fbfb59666afec0299cb7f15adc460f8def7e3ce62dbf97b7d5a99ec6bfc38175fb18ea923b77c5d96a29efc068e2ee858218b1953df96bcc8e1ab8def64936525dc7dfe4ddbc179cabe697b816baaa5dfec4fe7e80a7e757f9755ab5936c9ef3aa986bda3e58e7abbe3505eebf7bac39e3d3e28a4f337fca6f4026201f57c59ae739bc6521bfcdef7875f58b7fbcb63987faf3599f43ef69df60b0b1bff3a97ef9d9fe3ed8c03cbfcfb6759df7b47aeb7b23d10759dc5df647be973f041f4ee23b2c6ea9bd3aa11ddcbc83a3332897b80636ceb7f2525eceb7316e7d612f68937026afe4d5bc16dea42258b397fcd7edc5b5dd896b83cdece4bba642f198f71ee61c43b1d68c6f49e06a5cf0f750dbb4a1fe7bc11586b88f5fe19d43c8bd753fafc737b7605a6f39c67f69293c2aa8d60a655be1ad30b8c3b55ab3fcf49da76fbecf3fccb250f85161fd5c24c3362bfb985dd6f1e89d94db2e5ce1ad77672e2f027d0f469d16993d7043739af54dafc8fd5188fbec5391b2f49eeaaeb503e36451a846cc1f70ddcea6b892633568be6f2ffaa5e8c3e734af1703f31077fa29d2e11b12f2eef4fa9b6cf074e5ccd0ded9477b5c0c8b517ca73f1f15e362923f165388bc97724ff28b9f25b3f6aeb969411d7b6266e03526e04d64cd48a5ef397d3bbee87ed60a83e2515be78aa7e299722a18492365899447bf73f5d9466f0b110eeadfb81f0619a78da33bc7a882a3e0f769681d607dad65b12113924b9cb1cbecb0783145ca1757dfffcb7f25bee4f5285da8e540ba50c942beebf7b147edd57abd5aad047e5c73597dd2a81b285393eac6ceda39cb95fda65cba981d5c668fd99be96eecefafef7f7fef7d4bb0567c83aaed076651cc8a79b188199a6a438ed658edc3a743d1cac58a4162efabba58468c32c1f7b6d66cc57e964bacf070d7cf16af30ababf761d672c8efda4bf1668edd32cbe21e98072917cbeccdee99a15a7df340f67c453ef2f6472fd9d1c6bbb09c9d507df255b4fff4ce39e4a3a0b3c57bd1f8f1f72fbe135fc02b2f753f2c7147ef42976d66c7c59ebd720af29a6837638e9e1d95de4f969e43b53c847fb48ed145ddc7359ab4d736e5eb78b729afac6c67633d0046632e8bfd30d4ef6bfbd5bf1c5f8a037b63766d8c560b532e0e8ba3e218a2e1bd9d172754736ec845764cd6de88df9863f17bb25a24ab80f318e38b53fcd6c9073f06b1bf6f1bb65334e1b9abb5bcd57edcf7ed65f3e03dcdd02fce6cc91dba1eae06aebd21b5e16165d78165c6156f57ea15f67ff11dde59deb5cf79ad78e69d9bf4f62f3c0e32e5e2bcb888eb3eee6ead5f1bfbd7dffcbed88777b6e30a3678c5636ff266fe5c4c8b167e6784f28eeec64836d65c7055a9b136629219ea4f7e9ef7f479e8db96ede20ae8105767e6d18f9b7d73a53bf836dc24ed0f7dfabef377bf2fb6714c715d33661527a0bfeda2ed33ffe26afc1d18aaa195512e8667a9457964f1f7f0cf66a760376d7c9359bbfda2931fd983e062d50bd94ad7f7a2eec673344ebf95b7f1fdfea7f8cec5c7daf717e2cbea58af17f05b86f11d485bc9ebd9ae7b2c86febde899735cc99a7f90cb475fc5df1bb3dadfd92554bf2da8b4e21e29e4d0855137f6c4f7f01d895968db86dfd21d18c9deda3be35f7d9fecdbdfaf5c9f0b7edff8052aae7a8cbf59069eba6f20590bbb85f3efe1c936f0cdf0cfdf7ea37c6da65e4c256b1697c595dd2dae35bdb555ce2ff3a841435b31b3e2c68e407c51262db49325bf67e3711d66e33be9bf125f3ecd017e2b17df9d7cc66fa71db90b5f40ae74e1cfcd6971eb4fec8b3d0ccde22e5c990a44d5f8c2f439c8e0281bab2bd70d59b61fea45d3ccb25dc8bf8b984b43a57591e3fe63cc85b15a7b2b5e219eec47df051c6532c74a6cbad19f7c532e3fb597b5bf3142ef46f0bbe08fb88618d7c78efccc8e6dadb80fda0f204778d147a6e486aa11ee8a07770b3ddfcae77656f8ecc98dec2ed858295463050db1eb0d3e87dc53ac47f1e767b0c7b23b7647f8067c7c8760405e87be3ff627ede58bbf218215f0543f29dcd18e6fa7d13e7ffc397a4988a8f1cd36c8785c11caa1aa2676db75ecb69a84aaadc45d2a182daf40f01e977cfb1adff5c4378aa7f816f07bfc5407b8361adf697ee7d5fb4d5ff6fdf8f2e1efbffcd0c759ea19bfaf22ef798dd7be1bb9f9f761d6bf2fb9f97bf7412f36eefb513f7fc15e7efcf75df08d0ecaa9f133ceed7ced90d17dfa4c6bf69b7b299beb2cffec6f636cf02f7d1ff90bd96cac85c8dc85d44bd220facefefa7debf15adecb5ce51436bd6bf0d5df025ad795c4df8e2ff997f2f11fe2eeeadce6df4a08b81efff2e93e6977b506b95a5b59bdf3b9fe9e8ddbd0894f31e69bf958fe51361b72f9c1df48fa2a3e6fc8b0bf7ad7e3e3733ec6b6b51a7f9d37dafda65c8a2fe67f5d665ffd7d988ff7177a7d3fc189bc36f7503efaa60fb6f15926bf56efc7cfa6febc47b39a936ce3bbb1b287183fe9af46ac7d0358ceaf1f9ffc163d6f53ae6bcf4d7281eb8a6d5cefff157bd99cd32fbe23a3d59a2f8a73eef85b3b9bdf67fe4a869ffdd3badd7c96fd4a4e701d8c64432edfcd917f256ffba8f3df3dffa3e77d6943ebbeeffbf1e57fc4f19bfefed85fe2f37f955cfedffff9dbff07a3ba6ff8</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c4b54c4e4bb44c067113a1dc3408570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e00eaba6126</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c24d4a4d4b03711321dc642308570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e0083ae60d7</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c43531b4304c32017193c1dc44183711ca354d4a019b8306708b292301b85862120c22c492136170e8a8c3e23722c2a5d69a0b00768563b9</data>
+ </image>
+ <image name="image4">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d3249354a35037113e15cb0623d34805b4c1909c0c512936010490c0e868e3a2c7e23225c6aadb90090db60e2</data>
+ </image>
+ <image name="image5">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d334b343533027113c1dc3418570f0de01653460270b1c424184488c18512878e3a2c7e23225c6aadb9002a2160a0</data>
+ </image>
+ <image name="image6">
+ <data format="XPM.GZ" length="409">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022630543251d2e253d856405bffcbc54105b19c856360003103711c44d4bb3488170f5d0006e31652400174b8483a12d86c56f44844bad351700a36a5d2f</data>
+ </image>
+ <image name="image7">
+ <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c44d4e314d314d04719341dc1453183711c63533029b8306708b292301b85862120c22c4921293132118bf3a98aa6402eae8611e16bf11112eb5d65c0046af6444</data>
+ </image>
+ <image name="image8">
+ <data format="XPM.GZ" length="2093">789c6dd3594f1b311007f0773e45c4bca16ad8d3c9aaea03f751ae7043d507afed25014220249050f5bbd79e995d550b321be5c7fc333ee2acae74ae4f0e3b2bab4baf533d1d9a8e19e84967c5ce46a3c5afdf3ffe2c2dc7aae3ff8aa4932c7f5b5aee4f3ba673347e720178e40171149938229fb0c3204fc4191b34b91706d9890d1bd78293280cf2b538135f928bc42405b9084ee3c6e3da694c1eb1d3489c928b344b290f20ee49fda331f7db0acee22ccab8fe4cd6599669f293b827de0ece933ccae9b06048d679c14668ccf91db1650306ab44c58af337e25cf22f64ad0ac5be175bf120b89b2adb4dc90fec6e2c3e0eeea5fef8d90b72d9cb7b25f95d5c487dd898ea40fd8bac888b8cea966c8aa230e479b0ce0aabb9de63eb980d77c165562625d713b16203dd97d2eab8cbf359712eeb89c55ae63f103b99dfb09b7ef47d9abce9f728967eb0106bf1bc319f47b7b6cc77c12e139e0fdec54a5c8ab5e6f5bcd596f5ccc48eeb40f7c9589fe7fa5b63aebfb24d525af254acd8d8af6d72f2a1581bae3f8a9d98fad9dc38cbf92bb6556ca0df8f75a65eef886d13f97c29f683ea74ff9db2f57c4eec9c22cfd82ee13ceada5c07bacfce99fa3c1ed856ee0718b196fd2ab193fd668db97ecef6f3717db331af977e2f55582fd723b6abf797d796cfdf8aebf3a9c45af6f3b3b6ec775f5cefffae76c53e6557b27f3c23574d7e835d2592df132bf1b47145de156ba9af37e67a25aed8fd290f84f6e0ffb7321a4b798c97e5542be3b092718703ff4aa94f7d2a1ce23da51ef09152a32ffa3ce19832439fbac767cef8acf5098b2fbea27184137cf5efa638c3377caffbf8fadc3f618e057ee01abd5bc70ddcf4a966aed08bfa6ce136eef85ebbb887fbf8130ffe5f8fcf0cf0108ff0d8f73cc13e9ee2199ee3452b637d8f4bbcf21daef1c677b9c508e35626f17b7af64fea671c6386392aecb6323dbfda0210b7014043890a0cd8f67ac0a1810aee60801318c23d3cc063eb0c5f60044f508575c0189e7de20526ed73865798c20cdee01d2f600e0b98c0c7a7ef62f4d558fefb7de91f96a1f1b4</data>
+ </image>
+ <image name="image9">
+ <data format="XPM.GZ" length="1160">789c55d14b6fe2301007f03b9f222237b46a378418a2d51e4aa12db450e8936ab507c78f82cba33c135aed77df8c67129284837f337f7b1c715e7326a381533baf6c777c37138e98f28d5393fbc5e2f8e7efefef4ad5634efa0b7cc7abfea854cf1ce10c574b05eb79ba767dcfffe9dbd612d8e08d4683035d60c08330b09c01196792594e814d9fc9a60f34c8a687dc005b512b6c592e724640090c45188602380646927b4ddbbd2506b8f78ac8c306f08ba870af40462cb2dd37a008b2a306443a6a42e4c8d79c367c9311077590511d07bd1019724de438f789a8b8ed3e5bca88231f90a21e49e02391213f884a584640a9e0052aa062522906fc44aa3a767946ec8e2c95a06bdc23651d2fd927729c7b4d5422005e22d3932df739eda02e50a783f0923d22c3f090c8317ccc88b74a88f409ef19b5e50552d327b42d7516de21751dc377c4743730ce88dd554e0d3c103976b7396d571335f22c7ddcec49d7798da7ff3117ae740b3505bbdea73a2d9e725acfb4361f5ace0b3963b45e98d9725ecc4db55e7dae37e59cd1dbdd7e5dca697d8893e3d7bc34f7105fb42f3be5f3e2249976af4ae7c5a66dccf54d21179bc4f4bab3fe6d217707a574f6a0904b86bd6ebf7f3f1a9f6a0f8f4fcf2f9dd7c9f8ed549b9f9eeabf5f95ff44891e85</data>
+ </image>
+ <image name="image10">
+ <data format="XPM.GZ" length="2478">789c6dd5d96eeb361006e0fb3c8591b90b8a39962cc9128a5e64df176771724ed10b8aa4b3da4e6c673de8bb979af9a9a4a7b5c2001fe6e7909465fbdb4ae7eae4b0b3f26d69be308b5bdbb13766d65971cfe3f1fb9f7ffdf1736939293acd5f18e9f26f4bcb8345c7768ea613df807b01d49557637a6a5d8a09cee0477119cd43b844fd05b6f06be3a4db7a1a9dc87abca76e2ef1059ca9e9415cb69e344ebb894dd55e9d66308babe04a3c864b35a7b085df1bf792d4f612f15cddebaae91ace50afc455b0cedf854bd4cf5bebfaeb8db3a46733ed3752675d35f7c526cbe08dd646bc0f97a8bfb5d6fa266cd5641ae769de45fd2c3a97379f7fc039bcd35af31f62d3d60d5ca19ec04e4db2df228de632bad0f9cfea22818f5bebfc1bb12972d45fe14aebbc0e3be4e5fcfd5e11fbdf47f77be227753f5193dc9f7eddcfd1ef21ba5f8bbb7085f92fadb57edab8ec9579a9f51371ddfa08aee0b5d63a7fab719595aecac40375955756f63713dbd261be575795d6791b76c84b3f9355e84f8770ec3f519bdc88499e6f13e6237fa036589f2fa335cf53d8185d4fce57877eda9f64ffb53389de1f5a83713fe81e36d84f017bec7f5f5da7e87f0b176a76d1b5ce1fc3a67692bf6a6cf376fd3d38ae7f091b78d85af3cfd1388f53d729f6770117f0366c707f0ea3757f740e7b9c479e6feb629ee6adb55ec31ef34fd536c5f9cee042cd196c6c2e9ec1de6a5e3eaf2eb7f1fec9f7b3f3ce38fd7eb7b087e5f3e60be77d21aed53e55933cdfdedb789e5db54bb1df5538be1f0bd8ebfec8aa7dea74bfdf5bebfa577081f50f60e3b52edfb7a3a2fd3dda513b9c9feed43ed5f3730e1bf48b753f52afaa47292cfb1d8d627f1ea9eb14bf67a41e45dfc2e1a53f9e83055318e6d7aba90c16312339c3355b0c17e435a5eba2cf35dff02dae3bbe0fff25f5d98747fcc0639ef0941f25f5c43349cdf53c92780e99177ee5377ee70f5ee5b5905ae70dcd48974ddee2ed30d6798777798ff7f920e40ef9087d9abd1cf3090ff834ece28ccff982877cc957fc3da43efbfc089dbb612461ad34647a61ed8c732ebe64fae1ac65189b5c11f390880cd564c97d66c8d348aeeb90d823e21eddd02dddd1fd97cc43488dc398d0941ee929e46634a7053d7f66c26a437aa1d7b046d3e385dee89d3e6895d6be6642aff5709a61486cd0266dd136edd02eedfd3bc386f6e9800e43fd888e438f5d3aa1c17f32a77446e7611f17e468489734a0ab5f333cffbf6bf9efdf97fe019b6f35ae</data>
+ </image>
+ <image name="image11">
+ <data format="XPM.GZ" length="2013">789c6dd45953db301007f0f77c8a4cf68de92cb1632bf174fac07d26249c814e1f6449ce45127201a1d3ef5e49bb364d0ae2981ffa5bbb920cbb3be56ebb59ded92d2d9672395065d597f3f28e5e8dc7eb9fbf7efc2e550251b69f8d7a39ac7c2b553acbb22ab7a613e380330ba805b56a2df07e738e641445d21b9c63192731f9d55948a105b9ef5caf095daf794fc9f5807de4dc481b4983bc2a9c7a0f9c1355b51fde9a9c2489f23e714ea362fed85b179e93c306f7bf20e7fdc2982c83baaf07c08eb99f902d93c8fb9a6db8fe13391592ac72a7941f39abb8e8e7b970c3d793e450717f8fe4e2bc9be45873bf2b72d16f9fcdfdc2922dd98bc2749ef5dcbc9f2e390d693f30670bdedf215bd27ec0df87d2b588fbdb2b9cf8f9295904c2bf4c78c68ee97d80177212703f37ec98ebcfc8a9a4f384095985a9f6f92bb650b1f73b5b2a9ae7f595610f9d751c5523eaf78e5cccfbfbd7a69ef07952de4829e97c3ec85a6afa7b48d9865d73364272bfb824a721dfff393b7f1f22b20eb97ec2369af663721be17d403621d793b979bee56decfdf8f5e099ac0c9f5f8facb91f40769e37b9f93c05dbb01fc8b63ef9b230f5d3600bea0752b6e4fed68529bfcf3664c89c3351d40fc8263f9f3837d7afb20519468569fd0e3bafdf66e7e7d9cb9d916fc96ef8f5fcff972c2b9ebf67e7cf5f90b390f38a2d787f93dc59e67dca96ec8c9d913b4b1a08db837ebf959198f297b2d294daca18cc78f4b06fbffbd4466680431ce1338e7162e7a7f8e253b3cf8c4d8c708e0b3bdccf25ae6cea15df3632239b7ac7b5adf2817b36b58f077888479f193cc613dbcfa9ad7686e7e89e78c70bbcb4a9cfccc8f73cc4a65d658d2d9bb9c23676f0fa8bcc0ddeda4ec776dd3bbcc707ecfe9769e1a3ad33b6ab3cd9f92a06186ef433b0990c6bb65ad326229b8851607d6b5f2e73810d4c780d61af03363227202105856dd02e010632e841ffdf8c3b4518c010463ee1aeb407cf30deca004c600a2f3083397661014b18c36a3b83b3af46e5cff7d25fb0bce65f</data>
+ </image>
+ <image name="image12">
+ <data format="XPM.GZ" length="1310">789c5dd14b53e2401007f03b9f2205376a4bc96b92d4d61e001510414454d4dac364262320aff010d1daefbed3d39d00261ce6d7fd4fcf4c715eb686bd8e553e2fac377c33169618f1955596dbd96cfffaf7cf77a168334bff986bd9c55f85e29925acee629ec07aaad725d7762bae692d801ef73c8f039740df71432702b60db92b305c42fa916fc27320e34c32c3113070990c5ce00419d8c80f601887516838cb19039f8091174681e163460c778912799bd3843b8622b2b19be6345d498c22011c13257207e45e24b907ac0063c96d3cc603d1c7c9d7441e99f02531c1510219b3d87443a0f0b351cf441a15103992e534e1bb8cb85103193bb8914f64c82d91e3be2e31e1a6eb19ca98236da470620974880cf94e4c84e10a287d4d1f786398648c91f0021360c2649230e0069938d8e519b1fb62a847e1a98648e9e01506448ea7ea1169df2ba49e6cf895d36cd4022abd115ea1496418be27720c5f64c453d5897485b78cca706fa89483ec13751f58cb88dd754e05ac1239763f739aae222ae4997e4ad9a3d7798debff988b922c1dd512f8ea6da474f190534a8ed5e45dc9e9694ecd26f305d596e92a5d426dbdd97e9ce47672f7b9ffda4e8fe72955add52f2e7fe6e4eeaa7192d3a97ab3754db5767ad36957d36e7a9bf6ee8e72b57efdbed9ea0d1e8ee6f5eb8f4ffa1d3e1fe52035180c5f2a879aedb89edf6041253cd4a687a7f8ef77e13f3e1c3a3b</data>
+ </image>
+ <image name="image13">
+ <data format="XPM.GZ" length="2702">789c6dd6d952eb381006e07b9e2245df51537de245725ca7e6821dc296b0c3d45cc8b64c026401c23a35ef7e64f52f9f01a60ca13ed469b55a8ae0c74ae77270d059f9b1f4b4308b71d92947e6b1b3523d4f26ef7ffdfde73f4bcb91ee345f49b7132fffb1b43c5c74cacee16c6a1bf0dc8112379844deef8d5393a6a9f1a6c6caa85c79d36b631dc7ddb8ebc7dfbc8daeb48c3f36ce12a5949f8c2ec55a696fbe85ab2cf19e8ab3484c3bde45eb41e35e9229f8d8bb70f349fe13710ff1bc0be73df16bebc2c7dbc679dad63711670af5bf8b433eeac37926efdf80ab3cf53e12e7919817dea50af55d8bdb7c5d58215f24ce23a997185679e9f355702ea687c66e7bbaa9df2f3a15e70aebdd0c467d87621319f13aac609fdf94aa2bfb4d4371dbaf2bb8427ed81823f5ad352e52d5957e722e0efb4d637116497f79206eeb8bc526f4ef3918f56dc3b610fbf35354712fce7d7c2a0ee793cfc43ac2fc23715ea17f883711fa7f00a37f34870dea89608bf74fc5458cfa08d6e847198c7ab7605354de4fb015b36a5cbae388fa358cf3c307629d4bff0c89dbfa2f60d46f1836584fde5ae2d782d1ff425cc4585f0fd6387f3bb0c17a505f6165bdb4292ee352f9f80d58c37ebde5effd49c4ed7d70292e62e4cfe070bece83d1af6b7119a39f37c1321f295823be0f9b523c83ad98fcfd55a9a494fb8feec4aac27df722d6393ebff76213d6bf272e63f82358d6c38fc1a8af86433d27b0ad64fc595cc56246be4a63dcdf6f95552a91f32ff5d80cf5b1d46f7be13eb880c37d75262e713ef9050ef56cc1e80faf8bdbf917ade5efc7043670015bd8dfb7d6455bedbd2db631c64d30c68f602d26ff79b2368b707e3271bbbe5571dbdf040efb732eaec2f9da87c3793a0d967a08f95c07249fd4676dd88fe3d652ff3018f51fc2dacaf81e6c61fff9aa755b7f2ccec37d3b13db18fdefc206f9c7b0adc50fe2e6f1f6ebab6b172ff38dc4758cf11bd8d4b5770dd7e2e1421ea6af8ffcfe4b8ce102dfa55325515f622cd77cc323f73ae65bf7eaa3bee5a9f98eef79e27e4e79e6a3e65f621ef8919f78c1cffcc2af2eea8ddfff1bc31fee31bcca6bbcce1bbcc95bbccd3bbcfb29a6cf7bbccf072ecb211f390d78c8c72eaa8de1133772ca677cce177ce96abf7231d7dce528c470cc09a7ac5873c63dceb94fcc03223254480c9554b9c7524d3734a231ddd21dddd384a634a379c8430ff4484fb4a06737e78c5ee895dee89d3e6895d67ed743ebb4419bb445dbee75c745ec529ff6689f0e3eadaba2433ae22b1ad0908ee9844ee98ccee9e2730fe992aee89aba14514c85cb724e09a5dffa7c4d8a3465d47331b961f7cf207d8b99ffdfb3fcefcfa55fcb6370f5</data>
+ </image>
+ <image name="image14">
+ <data format="XPM.GZ" length="2782">789c6dd5d952ec361006e07b9e628abea3527dc69b6c572a17ecfb32ec90ca852c79180e3b33aca7f2ee91bb7f99840a06aa3ed46ab5dad2f06361707eb03b58f831379dd9d9b51bb8897d1e2cf897bbbb8f3ffffae3d7dc7c6206dd77560cd2f9dfe6e647b3811bec3ddcb71de82c8086c3244f6bf1ae3a1b1656bc03574626d3a9b81abaa4129fabfbf97beab42a34fe511df2a9977b6bfe6d3847fe2bd8191967e4cf5dd988b17ee1eb5ce2c76a93c05b9d9361e2b41eaed47985f93b30f2d17b7495891fd4455169fc36ece1ad685d8fcfd4fdfaafe2b0ff2c11bfa9fbfa4fd4a6ae9db8803d7cdc391d96b5d57c129fd669ecefbe3a1b66babf4fb529b0fe3d1ceb9b76ce9210aff5dca98b02fdfd50c7f5f81df656eaa115719d3bbc2f17adef8b5b755194d23f4ed5a6403f315e259a8f479df3c4c4fe3ec0b15e592fb7799eeb7a17b083973a176919fb97ab2bdfe87c12dba2d67ab9569789d6c3ab708df536d475dd78c93fe96c52e3f1bee4bc1a6bbcf68bbcba8efb5957dbc415e29f9dcb2cccd7f59ed465025fa8abd8ef1bd8c3729ecb26e627995f8578f46b536d5bac77206ec2b8e65feaadf1576a9be8fe3883e3fc52dda44ec78f6003cb79aef3c6788d97fdd7ae8efd3f5487f93a7e0f1bd8c0adce27a9d7e6753cef33759c4ff27eacb3898e531e8dfb50c01696fc4d6e5bf46f51ddb45a3fc1ce78fdbc93f3d0789be0fe1fc3f1bcbec016f7a9815bd433523706efdf45e3fc3daa5decd79bdaa7ade96ce53e84cb14d7cf60ac6f3d6c61d75be337a351dfadba49b53edbc006fddd87add667096e51ff9adaa7e8cf4734eab562df589cc7126e918fd52ec5fd79860d7c0d5b9c87388ef7c35a7fe80ffa75071b5d9f5fe0564d52af6f1dce2fb1ba9fdfc02df6f3a96e4d2b66f9ff1484fdb28d467ef97fd186fcd86faaf6a9ee978e608bfd0da351cf656f1ddf8063bd87bd75fc46ddc6fa93de5a1ff2755f122fe363d3af3753b7b8bfb41e8dfb3685711ec9c216fb2518fde5ebe8b18ecbe7d978dc8f0fd5e354c7791736e3b178028fd5a3993e4cdf1ffdfbb718cb0d7e5c90d7a8ffc4b43ce62b9ec873cd3fc36f89fa8ae11bbee53bbee7077e94a8277e96a8698ce119bff02bbff13b7ff0272f86d1a510b5cc2b318657798dd779238c6cf2166ff34ea86997f7789f0f3486477cc8477ccc277c1a22b6f88ccff9822f79c84988d2989433ceb96013f29421e2942baec3d6892c351a438e3cb5340ea35d4cc8445734a16bfa4937741bf3d01ddd4b1d13cee881cfe9919ee899a634a3975833bdd21bbdd3077dd2222dd132add02aadd13a6dd0e6d7de698bb66927acb14b7bb44f0734a2c3107144c75f3121ea844ee98ccee942222e694809a594fd3ba67b5f94534186ca307e149e942aaabfc758a6674be1f3baa1dbf0b9eda9b6edf7189efedf33fff7ef73ff00aa8c7a59</data>
+ </image>
+ <image name="image15">
+ <data format="XPM.GZ" length="2366">789c6dd5c95223471006e03b4fa1206f8423a7777587c307f6556cb3c08cc387eaea12abd000629df0bb3b3bf3af0e07b60a019ff2afaaec52233ead8cce8f27a3954f4b8f0bb7b8f2237fe91e462bddd36cf6f6e75f7ffc5a5a4eab51ff9534a36cf9b7a5e593c5c88f0ee777a107050125fae8cddfe002aed4b5b8d67c07d766de803d7cd43b4d129fdafcd29c1666f2eaba1f5affda3b4b529f59fed0dc0ff53a5c98e946dd881bad17700dcf7be7699ee4a9e65bb830f39abac9eb5cf3f4027bf8b97791e6beb0f9ce5c2430c18599757ee1c44e9dc3353ce95d66852ff5f079d55c26700697b0ae5fbab2296d7edabbcacaaeb2fa177395c2ef7009efa95dd55436ff19eeccf4d07b9c57588fde065bfe327a9c6b7d6a1ea7a8df45a3feaa6e639d6ea3adce677009df0f6ed50f70036b3f753eee6acb1f98e576312fd46d5dd696df851bd49f066b9df47c9aa28efbed9b9bb429d47a3f37be691aaf7eeced0a973aad93f6ebbc0bceea9bbddba2cd5a9bff19aecca4fdb49d4b6d3f7a824beb8fae6187fd7fc001fb7b735c8f93c19dfa1576663ae9edcb61bf0d38ee770c3bf868b0e57f465b3fc4e636b37ee810aed0df0eec70bd07703c1face7335faa67706526fd7bf0d2bfe569cfec335ccf3e1caff71676de7c030758cfb32bbbacb3f5b7d4c1c7fe56e1006f9abbd8df15ec3afd3ce4160e66d2fb215432dffa9b99e37cba80637f6338583f1ca243a5de36870cfbb968ab939e6f907e713eebe60ef71b6dc3381f5ac0f17e98c301d7d79803ce874f07dbfec77085feb66079e87afa7939edafcfaef7ca1c32bb5eba8bc6f95fc215f6fb0e3bac7f0ec7f3b8889e9a6bf574a89f98a719ea53581ef6cfcc06d3c761af7fc8386ef1f4a2ce521f3281a718177c29df3565f70a5ff30ddff26c582788efe4d9a7e676ff8bef653c0ce39117fc24af3ef30b32aff2fb23bff13baff21aaff3066f4a6e8bb779877787cc9eecb0cf073c91cc211f49e68d8ff9844f256599cffc45d6dd939e6565fecadf247326f573fece3f9049a49a72c6b9ac5270c99566c65c73438ccc26af1291a3960bf2d451e084a67441977445d73143247b1474439e8f2848e6956e69467734a79f96a17b5949067e2692b8a7077a94c4829eb0ce849e65bc4857677c26bbbcd21bbdd32aadd13a6d58e65fefc5a97471419bb2c6166d4b6287763f66688ff6e9802674286ffa111dd32e9dfc679df9ff8de5bf7f5ffa07d6011b20</data>
+ </image>
+ <image name="image16">
+ <data format="XPM.GZ" length="2814">789c6dd55953e3381007f0773e458a7ea3b67ae24bb66a6b1fb8ef23dcb0b50fb264738600098130b5df7d15f55f6686dac930533ffaaf6e5976c53f967a9747fbbda51f0be38999dcd99ebd35afbd25f7361ccefefee7af9f0b8b89eacdff66652f5dfc63617130e9d9dec1e8a99983ae3d28e96755d20f1ec016de17e7b65f05ef05575dfe128ef9cfce92bf12e7393c9c3bed170ef965b12ad0ff22586755aa838fc48513f3b6b82a643d6fc15ad6f3cbdc5992f5b324ac3f16e7fd54e63d89ab44f6c3a7700167b043bf9368cc9b066b1de76fc21ad7b331779ee416f39d5817d83feada61de4ab0c9f3dc84fc81b84c72595fcf5da4d1dc8735ea2be24a63bd15eb22937939ece037b189fba16053e842d64b7fa312e9c747e232913aa773abd418eca709364a2ba92fc34e4cebe22a41fd7eee3253aecc829fc56502ef06d7a52bebe0557155a0df211ceb85d834629a3fdc5465ddfa75b14d5578f8e936d8f7ab64de21ace1cfced2ef0d8efdc2f3a3739de83c38dc5f6dfd03608395b856a82762abd02f3c4f26d70ef907b1298ce4cfc47583fabbd82af8186ea43f85fec69a44eaa4a2a51f6dc205ea256c30efa2b3d46fe046ccadb84ee181d82af4afe6ae739f977e1fd1b5d4d7c4752a66e46b050fc5b11f4fc40ed76bc2f3593b93e0fe9ec3b87f34830dcec3c0383f3a15d70afbb7d1d8dfb8b30bf3c2f5dba29b57c098675ad8c04d67c9ef46633f8fe23ac5f53838decf03d8c87e4c0de3fce9355af6c7b04d6d113c8315bc031b18f31dee8709d76f5d1defb78663dd886d2af3680ae37c6835da8aefe038efa6b3ec770437c8cbf93997c2e1fbda15b1ce65b40bfde859ec527804c7f9e1fbdf357ebdccd7e298e77358617d031b17de7f5cc30dbc266e309fc3fbaf514d8aba896e54382f0ef6f3719eb9d8e179a733d8e0fcd268d92fedc0d83f3d889bb8ffebce32ff12f67f82c7e216fba1f0fe6a55d7ff43dcc4f3de8ec679bcc3f17c0836e8c77023e6bbe856eae1fbbc6dbbfa95b84da5ce7bb06adbe05bb8150f26f261fafe91df7fcb18aef163bd9ca47ecb34dcf20ddf86cf1ddffb7f43ea2bc30f7ef5230ff9894721f51cfe77fc1233fcca639ef01b4ff99d3f78e6ab9f3eb5cc2b31c3abbcc6ebbcc19bbcc5dbbcc3bbbee71eeff3011f4a868f78c0c73e31e5133ee5333ee70b3ff192aff8daa724d3e78453ce38e78215977e52e5d76b7ff1444632549325e77f1a6a43e2956ee896eee89e1ee8b1cb0ce98946f44c2f3ca3571ad384de684aeff441b3b867faa4655ae111adfa1e6bb44e1bb4495bb44d3bb4fb75edb447fb7440877444033aa6133af53d76e88ccebf323e7541977445d7d4a7242452ca28a7e2d78c3fa51552545245da27cefc27376ce85b868ca1a9a9fd1bc7d1a37f8bb486cccdf70cbffcdf67f1df3f17fe031c788805</data>
+ </image>
+ <image name="image17">
+ <data format="XPM.GZ" length="2862">789c65d4c96ee4361006e0bb9fa2e1ba19418d76890872f0bedbdddedd410ed4e66eef4bb7edf620ef1eaaeaa7e24c207b069ff9932c2ed28f95c1d5f070b0f263e96d6667d36a504deceb60a59e3f3c2cfefceb8f9f4bcb6136e87e9260102dffb6b43c9a0daac1d1d363d381460e1406611206e2545cb874d1d9d69da3200ab4dd56621305da4ed79de3302ab49d17ea3888436997feb1890be443efc888af3a2761ef2d7512a879ec9dc8789cc309ac79eb6ca5ff3b5ce8fcb6e99c4609d6672d5c845a4f0657da9fe1d4d7affd6d5245da9fd469a0e6144e51ff9b77ac9e786bbd740b1bd4efc733a9cc6fdbce5994a65a9f2dbd31df056cb45ecb62d71fed315cc3893a0bb19e356fecd7096c32b91cbc09d799b64b3d799ca5e83f867dfe15aef358fca1ce433812975988fd36b0c17eddc035f6a7f0d6fda06d753f5e05637efa80ebbc94fd90f10a571fd66fe15ae7e707b5efcf721f8bd2b753a2ce43d4b7a72e42ecc7339c6a3d54f596f9e9cebb10f3103685d6bfd15bf3725e26c9fd7e9ca90b83f516706d1271a336a1dacafd3255817af91cf6f76f556d501f4f61632ab1dc2ff7baf8fb1bc146fb73a036befe03b8b65a8fd46bab02e767a76a83fbc6a7deb8efefbd753f5f6177c1a57d5d6d53abf5cd3b976e7edcbf176f8cf7a8b64da9fb21ef57591bd4c333b50db11f9bde78df57e114f7ed0bb6babf740a3770d95beb1ba9cb089ec099d6c335dc94b558c6af526b71dff77bebfc536fdd0fdaf5c6f9bfc10dfa6f7823ffa4f6f5d08eb79e170de10cf7f913b6d8ef636fad9fe4bc2bb71eeccfbdba8ab09e1d38c3fb907ba3ddc0b6527fc20d2ce755bbf9701e27de584fd05be75ff7c6fb7f0837dace77ea2ac27d7a52d7519d8aa5febaf1ed3487338c3783adee0fefc10d7ca3ee1ec91f756eb2be7d4d5d47f0be37dee76dd8efe7b137f218af89747c6ebd9b4cf2f27e374d13e17bf3e88df55df7d6fe727f5ad71fe77de98dfe0b6f3d0fba8033b45bd8627e821b35bf78b7da2edfd7b6eddbafd46d84768633351ff66ec597b0859fe1563d9ae9c3f4eba37fd76f3e975c71cd0db77c83df89cb4c35a5f78eeff89e1ff8919ff819cf0bbfba7f25a5ef1acf78ceef6eacefa90ffe94d442bf2ffcc5ab2eb1e6c65aef531b2eb5c95bc86cf38e4becf21eefbbff0f903ae4233ee6213223d772e2463be5333ee70b377e97bae42bbe7629cd8c39e090238e39e19433ceb960e3964e64a9d48cdb9931555453432dddd084a6744b77744f0ff4484f3e23a9677aa1577aa319cdddf34e1ff4490bfafa37e35239add21aadd3861b67d3fd6ed136edd0eef78c8cb547fb7440877444c734a4119dd0e92f1972a9333aa70bba74892b97bda6f1ff32ad8c15b8ba428a28a68452cafe9b716bc95daa706318cb96acb5a57ebbbe8db390676cdd77dab6f6c64eecd4de2efffdfbd23faf5c83f3</data>
+ </image>
+ <image name="image18">
+ <data format="XPM.GZ" length="5374">789cb5975b53e34a0ec7dfe75350a3b7a92d9dd8b11dbb4eed0381e17e09b710d8da07b5ed90102081844bd8daef7ed492da5c86b3557b9b9ed4cc2fddfa4bad56abe1b71f2b83defeca8fdfbecd17b418972be5881e567e548fb7b7cbbffdfdaffff8f6bd1daff0dfa8e8acc4dffff2edfbd162a55c3998ded51ed031404bfe08af1a27ca70a79cb43231867be32423e19972daea38e1abc0795bf8c63855c696729616a5706e5c181f08e7ec30177b32ce95c9e6933c11ff34554ed354e2c348b953b94a78c373d46a9591eeef41d90f61324e946953b9d137fbacd2fde29e72a77089f0ae71a50cb70dabff33e53c323e354ecb54d62f958ba8503db5cffd10ffb97292c41a5f6c9c1b6bfc79567524bfb4aedca9ec3cb695833edd18a7c63f1bd6fccbfab81595aa8fa5b21fb2bea39c56ed48f854394b8d41996a523de522cee342e62f943b455b793f70a2f663e5bc325e2a179132d4ca145552bfb06a5c5bfe77945d6ce7f3e4b91db55b165faa1cfc414799f5b59e87c645a5e7532a37fe5e955d66e7590917ed5cf703997211eaf152996ab527892f617dabaf893291ae873de5322b459fe4be24e4e254e3ab8cb33a137db96f699c94e6ef5a39dc078a94833d9d1867ca28fb4f1b3dba532ec9eaf3dcb856c623cf59ecc8f623f16654c6763f32e3acd6f92dcf9d36df3fade75e60aba74be532b6fa5d33ce94311176653dd4f86e95ab58f383278187439997fde7de5eeb7f57b9223d4f927ac85d64f50c0fca79a4f1d3a1e722c90bf5ef4a63bb5f0e958b4819526597e5e28f0ae132b7fbe74099d7eb7c669c1a1f1917d62f73e5a007a7ca95d50fa6812d1f72fe944489ddaf44b9284cff2cb0e9af1957c67de53a36fd8bc0aa0f6de1b2d13f57ce43fc7de3e0af540efad455ae6ad27e73dcb0f607d30bfed0e66bb2f314ff2ea1d4f2313526cbf720b0f6331819d7b6fe39b0f53b9bafad3f90bc5fae6ae69db28b8db71b96785d98cfcc5fa15c87fb830d6bfdef1ad75aaf20ef499936ef49a11cf4e9ded8f471ab619d7f0eacf9c44763d279780a6cf3b1716df3725fca2acaad1faa7dc5fd5dced79172b37e1058f5a0ab5c5abc80816dfea2619d1f1b5bbcf0d8b0ce2781ad7fcb7eab342ab59fe25239d863bf61ad9f993119ef07b6febf6e6cf5462f816d5edebfaa0ef3b8086cf353e5caea05260d6bff991bdb7b000d5bffdc37b67e4af2bed459bbb4f7665339fcbc0107ca2eec6f4db9d15f04b67e6cf6411fd61bd6f87ac6a1fe40b9b6fe092eb0f5c757e561acf50b6781ed7e0e1a96fb0992bfba0ef1c2b572e3ef4539f8c3bbc0ea0fbbc699f14ec3da8f82bdbd3778635ceb7d03a9ef61d6b17e8487ca8d7ddb38d83f07b6f773686c7a386e58d78f94433e70621ceeb79cc7709824767ec7ca6965efed4360fbf9f948997fbcd3fe38372eac9f55c695f5979e7251d97d3b0c6cfdb456a6d4f27fa9ecc8ea25522e433db694ab90ef57e5667ff7c6b63fac03db7bb36a3cd4f33f5afc77e3ffa3818084ee3fd7c0122bac71c8e3df5079af81576c3f62fbf1bf5241a7e32b0dbcc6095bde88cae8cf34f016ef70ca63f6a61334380bba87118f7bfef8887e51c1075698f358f098e1a3ae68349ef0195f782c25d2252bbc7ed6c055ecb2fd9ac4b18e3ffdda370ddc60bf2fac62dfb24afdab0a677c938757d13866b8e55798c6367bf0513436ac32fa9859dec78e28ece21eeeb3fd3a7b5c060d3ce0f587ac30fca0b1fc9859d6e8b1c6111ee3099ee219f659e74dc3b187bb8f71c8ee6f58c3bee37df82876f11c07788197d8c208e30f1a77bca28bed4f1a635668f3f78effdfe6287aac91608a1976388e1c0be0e344173400786df7bd06902974c1fbe8c94e7228a1821a86d8822b18b1c6b8d1e8f12a1fcb12c8a2d8e06c78851d99e9c1b53f1398c00debdcf2e706ee60ca51ccde69f42c9631677895631889f5fb1836a5ba66ec7f06f7acf0e0e3f075661a9bec4763e94a5ed47ff75d0c3d98c302e71cc9233cc1330f1fc5f2bd865fc5eb5e2c1ef9185b0cb060fb092ce11556390f5dc9c512d654c35703ac9bca35fc840dd8842dfea6d7e461ae3b816dd8815dd8e37f7d0cefea432a6a9f57facf011c420f8ee0184e6022114875fb1870ca319cc219f4e19ce319701c8fef35e002e7e271032ea10511c4d086c4ab400a197420e71b3265ffa750101210115732956f1a12c95cf6bc49155cf26fe343bae2dc4d684463baa609aba438a31bb6bea53bfe774a33baff74f71defce677d8b1e684e0b7aa4277aa6175ad22bad5297d6a0837d5aa79fb0cd0a1bb4c91ae5470daf422f3865ef279cd113baa22dda668d1db6dfe5cf1eed93e376bdcebb98d2011dd22f7dcc723263ab2768730c3d3a8227e6255b1fb3c6099d7a0d5671fe17571e67bf6a888aafdd3ef5e99c06e4cf6f411774492d8a389e98dabe26f8db180694bcddad4f6f838381f4a7be7dbce205c7b0c36fb068f89a6085ecebbede64c559f5c8c7fbe55d7428a742ee29d796c38f3df28b778e730553f686d2ebbc5fe433e021d9283fbe2d5f6b041d07307524778263619cba2fecff5c23e87c1e5faffc9fbcfbfffcfddb1f4bcc6304</data>
+ </image>
+ <image name="image19">
+ <data format="XPM.GZ" length="2127">789c95d44d73da3818c0f17b3e0513df323b2d7ec59e9d3dd88eeb80430a69094977f6204b328a3010c020a0b3df7d253d625b3a21d9351cf80d7fc9aff2c7abd6e3a0dfbafa78b16e50f38c5b98a155eb8a6c66b3fd9f7ffdf1fde2d2755af21b382dfbf2b78bcb0f2ddcba5bcca9facde56fabad37455f336ce376a8d851b443dbb335b1a26bbb6d57cff34533723d3752bc33c440a4e8d99ee7e9b8d4449248d1320c819f157dc76ffb8ee227c5c0f149a0790b0c7ce0574d24a9c74e0d23605bb1e376fc8eab38d62c3b51a754740c09f09b62e88676a8e307cd328c42fdef8b21013e29465e48224ff11918d9c047431fb8d1c49258f1de30022e0c09f05a117911417a2c03221b3830f481074d2ca9c7760d113030a44057b1f4102df5d83eb0748013c30038d7249244b13144c09d21052e15b15f52ec2b6640ec0053c300586812493df6c61001678614b856243ea6448fad80c4010e0d03e048934aeae759182260624881b52295290d14732075805bc300186bca94eab13d4304a48614b852ac645ae9b17b60e5003dc300686b5692952231ac801fded94e1a0ba94ff9568309a1d5843d5ba575aee17c3a25b49ecdd9e2c542679a2563b25ad17addb00d7ebdd98a9daee85e5493037ead913b8b935457b110cd353e6d9075acb675c6d8a77c2b6ebaa70d26cc2a8f554f14b7795257fdbb5f9a7c79c0f858b1cfdb3a1119c33f379cecb76931305539cdf25a0c8bfb2f278d3c97b82e32a8beeee4aee441df9fcec3a6641ff7f24cce8ff1aece733112938731ffb9c998ba2a7274d52c9b91c885a8d78f4fdfc69cff38779eca485ee19548442dd49ee25df7c0364f6d75bea6b1e54c63a233f9e989753a9f34937e77f1324696b9cedcd617586572db564d3613d53a6bfaddcd8373bc17dc4ed24c656a1b0feb2adfe6c32acd26ee60f1effde2855727c5326bdcc1f3e3741cf7621a27a359b19b777fdc539f679ea8864dc01e0ed7ec76dcdbef7bb9a86eb2e6f4bef35def663960bbf5925dab8393d5a82a7e79e639efc8b2c94749c1f499ca1d0e5f5d179ca77652a76ca0aa557e66edc86a5feb074e5667d7d7712e59bdb106392fe45cf2b8de5ca766ae77d6b23eae77d7bbacfec33b81ffeff7c6b9e6efdf2ffe0193880354</data>
+ </image>
+ <image name="image20">
+ <data format="XPM.GZ" length="5054">789c9d975b5322491085dfe75718936f131bb974030dc4c63e78c70b2a828a6eec43d217c52b228ab2b1ff7dab2b4f96ca30bb1b634beb67569d3a95555dd9fefa6d6570d459f9f6eb97a7a94c47e94a7a2593956fd9f3dddddb1f7ffefed797afd578c57d478dc64afcf5972f5fbbd39574e5e0e13e2f81c90155fc57c972024e2b4d1fbf308e34de578e2b71cbc705dcac469e53705af571e929b732a9954c236589943902d725f5bc05ce95e94c79180fb5fd333819669eefc1b93281d3187c659cd67d7be324d538e69f0ae21570ae713e50ce62f02658326dff1a58f33955cee33cf1fc084ec07760c9b5fdb57211832fc149a1ed33b01485e721b85026d56b365bcdaa675d8f66c8e7213847fede9443fe26e01cf3bf51b6fc700ece75bec42547151b4fba8187befd39385396a9722b427cd57333aa45babf364aae45b54a4df7cf9a67a9d56ae2791ddc04ef969cc4f54c59f63c4b3dabfbcd2dfbca4904ee04d6f607e03ae2d78155bf5972a39ad431dea931da3f07f6711a805b60fffc348689f9b90bace31f1a273e4e37ca0df377648c785172b36a716a836dfc29d8c6ef1a27ca7ebce6b05187de1cdc024fc0f023c7c60ddd4f35e566a47af25072abd6347fb3c03ade35b80ede3386de11b805de0aecf7078d3da7a1ff061871ae8233c4778da1b71658f59e955b11d83f3f6e3b59fb2765b73f753f6f82cdef4360edbf6a8cf66f60f813ef47528b73076ccf8b8033c4e3c0da7fac2cf04371609dbfcfdfb066fde545d9da731158f5e660f3bb1358e36cdcd2f3610f2ccae2f7db3013d1f6543546fc129cb7fc79237ebdd2bae4186fdb58db937ffed2cce2f4aa3c8cc1eb8175bc477002bfc682f126e01cf5645f394df4bc235f8fb2baf5e71a18f3e163b0f9bf524e639c9f2d30f4f80c2cca42609cafe2fd67791a233faf81557f0b9c806f8dd5bf6460013f19eb792d2330ea9df8e72f4f42fb1b30f2411563f8df56ceac3e76c0899eff6471417ddc3446bd7b02e75aefe845398f95c5e73bcf33abd77570827ade34c6fa3402eb7c8660cbef6a60f593806dfe6bc6a85f7363d4abbe728efa4fa781b57f618cf93d04d67a7c0b4ec02fc6a8e75d30eab9f8f78f2209f3cbc0980f5d80e1577265f3c33db0d5dfc418f33906633da81558d7e3126ceb736b0cbf3b81753e27ca45acef1b043ff6fe417efd8ac2fc50648cf1cfc1b65f7ac688ef07d6f11a60f8e3b631fcf5950bbc3fd14e609dcf1b3881ff8131de97c66001cf02ebfbd3088cf7a7ee94a93bfdf9cb6b0a0f997e5ec76ba49c71cec5cfaac0c7255f398dd1ff51f9de317c5cf38dd7f80f95b23fdf2ed510bee37b68fc50c5f77fe0b1bb96fb78e449d058aae2fa3fb9c8d87f96fb98f2f3078d0515efe02528cc7ee0e395df3e697c5071fde7aedf7b64ccabbcc6ebfeb3f1c1c7266f2d6840c5296c73db91a9cc788777798ff77d663a652bf838e0433e5ad0e8fa391c738ffb9f7c9cf0a9d338e381fbbdc3e77c011f158e38fe4ea3ca35ae73c28d4f3e4eb8e9345ace9df3410c8d9488c4692e68d09052ca167d504e45e9832e3ffba02b1a2dd1b8a6d4f9e8b911677e4d663ea303ba29f341b7dec75df0714f420fdf698ce9113ec66165474e63f2231ff4f44961c62f34f13eca7c8c3f5c039a2ecd47e9e339f4f63b895e6846aff03178d7a0379a9b0f5a5df0b1e6f7a01fc98df5c64f34a575e4c3f5f47f2b3f63efc3e7831e16f2b1612dddbdefee9b34371fbe67f87cf0f1bce063cbb7edbbfbadbb37689bdaf4aaf970fd764a6dfc0cf9a0dd857cecb99eedb27779d13e759cc6017c9882aa1c061f47c107f1b9f3d1752bd5a063ead13127d4e76d3aa103cd07eda847a770ea94db211f7b960fff649dd3190ddc5af5b847e7d4a70baa50613e7cef5b8ab8ea721453d53d712defa3663ef07c9a4a9d126a50d369781f8e2f9d46cb65b24ab1b0cb448bcf847c3e6a968f704e781511194a4a4dc9d487e452b8d9bbf1e552ae4a0519c9c865abf431f9e8e35d45aeb9e3fe1fb8915bb92b7dc8bd3c7055c6f228137972794a5cbedace57998ff97b3ede5564ea549ee54566f25afa907b9acb9bcce5d1395b9535c99d46990ba7e2f6527bd1c7c28cd6e94436682a9b4e614b32d996b6ec8870e13c955fbb6e97169ff3b130a33d97dd82da4e615fae654f3a72e0fc95d7350df492433992ee328d0f5eeee4588e38929edb81238edc1e5af673a9065458bacee9b9f4fdb9fac34bcfe4a555ed822fe4a4bcff5bed447df9fbb72fff000126f975</data>
+ </image>
+ <image name="image21">
+ <data format="XPM.GZ" length="6974">789c9596c97223390e86eff5148ec2ad6282ad4c2953993131072f927797f76d620e00336579b76cc9b6dc31ef3e14f123db2ecbdd3da562a93e91047f8020c8df7e2c9cee6e2ffcf8eddbd398c7977ec10ff971e14735b9bd9dfefb3ffffafddbf776ba10fea6657721fdfe8f6fdff7c60b7e61e7feae9e014d02502bfe99314be4a2d551f6db60df2a62ffeb8c9396f5d306b850968172d249e2784a2217d6cf3abe08fd6a7f0d5c28d3c18cd356584f794939317d37c63a5e1ec185aec727ca6927d57e9d5fa6d0e3b7c018ef378c313e9d713bb1f1f264acfdbe02dbfc1763cc3f007b8cdf6cb88cbcaedc6e294bcfb89d44f6914b9bcfd17e27e9b43ab19f63bc3adce9b4e37c77032e3a1ced1b7b65399c7196760a1dcf6f60aff6dc9572d6ca6272f81a9c2973cc8f2cd857bdfc6c0cbd6de5305ed7bb0797cadc0257e06cc6791af4ab3f57ca19fce7457095c7f5dd50394f94290567ca12f7230ffe62feb17296215e5370a5fec89a720ebd6e609c2bc35e5e82cfc095b2c47ce9b673f82727c6d0b30a36fdcbc6dd7664f477136589f9d1952efc73022ebb12f51fcdb86837fef5959b788dc119f24994bb09fcdd025bbcf6234b17fef339187afd52c3daaff3a530bd97e00cfe907111f5ca05b804f7c19532c7fd2c3b590be76b47d9ecc9b8619d3f01231eee40b94cca4eb45746f6d62fd7e04a99e2790bc705f5879ec0a82f4cc6a827bbca65027b2fe0ac507d6760f847f13cb1377b542b67a8575228db788e7aa4d39ce7dc98a33fee165c88fa972817967f77caa5f94bca9ca87defc099c64756c0acf665195cb38ff6614f52651945ae3a05f45c83bd54d1bf52394f34df9cceaf8a52fbfdb37209bdde1b637f1f94d9e27b0b66e83d520e7a22d32138d778b81530434f77c63e2becfcdc834b9f45be0457cabea7ccc82fbf0cae11bf4563e8992a4b8a7c8be7d78778a83e7e54b6f53d290be2ed5f957daa7add03987d648ef95cfda1ff42b92c2bd55f832b65ffa0ec73ec5717cc1a1f89f955d54d7ddb075755bcefdd8b723751e65be5d2e2e59543c18cfd9e956d3d8ef1acf3702023bbb1b2d5232995433dd3fd9f28fb5cc77b015b7c30df231ffda3b1fae39f94ab147c0fce552f45ffeaba5de8fb846ec0f65e6163ad376e4d39cba0b706977a5fd29572b7d4f3ebb6958b12f75f47b94c908f5330ee17c678ce747f1dd697bcd678de29d7a9f6fb5b70aef1a6188f41dee8bf36d6f7803b52cea0c775954d2fed36acf198822bf873ae5c26ea3ffd540ef91fcf276f2a8be97951f6a80f6e43b9c27e49ae1cf4c7fd900ccc3a5f3ae0e061b40f7d8354e341f1bc0d06e139a97a5b60ec273be52cd3facc87c6fa9ea16b30fc7585729e60fe9331c65b3fee4b3a31463ccec095c69b1e95bb19e2d736863d0fb6f8af1aab3db70b46fc69cf18efd51563dcc70363d48354393c8fd5ffb631de1fdbc638df5b60e8a58131f2f3d418f57868acfbe3fa60f3e7d518ef892b63dcafe760f3efb261f5af678cf3f6d318ef9b3363ac0f7d25fc7579c3fade1e19e33ede33d6f9548133e443698cfd367bf67e79341e0c226760ec1f5f802bbcb727c6782ff78de18fe9aba0efc678a0fe21df18e7cf6d36acf5651f8cf706211eccc8cf7b30ce2b1d35acfb81fd9714efaf96b1d65f3a36d6fb88614f72bddffc5bc35a8f2f8c711f2f1b235e88bf30f67fad613dcf99b1dae3c218fbfd64acf688c135ec8d1a567b4363dcdf5363d4a74439944b7d7f358cfbba6b8cf5049cc3fe8331dea76fc6b8af860d6bfd6363d4bb6763d4370263fffc9531f4540d6b7c6c7dbbcf4f8dd59eeb806be8b96c58f7f7d658ef474e8da1cf19431fea4f85face4bc6782fad1a63feb131f61fe7b9ca510f9d31f6db1b637f6c7e8ef7e2b531de23cbc6b82fea86d57fe473c5fa7ef60363bd4f65d158c7cbab31f49a7f35cedf8eb1c69b9e1b567be7c63a9f91efcdfdbd62ace79b7a0deb7ac89f3ad7f710dd19637cbf611dbf0e668cbf30d6f3ee9e8d51ef6d3df30ffed7d04fdbc6187f688cf188cf007a19fb39b0fc6d1b43ef4ec33ade98d1bfd9b09e2fe4eb6c465c6fd470ecdf1bcf3e8e1c3b71de55ae760377e186eed25db96b77e36ec3f75d68f71fbf75dedef89d0d710f6e34a73d7ef1fb7c1ba3b99fa72f7ebf72633771cf6ef4cec64bb4fff9f33af7d7876061eadedca25b7a6763f98bf556e6feaa1a7a6ec9f5dfd958fd3f74ac050deb6ec36dbabedbfa1b3a3ec7633b6ad8713fddaedbfb6063df1d8435573eb4c35f78d68ea2866377122c6c85cfe93b1b677f2b1ee7d0d0520d2e71e9071b7f1d8f76d4d07159d4d077b9ebbae29d8dea2fe351ce34902372bbc46e8b843c55547fb0f1a73a68e0a67441c36029c6812ee98aaea9a69b7736067f160fbaa521ddd13d3db89446ae1f343c062b4f34a6c9071d9ff7c55a8f424ed30bbdba34ee454ed3a0e18d1669e9c379f9420785bca1a0857ad4a7555a8b1a7cd0b01e2c6cfc72e606f3e2419b41c356f8dea61dfa196cecd25e8cc33aedd3c1a7733b9c6b614487f83ea2633aa1533aa3f3e0458b92cf679fd25f75c499eda0a313be33caa94b0595ec9898596832a77e0ce758d87123f6a1852b89077cc143bee42bbee61bbefdc2c61ffb72183ce8f11df5f93e5878e0113ff2138f79c2cffcc2af3ce5b7793678f1b386597ef1122ff30af7b8cfabbcc6ebbcc19bbcc5db5fd8403c78e6c1cfd07683963ddee7033ee4233ee6139a84d9a7a19df1f95c1bad391a124eb9cd1dce380ff3bb6176c1a53821e1af75bcd33012112f95d4e1df815cc8502ee54aaee5466edda1dccdb321f71f35c8838ce4519e66ebcb980b99c8b3bcc8ab4c6947de645196e6da38d0bd9065eac98af4684213e9cbaaacc9ba6cc8a66cc9b6ecc84fd9953dd997832f744043a88123390ceb1fc9b19cc8a99cc9b9b4dcab24b35c097d331de91c1bed593c24e4a464a1e5a175839e424aefa8ef89363dbb911734efabcf367c0d0dbda0a71f468573ec2f42966dd18e0f39ec2fd1ae663afcf53c1dfe26ea081afc6d6877a105effc831ff9c7f01d2aa21f43c324b467ff32676f5f82dad7b0e6d4bd7a7287fe2d78b0483dbf14dab25fe17d59f4bdd0fafe3a58589dab63cdbff8f5d836e4c06f86cf46a0d064490eb405da6afebfddd8f8ef3fbffd0fc8a6e071</data>
+ </image>
+ <image name="image22">
+ <data format="XPM.GZ" length="4574">789c9d97595323371080dff9152efa8d4af57ac633634fa5f2600c2cb01ce63e5279d01cc636f8c0366048e5bfa7d5dd12c61c45c22cc767499f5a2da9edfdb156b96cef57d67eac4c6766d6cb2b79d74c2a6bc5c360f0fce75f7ffcbdb25a0b2bf42f88ea9570f5b795d5a35925af1c8c86a505a4fe15a8f2976573a31c29f7854d994596e196b9611fe699722e6c7ac25928fd4d47b80ccb84f9de725075fd61dd71c0f3e19d7010099b52b84c747c2edca12f1edfb01ca6611ea6dc5e58ae05615e0bd8d715ae5585cd403952e6f96a29318f8742b9218c1de55cd80c2d47412d8fc4df148eaac266ac1c697b9dd9101bf6e7ca0d619c2be7da7e61390ea33ce6cd42e5b8aa3c548e85e15a383705ef2754954be553e1221436bc7fb171e331f12cf19c2ba7caa572210c7bc2ce87c67212c64522be33e124103623e558188e857d7cbf1ccbfec2aeb0f343ddb1b69f2827da7ee558da91d79798244d24de48d8cfb729ecfd5b8e753cafaf5eab07f51af38b722c0c67c2ce67d0b1c6b721ece3d5f13e3ebe5ff58c7c19f3a972aabcab5c08c38eb0f7cd95d507cfca46fd7cbe1bb57ad190f847c28d401842e558b926ec7d6365e7cb9833ea2ff115caa9301c2817ca32df6b7c2d65f541d3b3e4ff5ed9e5efc9b39c2fae3f69d42852ae27f82c9c06ca27cab1304c84fd7c46d9f97b9ec5cfe72fcd697cce0ccaa9f258b910862361ef03cfb29e4098ea9df8793e13a58591784361d70e6dc71da96f9972a2ed43c7d28e9c1f931b63249e81b0f77595753c068e757c4dd9e87c1c7f16654956f0f844d9086355d8fb22c7321e7e2aeb7e62dbb1b6a7cc85f73d2a9779ccf31b617f9f51d8f9e0c6b1c67fa45c2a1f7a96f703ce5f1ee7a1f8615b3911c67bcfb2de3b65238cd7c23efe8eb29b8fdfeff2a270f52416f6f19e3bd6fe07ca3a1e1e3d73bc980a7774fff1ca33b71bdecf22a67a25ebd9574e8471a2ace711a7c2eefd16636517ffb1b09b0f0e3d4b3c5bca89f20373e9d68b3b8ed5bf2eece603edefd7b3a9ac3eb85436eae7f3634f93f6dff62ced1bcada1f787de5ab7f5fd9f56f29bbfea5b2fbbcc0f5a4f3ea6f28bb782e95b5ffd1ecff3c0868e4af8f1c9861bef0149f384aecf0ef9b65078fea527b46f3f4b08fb778675ffb349a019ab70eea3dc4118ef11e2738c519fd7cc0477cc2f9b2059fc9ffc27f35171d6c78a471ebd8c20ddca4678bbe7fe236eee0eea28522fc4511dce0dedb7ca8614ae3f7d5708087d8c6237a8ee955e32c784286535ae5199ee3c5abc31b2ea9778be3b8c26bac628021d630c2985eeb8a855631224342cf1ceb6f1c238ea1459606fd3cc614d01a00c090a78a3164ea78c13d9af10272ac43e11c58d01c3dce430b4a8e65133a70035d72f4c8d2a3580ea00fb7b2d3b486a18d018ad77c501473b8a3dc6dd0778bb3189363004330308231dcc3042398d2dc9a558aa129e763c1915114d6b0010f94cd6378a46c0614c113cce1195ea009403901587f7f46bc03c861f7e28af2d0818ecd264ca045860dd8842db200fc846db8fdc2d1a37361e7b759b0797031ecc02efc823dfaddc323d8ff2a0e38c0091ce2158fee421b8e348663388153729c516ecff1e9ab38e082e2bca435d8f360f7a2a9315cc13554c931267b0bcfbf88a3a09bf568b301760d938518ace19af231a1bd9dd25ce1670ece481fa7700836934f50234744793855c39c5618d309fff0fe2e38e690d0096d531c2d729c419d56609f393d0332b4a081d9570eb6ec424a67b4cde77b4cbbb963907eb76c0cd0a7b3f9491d59bafba7068ca1b3d4a6b340f7047a26a33cc494096bd8331f5a966b101458400a539af780eebcbd2353ec9bc2aed5d01b28d59e77968f6aa1b9c10b3ad5dba64b156cc8d5313337a667fae6966e6c7fd9b2900f5fa7b158acc96e37c97d47773521cb522c0b0e5fa73fca9b5a06d87c1fcbbbb5509db6b5e953cb1dddf9a558fcf978a61bc31160f333c3522cdea2677dbc58a7bf7e38960eedb5b7c867717a16ea3451f95f2cf279ff6d9d466386df88a549965b6b91ff63bdadd3df799cc58cf04ef3716e6330e3ef1a5e2d7061eeddbe2cd6e9ef5b6066ebdaea3fbfaffc0bcb04b0de</data>
+ </image>
+ <image name="image23">
+ <data format="XPM.GZ" length="5502">789c8d97d952e34a1286effb2988cebb8e893cb62cc9529c980b838166315ed899988bd46230e00530ebc4bcfb4955fe250ccd99e9ae96cde7aacafc7329c9fee3c7dad9a0b7f6e38f6f0f4b594ef2b5fc4aeed77e148fd3e9ebbffefdcfff7cfbde0ad6f47fd088d682effff8f67db85ccbd70ee6b3b2025e2850c3fd73fc52735231790e8df9ce71e2990ec089eda75ecd36ff00ceb17f5071b3b267eb9760ccd3b17135dcfa99e3da3ea7359bbd39d8ef6f1bfbfdb40f0e9bb69ec00958c039fc5dd56cf39715070dcfb4675c0dc7093834e6cc711ac01fed7a0e52c73be004dc00e7e056c5ad6690b79a8e7f1ab71ae01370083e739cfa79cec13ede028c7869db73cbf9e3b2e250ed215f31380fcd7ed3386c18f3d8b1b4902f8a8cc33014c721383116175f148479e49a4f8e8ca38631af3b9610f593d0b3f9932de3a8017b9be0c8f6d346cde61ff6a214dc0517e0fb8ae3208a908f1b706af1c8d233d677c0456cfede8ce326f8d5b1c4516ceb1fc129f8195c188bebd7762b2eda2d377f6bdc6e1acb1b3802bb7ab4b3187a6408f67a26c6ed26faf1ba66575f7906c31ea535678e9fc02938001760771e92566d6fe0d9e2e1237084fe9fd46cebb73d239e47700a6ed6ecfcc90d18fea5f09c98fea9b1b6b3f10c1c81dd794db2a469fd4d637004ee7b4e2cbe393835e6045c809dbf344c52ec3f041769e8e6dbc669d3982ec011e65dfed33c29707e6e8dd326fa3bf70c7f31384a7367af04fb7e24cf36cf21b83016771ef5f8f97cb68cbd7d3900439f3c8153e82fc0382ff2e019fe22cf62f1c1be348d89c111e65d7d25177f5e72b03f2fa79ec5ec076001df804bdc5fb63c63dedd1fb3504aeb273ef09c99ffbe711618d3263836169b2fd49ecd67c659007b0d708cf373e7392b1c2fc062cc3d70692c4e5f1e79fb121867b1e9975bcfd0730dc67e3ef49c478e9f8cf57161f18d3c637e0f1c1b67eef99617827e97045cdafeccfc69bce89f0cecfd5f18e731fced7bce2dfe11588c791b5ca25f763ddb7ce6ea5944b5bf0b700c3ef46cf9ca266041fe7a35dbfa1d30fa21bbf28c7cbe1ae7a87f760946beb371cd56af1918f5cc0acfc8ef39d8c7f7e819fd0e3d455cb8f5e29e3745e9ed672518f66402467db3bc665b9f191701f27b0d8e514ff10c7fbb6029dcf73b1a824b6376df17cab840fee8085c96b19b3f352e03f4f7c0b3cd67ee7c971a0ff24d605f8f73b0cfffbe71817e942be332809e2518f37c52b3d5833d97b67e0b8c7ea373cf987f0597c6e2eecfe3b8d673665cf87a8f3c43df2918f6a50b463d64cf58f5dbfa75b0cfff5dcde6ffd2b3e54f080c7ddcf13cb6fc6f1a8f7dbd1f3c235fc79e51af37cfd83f04c7c6e29ef7e371ad7703ecf5bed46c7a4fc0e81f597886fe2918fd22c735dbfab1b1ea33ee80a187bb60d44b4acf98dfa879ecea2be031e2bdf76cf3c3e5af83898533ceb9e092c75fad781f5fdbe04bbed26bc2d77cc3b73ce5cbff6f83673ce705df7db8267ccf0fbce4477ee2677ef9343fe7d9aa0dfde49e5ff9cd5d6fdcd1f70eafeb671bdce54ddee26dfea91617bcc3bbbcc7fbdcd371c07d1e7cb031e4111fe2eae9eb915a38e6133ee5333ee70b6e70d35909b8c521471c739b134e3fd878e31eb1ce4744fa3a21e173ca28a7824a1ad3255dd184aee98617744b533766a4d17fb271c801a91fbaa305dd5719a5075aea1ebd56073dea78a2677d7da697cf3a38560da15a58f088e6eae956d7bdd21b75685dc7860e7befeae7aa46635a7cce076daa963eb78855cb962a22daa69f3a763076698f89f6555f8f0e54cb9c3fe950efba9b0f747795b516b7a9af360634fcf5d2884655663ee978550db1cba7e69c0e35e76dcdda3655f5f965d0310f758df6c9a7587a5a37cda846d3d32bd0cc1cd289fafccac69ebe0e2b2dbfd4a5a7165a74aa7938d4389e346f3f2b1d9a3dbd74c7bd7edaa5bebe9f39db4ecbbb0d3aa74dbad041da3b81c6d3a70b8da6f1373a9a9ab7c1bb96957c04ae7f83aa369a933e05d4321dd4818611748414515c558cafa85ddbe868655d4e5d2433dd176834c9d73ab48a23ed80535d95beeb10d6de9a6b7c6d579baa4baa8cec381ddd6ab5e544ffee547f0be910c9247fb741e79a812dd5d2af7a4b7312d14c8abfd3a1df054b19cba55cc964c5c64077579d15aacf394e95d751e563dffcebb5affd3e956bb9915b99ca6cc5c61107eab73a8db3eaec6a8502997fa5031ac6ba7f217772ffc146bfca92de17aa0eadf2325dc947df74d0a994aae14196f2284ff22c2ff2ba6a43cf49755fa93a7c2a6faae159cfec271daaa0e3342c74accb8674576de85d2ea815cc38a1b94676ab2715f9a02eef6b0696eeba954dd9926df9a93676566abbab91a4f2e6bae2495fab7bc7a37650ad4315ac6ad8d3fd5dd997de071ba7dadd7a62b52a95955b8da6ab770b5f97912ad8540d07d0d097810c6524872bf9186a55a7ae2766aeae7d5a97233a361dd070ac0a4e5441a5e154359cc9b95c7cb0d1aa6aabd9d43cb85c6c48436da80e9783a65e816a684143f51b2c96b6242b396dc9911fbabb7aadce558f06d030550595867445433be3771b5f3de7c83dd7e868258a7567a1ab5918a98276461967f26ee3eb519d812ccb72f7eb699c5dca6b76954d745c67379248a2bfb17ec3c6ef8cff6de377c7f7fffef9ed2f80c853d6</data>
+ </image>
+ <image name="image24">
+ <data format="XPM.GZ" length="1947">789cc5d45b6fda301407f0773e4544ded0d4921b249af6405ba0a5e5da8b264d7b706c877b82038442b5ef3e1f1f9785d2292f936683949ffcf7c1b1432e2bc6f741d7a85c96d61bb29952834e486a54d876b9dcfff8f9edad54766c437ebcaa6195bf94ca1706357a49cce1da94d7665535e044d345f6157d491f986afac81b4d8a7c025ad52ab5d4dc29123a30d4749144d1870ebc05da558bda6af415091db8d674915da01338be1300ef811ef1028f001f8035bb66d56ce0005877ea5edd015e29869221f00ee83b75e6abd1a662e87bbe1a1d6906c8474d867c0106aecf0217b8410616926a7ac8992295a4c0966680bcd664c86720710346d4dc399258c885a687dc2b524935f7a049905b4d8e64c0d0253c547397c8d046b6356bc886229364c04c9320634d8eec00a91772ea013992da48a15943f61499a49a9b6812e44e93238740e651ced4dc08c96ce458b3865c297249f5785f14b4ff98318fedf38c494828378447d158f65cee98994ccd199d2f96314fa26835862e528cbd67d674335f6cb7592c44b293215909be279957ba3fc87745838bddeebd8eec3ccd65ccabeb837c9d641986c6ba523cc9676e9af32d447892afa316745cb319ce5a87761ceb1f5355ccd335cbd094dcdeed3b1d5da7737fbcf9fcfe440fe674d311aa8a0c74cff60742e35edb4cfb6a9b07ac75dcea93b348f96a37943de18dedfecf699c9e97897793c4cb51eec03e9e29ac6528da8f7f39535d298a92ac918f9c3f3fe970280e2791f3cc534ff07941a6cf45f65c90317b22a3451921962f4519b981a3e24cbb30b3e28d665126ea14d6b9f8f0e7fa3473defe59e6d7d7d26f4dc4ad2c</data>
+ </image>
+ <image name="image25">
+ <data format="XPM.GZ" length="3709">789ca596db5222491086ef7d0ac2bc333672a09b6ee8d8d80bd119150795f130cc6cec451f4505e58cb0b1efbe59995935c880ab3ba61df291957ffd9555d5e187bd52e7a255dafbb0339ec493bbb49476e351692f9bf6fb8b3ffffae3ef9d5ddf2bd16fe497bcdddf7676db93525a3a7b7acc0d201040997f0c436c388cc328e4c170e73866ce0cd7925a54f3b9de779c30df2867ca9ee1ba6f19f62dd7a5fe5ab85e51be540e94af9813cb30742cfa15e5481816ca99e69f0c47d520f32bcc5f846d1ea696a32af35238aa687ddbb2e607ca81307e624ec38a1f71be2b6cf3008e531e7fa11c299f2b67c230331c571ddf5a8e456f2e1c57348f96258f67ca81729939b50c8563a99f28c73abee558f27de55c39359c542de367cb89d49f0a279e72a41c2a7f67ce2c43cf71c6fcac1cebf8a663cee3a172ae5c379c068e3f5a4e03e603e1d413865c39541e336796f1c4b1f8b9578e35df702cf3ed2be7ca35c35960191e2c6752bf14ce3ce58572a8cce72bcba34a55eedb48d8e58f1dcbfdfda61c6bbeea58f243e55cf9abe13c8c8240eef7a3b0cdc393e53ce4f147c2b9a7dc510e95a53e8f22d1c350d8e59f1d8b7ea21c6b7eee58fcf1792bc22853bd409846487e66b990faa970e129f3fba928e28ad6c7ca41c0fdc4443809e57d86a972acefb35c38f5f4fd73a71cebfba0ab9cebfd2f1ccb7de809679ef2ad72a8fc6059efdbbdb2bd7f13615a51c13c568e9547ca85707bf26bf1ba06c2cb58cdbc4563bd7e55e7a5de668d9f67deacb55d637dcc666faf696cabdfe6f0bf7afa7f7dbc759736696ccebf25ac0655c69860ca4ff63e15d1208514732cf096a2a04fc97b54e47f15f26015ba147744d9b633f6b3ba6a24a4708f0fd823855c57b4fd818d1a29cd6d14cc2a62f2d0c7c7579ecd1a09b9e89117a3f0b47d159bc3f9e8b18b140744431cb918e304a738c3393ed3f7435ce012f7b181071487f8911e703ecc7e985dfd4434a28a391e511c534d034f687c134ff133b6f00ccff102dbf8052ff10aaff166c547977bf1951586a4d0a1793ba4f2cda91ce0778a169655a5821efaa6372bfb627bf18c55aa9e63406be860488ac75863f7758cc84d0b102f008c06c42b1aa9ebc5982a86ac3183445764bc981e1c9a15418a67a4423e40cfb3f3617b31a739ab5437e72e762886c44bac41ce5d89c84701b7d0c56bb87ba1916a2f66704fe38d86e987f150350af000396934a1077d590badc4b7e7c4f9905e74a87b4b78a4da108fe04914284c570f756fca74240630b42e567c985e1c91db06552c48c5542f60a41ec6ac401d85097774fac385d3b0bd68d27cfb3032c1f3d7a80f63faae4e1ab22705cc6825d73f5c380dd38b2a8d69e221d5347817ccd3e03ea8075698f3aefaebef31aa37bd58d05a239ef180ea4eccc327ab69154c37e19676f552cec59a06d0ac3486469e428f2a4c5d139ef9f329f46937cc9938a768d33ad6de734ea341634cc70b3acb2d8e32df8e339efb82fa38008001dd929bd55eac681cc0021674f2a6b0a49928cc5f5852ff2b145730a4d9f7a90b3e64eb0a2b3ede159bdfebbf12bbfffcbef32f7804b985</data>
+ </image>
+ <image name="image26">
+ <data format="XPM.GZ" length="6238">789c9597596f23cb0d85dfe75718c3b78ba0aed4da5a08f220dbb22deffba2200f644bf22e5b9b653bc87f0fbb7858e399892e90a929599f587dea90c5d6f2e71f6bd7c7076b7ffcf96d36e7f97db156dcf174ed8fc1e2f9f9e39ffffac7bfbf7daf656bfa3f6b54d7b2ef7ffbf63dbcae156b872fe3610972a14095f8af64ea38e7b5c89fcea3515c5f07d7b17edf19f149e4dce3d24b9cc7f5e7ce583f04e7888f9d11cfc005e2e28cf87dc9d58a5f2f357051357f77ce585f352e478c0f9d11af80eb16979bc8b9b2edffe48cf57d708ef899b3c5e919ecfb5f959c55aa85ad976be7ccfc7c3863fda5713962fcded9e23c00c34f68466e6775ac0f89db317e06ce8d69cf19d76f955cab7a3c1c828b5a35ae3f75467ebbc635f8a177b0fb7989dcf6ebc5d6b76b15e33006d78db970865e0fecfdb051725df56be6ef199c1bcb03b830a62367a9475e3aa37e2fc6f50ae23bced8ff0decf9c4f3af73bd5237bf67e0ba31b59d4d8fc5197adb60e4c30c869ff0587223533d8efc00ce8d6901f6fa9f1837dcef16b801bdd82f0dd56fc49b9f2e8c1b15e3700b6e203e77865e17dc865f020fa01fefafa6eed730bf2370db989fc103ec374c6cf9cc8c9b55ec3705bbffd8df4d6e569be66f046e80abceb87e130cbf21f653abd66c37cddf0d78604cc7ceb87e62dc723f15b0fb694596e6a015df1f8318b7aac6f40a763f7d709b8b588fe08c7a8ec1038bd38633fa3dde6fb9fab1faf101b8817cd8b9259109dc36a643f000fdbdee0c7f2fc639f2e5d89fb9fab37cf8128c7a9dcc9dedf3819f8cf3aaedc7f17e6bd773d423ac83dbb65ee2fb4dbbc8abe89789b3e9cb12dcc0fed5c4515f0ab0fb6b26b6f81378807a549c738b6f19b7ddefba33f2794b6cf52370a36df77307dc3696580fbd9de147dec1e80f0989cd4f6eecfa7c08f6f3db76b678d877b6fdc25562eba70f30fc845a628b7f8207f0ff9ed8faedc098ab32887c036e148de83fdeff5cd6cbeaf368cc55d3a33c71d40ba7607dcb89d7c7f727513f389f7563467ebceb0c7f3b6086fe7562f37beb6cfad4020f8d79692c19f68fef4f3260c6f9bf8187a8cfb533d6778c25c37e4d67e8f712dbf55be0a6b1c4f793a2c143e477652c19f6177013fbdd26b6fd1a60c6e7c70378682cf1fe2a06827a848e33eeef2bb0af1f1b1719f4eec14de370e28cf38efd38d0fd509fccb8688217ced06b248efdc3a760f7534f1ce3a1ed5c4496d8df8361817ce4c019e79b25b6fa5c3a43ff018c7cb99ed8fcdc190f32cb2f54c1eef7d6d9e27c92d8fc5e3a0f2c1ecf77d82cbc5f4689ad3e4367d47f6a3cf0fea924b6f5afce388fa3c4569f6730fa83379cb1fe3cb1e5d375463efb892d1ff8d78f1b8bcf135bfcd3789859be62fa43df4f3ec0380fd97446fc2cb1e9ed3863bf5a62cb6f1bece7d577463f72628b5f389b3f82de30837ff81bf2b019394b6cbf77e2e7dd48f383df4f67f859389b7ea883bd9eedc4e667e48cfe98258efb8529d8eb3b7786fe5b625bbf7436ff7c031e22feee8cfcf6125bbc613cca906ffcfe341a0dd11fb2e38c7c5a609c173d3ae37e39486cd79333eacf609c1ff97e7e7eaf892dff8533ea354d1cfdf2b9f108f5e7cdc416cf9d91ff4662cbffda7914e3827c467e3e93c4b6beef6c7a5424b6b8efdf84de0c8cf3e23d67f8e925b6ebd37abb3eec26b6ef9317e011e2ddc4317e320f1438888e42c740c7308cc26db80bf73a1ec26378d2f1ac631c5ec2ebaf236a5298846998857958e87cc358ea780f1f3a3f4327ac878db019ba616ba5c62c6c871d5dd1d3673e67cae5dc0d7b613f1ce8b3f2f9e10a0d09471adf0ec75f54665f544ec2695498a993b3bfd0e8459573a8ccc2053c74c365b88ad1f2f9f5ca5c6e54a31fd7554235a9ec46952cd4421d0ab3d008cd151aade8a31755f298d78f5ab49187a9ec5158a151c0877b398f0aa58f3d22e2a4300bef247fa1117d501177cfe31999c22029947349c3df5562cf8f4a1f7a7d3f65b41fcfe8846ef555f750ce2509ddd1fd0a8d1e14ec6455851e743e7ef130830fd5a0a7df7219ba0f2af4b1cca8a77d95c7f3d88c5d61b317dea28f677aa2f12f3e5e568e579ad0946634a705bdd192decb7ad0477cfcfc49a313c70badebdcf8f27743353655a34b5bb44d3bd4a35dda2b33518d7dfa749598cb880ee8908e92968f757571ac2eba74028d53d5f8a03375715e6a984af4714197e198aee89a6ea80fa5d24b4535aaaab19532395517c8248e4ef2714719d5a84e0d6a528b72ed8a3eb5a9c3415d549968aedfa4857a5cd01e0fd4c590c63f14a071afdf8e4754e35bbee37b7ee0477ee2671ef30b3c7d1de5b958269d9f6a7ac1af3ce1294fc39c673ce7055df39bea2c29e777fee04feee86347ffaec7feb8d38a767ee98f07de500d1b9baad5e5056ff136efa8a72d1dcb387b3a77a38ff15785a4f11afa3cd14eedf39efe5df23e1ff0211ff1b1baba55bae3139dfb7c1aebf9938269f099e6725eba2895745cf0255f6965ae79379419bea9b79b38fbbf2bc0c72357522e7ba1cb55ceb856feeee226b7a2bb4d9db9cef6ef0ad078528dd287ced095c01521619ed3838814fa9b666299ea3c90e12a0d19b982ee5c7a9a0a512decf0426ee5ceb3d47bf251eeffb7863c943e44ef737992e7783693f29386bbe15cc6eae405759ac8ab4c5669c854f45d58e65161024f0b59e829d7e54d96653ea5b2fa5895cb982b54c8bb7cc8a3d745e76698ca6754e9c83ab7cad75463958f0dd994ae6cea75e73f54e2b3bed6a4af55d992ed524576a4b7426357f6645f6b728c8921073a0ee5488ee5444ee54cce75af8b15b91ceaa7d7967e729c852605b9d47125d772237da9e86355472635fd95a7bf3356f9f8fdd5ff6f7cffcfdfbffd1765b20a0d</data>
+ </image>
+ <image name="image27">
+ <data format="XPM.GZ" length="3277">789c8d955b53e25810c7dffd149479b3b67a7227a9ad7d60c60b33a38c78c5d9da87e424082828c845666abffbfebb4fb302826a3cc61fe7f4bfaf099ff62aadd393cadea79da77136ee9a8ae964a3ca5e31e9f7e77ffff3d7ef9dddc0afe0378e2bfeee1f3bbbcd71c5541a0f8392811c80e3ca8f705539b4ecd8fd842fd9cf948df21766cf758d67ed7f5af642e533e1046ccf17ca8972c9ecbb7c09fbcaa172229cfac64f8573e6c0f34de009ef5b0e5ce5483954fe269c82adfd0173e8856168f76f85337026dc514e9407ca46998be7447e682229263d588e5ce527e54879229c81adfd77e542f99e39f6a322b6e71f2dc79ef29d7016a7b13dff8bb91a54bd6a205c538e94a7c2393817ee2917cacfcc49502d127bbe6e19edb0fc43384fa2c49e9f2ba7cae7cc69987a6928dc508e94dbc2066c842f9553e543e542f982390bd322b3f6c67216297f1636607b7ea45c2a1f31e76156e6f6fccc721e2bbbc205b8100e944be5636613e5a589845b968daf7caa1c2b7f152ec0d67ea89c297bcaa5f20d731199b2b0f65dcb85af7ca21c2bf7854bb07d3eaf954be52be612bb652ccf2759e64bf66361ec96f67c5339534e99db71db6fdbf3a1b0fcd897c3472e72c8d9bcf3be066c33f99b93611d2ad6b5ded3804d496dfcbda50e75a94777744ffd5595ed1a3676280c603da0077a84fd23ee431aade6b54d03a79ee0bba431ee13ac47f8679529cdb0f74cf31795373438fa89c4c0f73b5cbfa8866c783d239acf0b954d1af48532da87ef311dc0f2908eb0a650a8c3ba8e08ea50f88afbb76d1a88a003fb07c4f19d8ee904cbc0e7881a5098d30f2c43a7d82fb6e7028d89d4624e4de43e85e23e9d6175d09f7359175875c4b53117e97f0effb7f0d584cf09aaeae8c5f3d1a04be465e3ea2223675d03e77a52ff0962b842ddc6a88b7651542e607f210a06f5b84696e5068d1a62e00e720c03565889f152ac39863eb5a43eafe2c0b93399c363d46182ff9db53ab1c211146e709fbeccd98b063efb2933f08c5ed4b80e6b0a2eac5da81fa30eb54d738a333c033d2c839307ebcf15f667aad0220f916cd668c8fcf570ea92fc5751b042200aa788a34fe1a659a708dde02b40efd715d83a402f5ae8e8357a1663f51653b6a451a0170d4c8fbba8f7ff0a2df13fc4d545ad5ced4d8daa6bb9eccb0c72ff67b8274b5361fddf88420cebfbc5d4ade6824fced1353b83475069b00aae53cd7f883af611438a33c5729e2b1a1e2c17fd77e17591bfa719f4a50e295675b386cee84c6258aeffc2ff9543b0e72bc41c6f799f426324d6ee4afe0bffb1c4c70a57fc66de92cb107e3df5df7af1af197431c139bacf4a77f6497b1d87e3c0628e9af611c195fa6f4af431bc07c4cf125799e768eb77037f6fc0ff35ac03f19f2296b9c41f22c3a56e6faba93e55297c1fa26ab1f8bf80cfb168ccb67dc7ad6a884a13b540ddc56e8867b890ff67d0fda086a8cc256bd630788738f219bf533facc116aa756967755b0dded2588aa77cdbf23d8df77daf68fcfbe7ce7f0d107249</data>
+ </image>
+ <image name="image28">
+ <data format="XPM.GZ" length="1617">789c8592cd8eda301080ef3c45c4dc50b50b496883aa3e42ab1e2b553d0cc624c6eb21216177a1eabbd7bf210d31b538f863be8cc7e3795e243fbe7f4d16cfb3b6c34eb08455784a16bbb352979fbfbefc9ecdb334d1bfb44856f30fb3f953c2926f47e2660f7a0f4bbb0cbe194c37e97255187c3798add23cb5d1d663e1f0ec9139bc58dc84e8c1a38f563d6e0c760eb3a5433498afb2dce13660660b161e0b1755015d942c62c09347e67067709de6cbcc7efbe2d167963dda28b38801b9c7c2611330b7df5e0d7e4c73e6f0e870bd76b8b78801eb1ed160e971e3f0d5e0a72ce0d3c402bdc27eda01c02d223c7000d88eefcb6d055107c441b217869c471d50c4f89e315e46cf02c1253bd692498a3b8dce52d71c9be8bda0924ae7d1d5a8b8c38951cd45d39f34e134a890e3e1d6c1a97a4ed4944363e4d8d0f015ee1d201a45ef1c68094792cb387438e3750543a33bc0c84125fb3732c6b9d23784713dafe54de904e99723b8bbd74dd1fdc616793b7686d59a7eeb4c3cee80e448fae5f8a8e67f9c664b9c6a7ae0c09bd079de09c7fd193ad4888b22757de8208956f866c51c526d7b8dcf3cb8c314c4e7b9223f21fd5f13f36c7b3b5c13f32cc76374e79064583d76eca8fee7aca935fff379f617c93e5058</data>
+ </image>
+ <image name="image29">
+ <data format="XPM.GZ" length="3613">789ccd955b53db4a0cc7dff91419f68d39a3c6d7d873e63c242df40a855ea19d3eacbd6bec5cc1242da1d3ef5ead249b1c92703aa50f874d20bf68f597b4d29a477b9dd3e3c3cedea39dabb99e5779272f75ddd9338bc964f9f9cb3fdf777603bf83afa4d7f177ffdad93d9977f2ced16c6a1d8042505dfa21fee4d84bb2d84b1c2bb7590569900429d9878e432fec861ed9cf897598849aec81e3c80ff38882a94be6a82bbc108e8481584769c4fe5ec386f37bd7b08d697f2e6c64ff3173ee33ab91e3d88fbd98f4612a1c097799f35898f28f35da59af104e853f0a1be1d0712f884d2fa0788ab9e731c3857024fc9e38eb7996eb39138e7a19f997c2a9f085b0618623c749907809c79b1067499ab03d66365af8c4711a26260d69bf664e3d61439ca7519a134f8553e1cab10e53a3693fe4ccda635633e148ecaf99ad2f7c459ca39df46026ac9915d9b350db8cf747cc992f7c201c0b9f121b64437c23ac85b5b015a6faf228b379443c67ce7d6635148ec59e121b64f25785b016b6c256b8766ca2dc1af61736bef0ab86a5df563816fb3362dbe6f786b9cd6fcc8cfbd9df6fb8288897c25aec89b015a6f9b7e8cdf70516ccd617be168e850f5b66ff0f0d176cef3117cdfee7c4b63dbf4be6d6bf2fac85c7c256f82973d1eca7797624f15eb6ccf596cc85cf7695b5ccf6817093ef13e2a2bd8f8f999348eec75be6669ee11b73dbbf17c24dbfbe32b7f5ed33174d3f2a612d9c0917cc27f387ad3fa901aa59bfabf17bbeab1a0f53f8731adb6af9d5335a3dd3357f0d19adfc7e9ddbdeae46c44f062c14700e2554a463b6ebfc7b3e24f7218c608cde254c608a4a19b2fb3bdbacb33e63b8ef826257924146f94ce0126aacee6a5de5ae062acc61815e53f1770a157c856f98d5355a96aeaaffa8e506fa12ff1cbd07f8eee3e7c7f004bfddc70afbeb2a6b1a0718ab2fb5b81c4afcfd149ec1737881dfbc8457707857654de308ab6695b128bc8663388137f016f37807efe1c3dd5cd6343ec22976d5a99c61fd19697c822ee69281073e9df4182df5adca9a4600214418a7c6ee34b311438f72f0e594f7b14709a48dca7a5f947bdd288dbb16d8515451197a7bad82d398a075899ddea2014395c38532cae2ae84545673e05562264b55b0caa61953e73055a5aad4904e66d2cedaedaaf0bc4658efcd660d5219c1195633c3484b3cbf1233b9ab52c2428dd51077a9cdcf53aca850133545158bf1ae316ab932fb6e0df03b0bb59a6dd3a05cf04cf0d69fd2ecbb5e8f319b6aa59a31aa5b9ca7ad1a7cf75065869dd658f9124fd16533907c2aba3fb5babc4f839f04a8720073acbbc61ef5f17c07b72aea0aa3ccefd76874705a0aca6441cf9492b2a9955623ece096be6cd44949c14d97c5139aa142a9169b67ec5e9d84fa31c2b989d464db9dfb059d0dcffaffdbffec0769fcf87be7270982f4fa</data>
+ </image>
+ <image name="image30">
+ <data format="XPM.GZ" length="6366">789ced984973e3c81185effd2b189db70e470e011220100e1fb4ef1bb56bc2872c00242591d4be4ef8bf3b51f90ad39aa6a65bed091f1c664549fc9085572fb30a2552bf7c699dec6eb5befcf2e9ee5eeecf8b563192dbd697f2613279f9f59ffff8edd3e74ed6eaf45a71d46ec59ffff6e9f3de7dab686d5f4dab1af85881dafe55b3bb0277c1d79e33e5ccf3149c19f36ecd51bb5d44367e645cb79a6913dc35968ee7ac6efefe5570612cfd9ae376043d69376cf11563bd62f7371cdbf865cf79dc35a68d8673cf97e0cc985fc105e2173577a2b8e8449ed9b8d336e613cf7927ebd8fdb7e0027c537337eab6bb7ebcec83bb16775eaf2b81250a8cf17be0cc98a7e0a22bde8f1f9fc4dd0c7eaec045e21757ae8d93b68de70a9c589c1e3dab3efc16c61ab7f104ce8d25ae398d93d2d84d8cd308eceb954a1aa5367f064ec067e01c9cd7dceb047655c336df12b8048f8c7b1178c1b3eb25bd8ecf67059cf79ce76570692c0735679dc0fc68ec62d3e307700afd3bcf2ecb33afcf6bc622183f6fec629bdff97ae55d1d6ff30dc1a5319d19e749def58cb8201fba01231f4ec182fcbcffbcc8511fea05b6b8b8c079e1e387e012f11d6389a037d7b0f97b0527a84f02ae503f3f9f6e97b03e5bc6cdfcabc612d9fc3c0c2c96ef2e58ac9e14c6439fcac08817c62e463dfdf9219a8fc5c5f48aa0ef4a70622c3760c1fc8be00aeb7162aceb67f9ee832b5b1f3e6bd8e723be3eaef66f7e16c19558bc3276b131b5c121df4960d4e7c8588f1be303708a7cc4739987fd3b367629d63706073f93c0c8bf0cec8c8b864b7fff33b8427dd68d8b14f591c0960f6f81c5d8f9f3b348c2fe914330f68f1c83b19e726faceb69bc06c67c720e0ef93c07863fe815a8af0c02239f2770f03b0a5c249e3b60d483e1679082c760d487e16730005f04363d67f132e4eb8681915f178cf517362e309fdc0686bf49c396cf29b8029bdfb24c91ef088cfdc7997115f2cfc1582f5e0757c877ce7810839fc0d0e76b70d82ffef9289332acc73c18f3d3b57115f6ff7960dc5f8143bd7be0b01ea70ddbfc7be0e0b7dfb0c5178c0731eaf70c46fd9cdf1f65a5cf9bd5fbd1b88cf17c5c80f1bcc965c3e63f03877c93862dde0787fcf7029b5fba0b0c7f65e0d27fde22f35f35f5da098c7a5d81512f7a69d8e2c82fd48fa60d5b7dbae030ff867153afcd866d3ce60ff5e3c5c0a58dc7fc033176fe3ca9523dbfac7e2918e79324609c777204c67923a7c6cd7a6c376ce31fc0617de603e3f9990387f3edaa61ab0ffc34ebd30d8cfde40257a98f778c43fd45025bbd08fe2a3caf740b16f051c3363ffc87fa13356cf56d1b37f58f03a3de87e050ffa586edf3fa1d58c097e0017810d8f273966f15d6c78d03a3be27c64d7d37c078dee4c538d443a6e0705ee5e090ff5260f34f6be0709e8d0323bed5b0f98f8c433dc8356cf16d70a8c73218f5107fde0d74bdec7e7902c38f1018f3b35fef817fd5bc77ffd7b5ff861e13d35fa7a76ac28e8b9fd37c47af6ee5cff8fca31e573cf06a431e799fd5c734bfd1233ee70bedbf6b7ec8e75b3dbdf352b5c6e8a639f13ea77cf5537ad7aaf475ffdae70ddf7e444fd7f48eeff9811ff9497f5b7fe617ac8f789faffcfa01bd399ed7fea48af3bca04a8b3ac3122f6bff5db3e4155efdbe1e5fe95d73bca67d9d377893b7b46debb5257dbfa3ea0b6f7ceef2ee77f46e784fd5fabccf077ce895b6f5dd916a6fe8d5be46fb3ad3d73e8ff9f83d3d3ed1bb4ff98cdb1c71cc1df5167357db29279c728f33edb9f6be8e7853cfd97abac58884843be438a2fa555049150db45734d43ea273229d2daa470445ba98a5479734d671424e7526aa34a52b6dd774a34ad7da4abaa53bbad7f8d88f79d01153557b9c9d2fafeaa8277ad6bb6ee945db2bcdd13c2da8d2022deaf5312dd132add02aadf931f56c0bb44e1bb3f46893b6685bdb0eedaace1ef5b5edd3011deab523d53ad67e42a73ca433556d6b744f67eb53347b7d799762ea50575b42a9eaf42853dea69c8e85e949cb2ae2f4fb5ea9dfd006329491c6138a79e5bdfda2ab11c9b95cc8a5f6ba8d65a2196a93a9bebfa21355aa6424d77223b77247ab72f16deddeee3fd57c947b79904779529d27f5f62c2ff22a73322f0bb2284bb22c2bfa7355fba3accd7e46de9e0774a13eefd5d3ba2a6da8d2a66cc9b6ecc8aedcc99ef4b5efcb811ccad1acda7dabe73537d4e7b19ca8ceb61cc9a9f633551b4a5bd522cd37d62bc7d2f9513dffb4aca8cfae7e1f4f24959e64aa9349eed8911cd4ff46995dbbf7f5bce6aafa3c74ce15fa3bd26faffafdd59512bb811bbad1c7f5ea261d8adcb97a4cd5af3677e12eebf7efdff1fdbfe7badb6b9fe33a4b3751edc3d927d58fead5cd8dd4e7b0f6f967b5fb713daf39f53e87ee4fff2e7decf38bbbfef604fd4ff4bedffeaff73faef7afbf7ffa37f568f0ff</data>
+ </image>
+ <image name="image31">
+ <data format="XPM.GZ" length="3549">789c95955d53db381486eff9151974c7eca8fe4cecd9d90b680b4d29064ada023b7b614b3604484220a1a59dfdef7b74ce6bc78424bb5b35110fb21ebd3a52c29b9dcef9c95167e7cdd6e32c9f0d4dc75ce70f9d1d3b1f8d9efffceb8f5f5bdb61d0a1ff49d809b67fdbda3e9d754c279b8c4b075a11288fff3956537004ae1cfb9e6bcc253812d681e3d00fbdd067f6c091b0ba11ce73f1699f39a5f194390427e02ed8807b8e233f3491f823e1c81356b970e20792cf8263611d33e75114e5cc0938015f808db01a0937f3bf3a8e83c8c45c3c7d2e1c7bc2ca081779c079d515b814d6a7cc799cc6b2de17b0155677c24589fa9d38ee06b1edca7a67c2dd18fc8d392716df009c823f832df8d2712fecf9bd90f988b9e8c5bd82f93dd882df394ec2244ef879a5844d80bc63619b633f7cbe4991a409cf57f7c2b6c4f3939a91ffbbe3344a6c1a318f84531ffc81d9d4f751df0ba7716a9853702aac34d862fca7e39cae8797303f830deeeb4cb8b9bf07c2a9cd65fd7de1dc07ff00c7e047661378b81f137082f31e830df8ae669c6f25dc7c5e8e85c92ff93f8273f0145c82f97e155133ff165c7f9e1e84f3b290bc4fc245007e0bee823f315b62cbf51c3a367189f55451339e9f335b531a79fe56b8aafdbb8e6d6c4a1b3397c236005f83bb60febcda9258be8f0ec139380797e03dc7253d5d769987c26520acd85f75aba092f13eb80bce982be28ab900e76003ae844f67ab9a565aad1e596eeb1c64c875f1df3c1b1c8536fcfa57cf6a07a77006ab4bee377ad63a0cb74a5fe96b32994d795639e8e921efe286e7deeabbcd79d63824c508bdd1633d214bb9ba3eaf1da885b47bf64cf503bd3fea1959e6e459cab3d2e1663d359eefbca7a9fe41efcffa2759765f7a961d34b247e30f54c9b7d46acf3bfd9edef7f5018d7da0b6cb79fae279e980e123199ef4a1fed4b2187d444dee8cf3143a13cb4b07eee6319f8121c794fb137d0a4ba13feb33760c1686b60319f6a9b993b494c555f20bcffeda588cfe46868273ec2def8538e331e739a60a5e63deb9bee0d99718ad775170f5e75ad50ee243faada77decf998e75f34092ef9f7322eed90e6ccdb39f83316f098af43ee8d8ed816f3cf83d678803371a7dc38b89a5993c33dd7e5993d6a6290f3a8c7337a5e912171f7b671f4695cfc5eb39ed7e41ef0fc7a5c6ae1ee48e3e054c58b1c2ffb41e3729c35b570b5c65ed8d96ff6297d86deb5b316f71b83a11469cb91b265b1ce224741f7417656739fcf7497cedc2cee183b52de5ff6aa2efde64e3a76e32e45abb5ce853c4af36965ad3c190c354b352987522ae7b50f1677acf6b4f2f8f4caa81619d6f7b9e714aa5046597e7ede76b43c079ca78f5ad475724637bf541539ae3807b795df41afebe3fa4c5df32e866a48ef46d13713b96e5639161ed4c7ad2f396865754bb3afe875877eb4cef12a4f9f32f0b7961aab09bd0cb7b1ba773b5aef58ae0fef44a9a99a724d37d663431e398764712eebffbe6ca88fe24c8a0c1397e3ff381acf5283e3efdfb7fe0120af7f9a</data>
+ </image>
+ <image name="image32">
+ <data format="XPM.GZ" length="4574">789cddd6db52db481006e07b9ec295be4b6d752c5996a5dada0b20844338271cb7f662743006e313d880d9da77df56f73f0a4e2061b357bb210af531d3fff48c2c91776f1ba7fb3b8db7ef966ea76e7a9937f29ebb69bc2d6683c1fcf73f7efb73e94d2b6cc8df20ea34c237bf2cbd399836f2c6ee68585660125053ffa81d1cc1993a112795a9696e2566a7f38366d8c4f80446bdebd6b6f98577a0e3b402fbbc529d84898dbb0b38872fcd2d5f3f36473e3f839147981fb731deab1c36ebfa3bd8e75fd5b6f9d7e6a889f923d8afd7f746fdb0b6ad7f626e17989f9be3147958af13c0c7e604e36ea04ea304fd8c61dfdfc43bb4fa4d731cd87a7c08a770ec8df56ee002b6fe52df0f5fc2383fdef2c6f808f679fbe6b48dfe74bc15d4fdad9afd7adc31d7f507b0ef67684eb11e65b5ed7c77cdce615c3f5f2de907eb0570012f9b7d3daf9b5d80bc39ec60fdfc45553fe635735284a9d67f30d7f55bb03f9f356f5b9f5318f97ce46d7934306731f6a3cf43e43a7ebdb63909b09f433845fda9772b50bf37a701c63f7a63fc16c6f930e63b7f3e1b30fae36db8441e9ba55fdbff9e37f28e61bfdf7d6ff4dfae6df97abfdb61a788acbfaed9f7cf2db39ca77907461e1fd4b6f15d7316b6cc098c7e39f4c67e22d8d7efc1d82f3faa9def8f7be624889c3a82db663a37e7a19d379fc00ed6e72d0eebfac09c95e8b769f6f389e012f5e7b5adff07b5cbcab6e59d998b18e3d5cb9f3a2d57b6f59701a5e6bafec85c84387f07c7d8ef29ec607d7f76b20c79fcd93b36df9bf3d0faa147b3e499636fd4cf2a27ad7afe06ec2ccfb1b9aed7f74722eb755aea1d731ec209ec629bbf0e63be237381f3227d9ee5751a7732f5b577a2e6a9b98891a7fb4df3bc4c348ff5f97251ee30ff135ca691ce6f990b67667d5fbb3c0fe1391cc383dab9d6cfcc05e6d3198c7cd6f75526fd61febdb90c9d8debfb57b6eb7d0bc7f0436dad677dfe243eccdb6a7dbf166d6f0ae118e393da858eebf35194655cd8fc3e5c16f6ff0f3ddf32aeddf72e63f58ab91b625c7f5f95653d5e9abba199b6614950ebf977636f1ec3ae6bf5fafbb7db1577d5cb70d77c30fd775fffa50c2676fefa990ccea432e7824beef205f7d4d9eb3374ed4bbee2be245ccbd5d7a4010fab9e7e9ca1eb8d78cc13bee15b9ef28ceff85ebe3f884b9ef3e39714cbf87a9fbafe32aff0aa54ddf37b5ee30f72adcbb5215e95944dd9172d642cec517ad8d2848fb2f6b654eff02eeff1be5cbb7c203f9969cadcd7f83ef8d0f752f7f0893fcbba477ccc277cca67729d7393030eb9855e22aba9fb68735ce54a0f1d24249c121391a38c72deb28b0a2aa92b3933d96569bbf17dd005f5e852be5ff198fa744d034ef944ea8734a2f197cf074d2ad30dddd2946674f7551f13b97743eed33d3dc8fa737aa465993dfae6ac8856e4e7abf45e7ab9a9c6ea3ed6a4fa03add3867c0d346168eb3ff7b9d1944dda924f1d7de9833ed236ede8fabbb42709fb92907d5bbf907220f7ed691f87f4893e4b75957044c7550fdf7902aa7359a113e9e4691fa7d2c799d4cfe95cee45f3e51efcb948c6883617fa0828a4164592d2962baeeed17733aadd4caa137f725f62ea50223da44e02e9dcb17d5e5ece708e56163f1ff21fb59c2e9f5e72b70f5fea45120a57baee4206d97be1b9eb858c0b572e3e73ffec4b127aeed2f57e3e434ef38eeedcd5d7ef8f7fd443df5dbbfe6bde632f260cdcd00d169f80d767c8f9921bb971f57d71e475195a3fa9fe7dee19fc7186553e5ffd7367fabfcff8ebd7a5bf01ac66b48c</data>
+ </image>
+ <image name="image33">
+ <data format="XPM.GZ" length="1812">789cad924d6fe2301086effc8a88b9a1554b480254ab3dd0967e51567b5c69b507c74e4a20e1237c53ed7f5fcf0c4e61a97d5a0b053ff293d79e71ae1bdecf1f43af715d5baec42a939e1c89d26ba87551ec7ffdfef65eab072d4fff42dff3eb5f6af52b4f7adf67d304e7a0e7d0a481f88a18f84133207378c490718018fa6133247c2114a10c05e21362d40a65d442bc2714d14d44abcf889da0ad3a01e22363c7673c207683aedf25dc238a50f82244ec21ca284ef8907d46d99611e29250c976eb06716190cf7c67502ac4f11185df455c196479522145ed105524139625a36a35091f0813251475f2f68809a3404cf5e0332715d2bb23839c1c1be4123283dce76985d4c9ad41eeb3aa905653839d18f1cd20373637c88d5d5728110b8331adce0c729fe70615e1a642aab73498a6f48d59061cff1d0e08f83f4eec7440afe25d034d3f7540240090bea5fa9908b0e48cb2f1242ff2c9381b5972b4344df3d97c96a753b09f1916c5bc9c174b70d405abf5a6dcac570e07b67aaf8dde6b6bdd0b926cb7c8d7f9629725d6da85ae7aabb6fa293eaf1d4a80fd017a71cfda43286feff6877b70dc9756faa838eed4a438eebd4ab9b27e631f2927e3dc818743ff423977b4f2f874a19c395a797e19bcfeab9c3a9432185e28278e2de5c4b1a67c38f694ca71a418c79572749c29ecb853d871a7b0e34ed1ce9fafb5bf980e8315</data>
+ </image>
+ <image name="image34">
+ <data format="XPM.GZ" length="5630">789cad96594f633b12c7dffb53a0aeb7d6a86ece9a73349a07f69d242c09309a873a4b420849c8c27a35df7dcaaeb29b25ba4d5f0d6e68fd62fbef7f2d36fcf163edb27dbcf6e38f6f8b252d87e55a7943f3b51fd5c378fcf2effffcebcf6fdfa3788dff0579ba167effc7b7ef9de55ab976329dd4061018a061bf2c93722c0c4be1308e02cb57ca59945b0e859346b3304c5dcb99db8f7dcf999d3f55ce84e141d8ebed08478d58ce3bf44c960f94e3c4060337ca9930baf5a5f29167bb1f757fdc1026dd1f67a9f08b30c71359fd48380df2d8f29d709e9789e557cf956552ae8429331c341aa5c48b5d617ffe83b23b7f53d8e5138e85d3242f2dc7cab9f289703320e1b6701614e2178429103f5858ceccb0e70d85933c93785bc2cd5cf73f096789f2b36789f745380f84d1e6336c045a5f5c3a0e6c3f14a05c0ad3ad701a64d23f23e54418d685b380e4fc33e544e22d6cbec39c15a55faf859344f20989b0d3a347e54aea4977c24dcd2fa170a6f1d344b9d2fc9e3bd67c6c08e79a6fb2fd16055143ee0b6e082795f65347b81968fd326557dfd4b1c6db54ce8569acecfc9c0afbfce49e65be1026aaa45fb72d9b78ed7abc16a65ae669cf701c44a5debfb170eef4361d4bbcd81076fba1142ec2cabe2f706199f24afa834098fbd1ae2facbf248cca50ea371126ed27982a27b29e6cfed230d3fc90cd574aa9d61b9f9473e58572a51c0897ea8f2c3723370f73e16620f5a24439513e14ceb5ffa01226d2f86cbd9a05af97fe1d2ae7cabbca95f2967091ea7b315526655bcf2c72eb29742cf7153785f93a8bbf63e544e7757d49122f9e39ae53cba7cab530d9f72e2bdc7eb8f52c7e17cab93066ca95cecf8439bfb65e68ef5b1e677adff0593877ef292a6b3fd240d8e51323e1a2d6f7b52fecf4e15e3955ae3d4bbcbbc255aaf1ee7896799bffbcccddfdef29e7eab7e9d9ce63ae5ce97ad12f8b507f1f3484cb50dfdb3d61771ed9fc53ecf6e3a563e967bc1726bdcff8a0ecde83aeb0af67ac5c6b3f978e255e180857daef85cd37954e0fe79ec54f4f998469a65cebbc7d3f8ad8f348b808f53d182ba7caa970e9de179b9fa272f3547b967ebf5226dddff12cf96c29d7bafe55b8d4f78d48b80ab5dee7caae1f1265d27ad8df9765e2f4f0cab1d4134f844bad2f0e9453adf79e67f1b325ecf20d3d653d0f02e55afb6f5fb8a6bef87df1dcb77ad67f59b9f3e148d99d77a94c3affe859e65bcaeefec8793e1f64ff1eaa123f3f72acf7b72d5ce97da35859ef1b3d296b3c64ef5755fbf97dcf32bfadacf5c263cf327fadacfd0c97c2b5d6930acfb2ded6a74efdfe0d65771f2e1c6b3fcc849d1e4e94f57da07bcf529f75e17e28f5217b5f3858f79e4c3dcb79cfcaee7d1d7a16bd5b6597afcab1d65ffcd6ee3c7cf52cfd60fdf453b71fef1cabbfa5b0df5f29a73a6fdfcf7edff3c2b3d5c75259fb0f6be5be7067f97b03e1f367ab74109056adf5b35fd2c1024bacb0e6f5fdcf3bf8d3c117756e70c8e3d6abbdf16655465fd401ab23e3eead37ab32363a58ffa6ce102738556fe2e5deea80f8fce9ec173a13559aa9977b9cb38ef134c7c5671d394175965661aa0a3f558c9707fd7ec427feec9907fcd4e14f5ef015d7d5ef867a99aef022df8fd6cb266ee136d23b9d1ddcc53ddcb76a07788847decb31cf9eacf062545ad8c68e28f9b84ef18cd5f6789cb3da0576596bc3fa1b630f2f3f7859b0ca15abb4f927bcd3b9c60606ac1562843126985a6f47d8e41d19ffcc59c37b01b45eda9ffdf0174181d750420535f4318201ab5dc00d0ce196f399bfcb8b7869c38875e06ddd59e98e958cda18263065b57b98b1d221cc450916b0840758b0e6181e75981ea00f3a4ff00c2ff00aebb0c16393b5a6b005dbec680776596b097bb00f0770c81e5a9cfb011cc1e30a3fc770022d6843074ee1ccaa9dc30574a10797ac7505d7d0c00402aec121eb18ad16eb7cf063954288208604526842063937feb9f1c6e176f96f9702fad0e7bf5a2aaee5c80caae188eaf77e6ccd66d4a701ddd0906e690419ddd1d878a3897ae3bcd114eee99eebd8a319cd6c677df24373d659d092c7801eacdaa3f1c66a6fbd4de98975e6dc933d8e6ef4d18f7534312a7cbf6fe919a7acf6a26aefbcd12bf7bcf493e9515aa133639521adcb5d677f1b3c06b4f9d11b6db152132f39b2de2a3fbcf35914f876ceacca36ed988efbe06d976bb6c55dfdc0e3934e67497b46e1a70a1ed33e6becd0018c4cdf796f875c33f36a6cf1cd5ba57344c75c8336efdfa613de2f5e5ad4322a3c73426d126fdc7fa6b7d9d3a7fcd8d8fa48744a67bcabad2a07ecc6a80ce8dca860872ef88ecc8d8ebd252bfc785f5d56eb520fafe8d228bcf17245d7bc7b243796dd6faef6f3d91b9fd8712ae2851ab403b714705d421edd5fe9bcf5663cd015e72de2ff63fed93391b14a42a75fd37997b794fbc568f568dff881213529fb1d9d7779cb39fb7981460917c55fe4f92bdef84532359b17bfccf357bc1585d0dfd7793ffe6f3afffde7b7ff01db83b1d6</data>
+ </image>
+ <image name="image35">
+ <data format="XPM.GZ" length="827">789c6dd1cd6a84301007f0bb4f119c9b14775d2d084b1f614b8f85d243cc8731eb76a1dd1e4ae9bb77c6980f57070ff9f3cb243aee0af6fa7262c52efbbaf1db209830fc9315f2fb72f9797b7ffacdf2c381e15335acca1fb2bc64823d5f3f14ad01d7b09f8ae299625dd5fb7ada2929b6b557eb625bb5354543910bceb9a038cc51b9d853ec1aaeba86624751487f9476517021290a8af2d1eb48516b1fb98bfe5ee522d5f439eb0228b70578079b82203685407a01ac25ccf780c2820504d1ba870524626001f73d11ee7a128862b027852066301674027e3a48f60cba8f1065c096c15a144915a40484de38c07984194c2f4737d1763a30998e761d7e7e5e7c47b83dcc0de68e149ca8758713395abb82494659c6ff16e5ef98fd03965bb80f</data>
+ </image>
+ <image name="image36">
+ <data format="XPM.GZ" length="2269">789cadd4d76edb301406e07b3f8510de05c51f4bd644d18becd1ec9d14bda048da597696338bbe7b299e23c676560dc44a8c7ce6e11994e2a9c9e070732d989c6adcf665ff5405ea44de0493faaedb7dfaf5fbc79fc6441405f6276b05d1c4b7c6c4563f50c1fa65cf544069219aeee56c9c73cbdcf98c1db32fc8ad3871c920d92a91cefbe4bc90aab2d0e4222c63b7becb4e4aed3ccfd62a71f1ae7ed8f4f9cfd9395b78533d458e9b29ad37c96992972e1fd845e1ea8b92adc9d823d7fd629d6cfba5fe36d875bf07ec82fac5269bfbc71c591ae5e2459b5c469ad633b28a349d7fd7398f9b348f9064df2fcd97676141fd1d9365c8f572b6e1fc05d9e74fd9a9499db72b47febc84206709e5171db24ca87f44649572be7be722567cde6b645f3f21fbf8c5caad304952ba5f1d72a6791e4dce4349f763a5721c9686f7b7c8ba9e67d559faf962b236867c443611fbb072f212bfc0aefbfb59398dfc7a9f5d9fd7acb3f4fdb8fb99b74ac9f32eb3ebf967c84af2fec7caf6b8eafd616d5eef392bdfcf095bb22f2b4be5f7df92b5e4f9a62b97b19f7fcb597b3f91fd79dc54568989da54ffc1f965fdb9b24e8ce4f51d67e37dc736ec6befb6f35265937a9f92db11fbaa72dbbde8cbe8ffafaf8a8718335ea21c2b5e41c38c95bf8dceeb1a1fe43fc1a9ad71f65e3cce71e17fbb367f0f97b81aad3114dfc3b58da0eb06b7e8e3cefe3534c740fc3d1ef088273c631a3398c51ce6b1e0760cd418885fc41296b1829f58b5b16b58c706366d8d2d37877915bf8d1d9b77177bd8b791f3367e170738c4118ed1ac2b0cc45fd8f810115a88912045861c45152df0663fe7420889a690a2144a689b3b1bce3d1c2f0c4a7bd17b0925daa3b93fbebfa2339afbb3e76734f727cfcfabdc9fe41fef79966f7dfa75ff8fefc6fffddef807271766bc</data>
+ </image>
+ <image name="image37">
+ <data format="XPM.GZ" length="751">789c6dd0dd0a823014c0f17b9f62e89d84a62218d123145d06d1859ee3ac0b0bca2e227af776f6a1db7488eccf0fc6d9d2989d8e7b16a7c16ba8871b30b8d64f16e3bbef3fe7cbee1b8479cec4b76159b80ac284013b3cee2ded1bb18fd67251d626ab82b2a3ac0aa3a0b2ca38a7e494501a8d5442ae142939871c4aca56252d3983b7a2ba11ff05890088e62240d24c2410f9a241902723f862817b9a0dce040ed8826d6b8125c8b926099320bd952405a3a07a46411a8c68106440cb08bc33a06409a420e21c8ce00cf4698a1c301310b9304e8de8c174531f92f0b70dfee366b514</data>
+ </image>
+ <image name="image38">
+ <data format="XPM.GZ" length="2910">789c8dd6594fe3481000e0777e4544bda1554d7cdb1aed03e10a10eec030b3da8776b79d03128e041258ed7f9f72557504885d91c6e08faebeab87f9b6d1ba3e3d6a6d7c5b9bcdcd7c645b76681e5b1bee693279f9ebef3fff595b0fc3167d0541d40ad7ff585b3f9bb76cebf86e5a35c02e01dafc690cf7eab89d73fd8577c0f53855db40ea17e2a02d862776be6a1fa97375eaadfd056adfdf481cb443a9df53dba8603b7118c786bd54e7092f0e77c4519c48fda6382bca987dbdb263cb7af3bcb0e2ddc6417bd5dea8f354fca2b659c4de16c7b1baadb6b9f85c9cb4f392f7e7569d14329f637196e87cb6d47e7e736f9bb07fa89dfaa7384fd4969dd37c653f40ede79b8873a7ebed884de0a4fd893a719c1f30681cb6433d0fe8ab633d9f521c591def519c3963d9cfdebaff67623f5fb86417d41f9f2f6caa73f585da8a7126a6f1e43cf61b474168a3807d294e9d91f126623f3ef07aa322ca259f604fedf3eb409c05dafea1711c94a9ec07fe525755ca7e12db507dca3664893f6a9c84b49fb25eceaf344c9cec170cc569a0fba72e7c3edc884da5e7c1fb9b9a3491f503e74b1665899c2ff07e642559f28def13a54320f9080b75a2e6f3c94bb2c4a3ba50f37d2ae2dc49bec2545cf8fcbd15fbfd00be8f85a57a3e7f0075a13e533b35ef97890b3d2f78151bbfff95d8ef2ff07d30d624925f30561bf5b9bad2fceb895d584b7bbe6f656c2acd87137119aa7bea54cde75f3a329f07d46aa33e54576ace379b9446f3fb406c43f5913ad5fbfa2a76a9ce8fff7db18eeaa5bf6db5511b75a5f7376eec125be9fded8b5da8f976a74eb57e20aefc7ef0fd7595f3f99da98de69b53fbfcb3e2ca687bcecf8aae9b9e4fa5f6f9301357fe7e84ea547da83675cd1eab2b75c1ae9adfb073b551d76a8d07fe7b56a7b5ae0fef5696feaed8fc913f86ef0b021a7a4ab4e83ed67d1a6fb0c21a0738c4d197e201c77883b738c1e917fbbfc37b7cc0c72ff63fa3fee7f884cfb8f8bf785ce20bf55d5279c54dece0166ee30eeee21e763f8ddfa7160778883d3cc2638a3ec1533cc373bcf88ff82ef6a9c5255ee10fbcc69ff88ba2db1860f8593c461853e9f318579868df29669863e15bbc89ef02028081b219032cf79d82838a9efa633c0c60082318c30d6650e1126ea9efa079078705d43091163e9e7a1fc214ee68f44c5bdccb3ba919e3e16d3c453fc2b0993f8cb1cf7df66146adfa306f6648bf99d0184f6fe287549ea92c9afe286e092ff456c2825665e0151e640df2ff33d8840e972d6ab14dd1083bb0a4d11cf7b1cb757bd0c1aec4e31574b974a8ff98fa7ce607f81d294eeb7d3cbd5d3585e225f2f9ddcf0eafccd0c8beff825637a3f9eeebbcde972d38a0d51e426f154f2ba393edc33695970fcf11adf598ca98f6cecfc7500f07d4430d3daa7dff9cd0ee9cd2c99fc174157f4efbfc4a4ff3597e78a6b4570b2a2318493c65c305ed68f36c429f9ecb0f3ffbf436a0ef03daff7fbfaffd065501ab27</data>
+ </image>
+ <image name="image39">
+ <data format="XPM.GZ" length="2061">789c75d4dd4fdb301000f077fe8a887b43d3914f27d6b40718fb1e8cb2c180690f8e9dd0022dd0a65098f6bfcfb93b5763ed3055f5c397f3f96cb2bd159d1eee475bdb1bb3ce74231bd9a199465b6e3e1e3ffef8f9ead7c666a222ffabe328dd7cb1b139e8221b1ddc4c9a1e587a4052f911931f7aa7716c63f62776128bf7c8dabb227fef9d25a94d79fe889dc559423eed9d9b3ccf0d39ed5da49995f901d9e495b862177141c522887541cf83eb5d664a8c27bdabac28324d3e24d7de9c2feeadf3522b8ed764ab9dcec9af7bfbf22ad9dfc7a5797f3371e847c22e13a94fb1755165545fb3744df359ef3aafd39ad6835bb2334949f3508be5793c131bae0f5a76ad0cd77bdcdb16a5937e2cd8cb7c97e250cf83d888ef97e6faf260596fceae53712756da92a7e2c69091f66b5de972eef79760c5fd31ec2ae17998b16bc3cf03b26d5a3bf29d58b1f1436f57a822e5f37dcf2e251f5eb26de30a32d5ef1a9dc8fae76c975a9a07102b8977623f68def66e9435725e13b693f3c3b15859ae6f286e1a4596e79b544cfd6a9a52cb7dfacaf6fde4fc376c2bfd84113bac07466ca43fc360de0fde2ecdf574c1b2bfcfec26e5fd21add7aad2493d3b6c5d48bfdeb1437df8466cf8fc719fbdacef82dda4bc3e8cc5d25fb8161be9ef9538f46b11dcb277c9ad7f1d717df7e2427c2dd6f2ff78152cef2faea7d589b8655b25f77d220ef7ff2e58f6fb2d58cebb1637127fc076e17e3e8ac3793cb1433ff0ad38dc9782dd2ad9ef48ec7ff8e53ce810fe330cd67fc55874cf3ffeaf0db678f157cc104734c2f725455ce1f5b33c3cc7df631f31e923f0e6591e2b9f11defa883b8a98e26c6d9e0ee77e957b8ec08735f52cf0119f7007777dc46bdc1b746bf6f506dfe23b7c8f1ff0237eeae756f27cc67d3cc02f788803dcc3a37f62b89eaff80d8ff104bfe3299eadc4f47b3ac718134cbd323ff235790a54586285da1f0280817a350f5870d0400b1730f41123b85ccd0357700d638998c00ddcfe1be3f3dfc11466d0c11ceee10116b058c973b46e50ccef971b7f008068e53b</data>
+ </image>
+ <image name="image40">
+ <data format="XPM.GZ" length="920">789c65d24d6fa3301006e07b7e058a6f5195168c09a8ea21a54ddbc3aef6b8d26a0ff61892b84d68f3d9b0daff5ecf8c51a83220e4e7f5d84682eb51f4fbd78f68743dd8eef46e09112cf4261ad9fd6a75faf3f7eedf60186791bfe5248a875783e13882e867b3ae70ecfc58dc5021353229923c29902610980229e30424ed73cf9437cc39b190b9a4e60a99ea344f35b246aa442995209f9099ce6c46b30fc8899cc41389dc072ae6333297799c131f0315f39d683c0d721a58300f8196f9892cd2222e52e4315031b744f004e429d0321ba44e75aca9f92350313744f0a4e645a066be0656cc1dd2a4ba32b476cd3409731998312dd17a5a24046ae62ab062ce90a020e10ffa46b49001cd96c8da17cfb61d41215f3ad635fd27bec4f85c5da6cd6526405cf68135fdacaaaa7a0e8ba5e8f7b9d7b7d5ba69d6a6bfd6bd2f3e36db6627fafbb9fde178fc3cb9b67f86db4f5d7bb82f858fbb6cec1e1e5d39f3d7b9cf874fcfb3b66d67a29fb565d9bee0e39cf994fadcf85b76b19f5fec53d73fb78bf1fdfedf0ebe004832d18d</data>
+ </image>
+ <image name="image41">
+ <data format="XPM.GZ" length="499">789c6590cb8a02311045f7fd15a16bd788da0e0e8af8098a4b415cd4237166a1828f8588ff6e95d571da9ed08b9c937b4975065558af16a11a14e70b5e7e39f00f9e4225d7fdfeb6d9ceef45597f07fda6a12e7b45d90f1c96c743b43de81e86af65488e93da511c79e4980c275f39bc73cc6136e4713e45c794786c180d53caa7fdce6a3b807f0e90a0e380855cbe1d44a68e83489265e3223309356d77da131611fa731642d4aa4b77897622a85595084d2e813611b5ad43be5c64d09f302b98bbe6741c93ef3bdc69145bf34568bf42e33edfea312b9e47677099</data>
+ </image>
+ <image name="image42">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>lcdDisplay</receiver>
+ <slot>display(int)</slot>
+ </connection>
+ <connection>
+ <sender>slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>progressBar</receiver>
+ <slot>setProgress(int)</slot>
+ </connection>
+ <connection>
+ <sender>dateEdit</sender>
+ <signal>valueChanged(const QDate&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateDateTimeString()</slot>
+ </connection>
+ <connection>
+ <sender>slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>spinBox</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>spinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>slider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>spinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>progressBar</receiver>
+ <slot>setProgress(int)</slot>
+ </connection>
+ <connection>
+ <sender>spinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>lcdDisplay</receiver>
+ <slot>display(int)</slot>
+ </connection>
+ <connection>
+ <sender>buttonColorBox</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateColorTest(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>returnPressed()</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const QTime&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateDateTimeString()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const QTime&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateClock()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>resetColors()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">widgetsbase.ui.h</include>
+</includes>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot>resetColors()</slot>
+ <slot access="protected">setColor( const QString &amp; color )</slot>
+ <slot>setColor()</slot>
+ <slot>updateClock()</slot>
+ <slot access="protected">updateColorTest( const QString &amp; color )</slot>
+ <slot access="protected">updateDateTimeString()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/demo/widgets/widgetsbase.ui.h b/examples/demo/widgets/widgetsbase.ui.h
new file mode 100644
index 0000000..c4ed2f4
--- /dev/null
+++ b/examples/demo/widgets/widgetsbase.ui.h
@@ -0,0 +1,66 @@
+#include <qobjectlist.h>
+
+void WidgetsBase::init()
+{
+ timeEdit->setTime( QTime::currentTime() );
+ dateEdit->setDate( QDate::currentDate() );
+}
+
+void WidgetsBase::destroy()
+{
+
+}
+
+void WidgetsBase::resetColors()
+{
+ groupBox->setPalette( palette(), FALSE );
+ QObjectList *chldn = groupBox->queryList();
+ if ( chldn ) {
+ for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ QWidget *w = (QWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(palette(), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor( const QString & color )
+{
+ groupBox->setPalette( QColor( color ), FALSE );
+ QObjectList *chldn = groupBox->queryList();
+ if ( chldn ) {
+ for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ QWidget *w = (QWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(QColor(color), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor()
+{
+ setColor( lineEdit->text() );
+}
+
+void WidgetsBase::updateClock()
+{
+ clock->setTime( timeEdit->time() );
+}
+
+void WidgetsBase::updateColorTest( const QString & color )
+{
+ colorTest->setPalette( QColor( color ), TRUE);
+}
+
+void WidgetsBase::updateDateTimeString()
+{
+ QDateTime dt;
+ dt.setDate( dateEdit->date() );
+ dt.setTime( timeEdit->time() );
+ dateTimeLabel->setText( dt.toString() );
+}
+
diff --git a/examples/demo/widgets/widgetsbase_pro.ui b/examples/demo/widgets/widgetsbase_pro.ui
new file mode 100644
index 0000000..4d74004
--- /dev/null
+++ b/examples/demo/widgets/widgetsbase_pro.ui
@@ -0,0 +1,1158 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>WidgetsBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>WidgetsBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>718</width>
+ <height>574</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Widgets</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListBox" row="2" column="0">
+ <item>
+ <property name="text">
+ <string>Applix</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Binary</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Core</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image2</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Deb</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image3</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Document</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image4</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Pdf</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image5</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Readme</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image6</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Shellscript</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image7</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Recycled</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Video</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image9</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ListBox3</cstring>
+ </property>
+ </widget>
+ <widget class="QTextEdit" row="2" column="1">
+ <property name="name">
+ <cstring>TextEdit1</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ <property name="text">
+ <string>&lt;html&gt;&lt;head&gt;&lt;meta name="qrichtext" content="1" /&gt;&lt;/head&gt;&lt;body style="font-size:8pt;font-family:MS Shell Dlg"&gt;
+&lt;p style="margin-top:18px"&gt;&lt;span style="font-size:9pt;font-weight:600"&gt;Richtext &lt;/span&gt;&lt;/p&gt;
+&lt;p&gt;Qt supports formatted rich text, such as the heading above, &lt;span style="font-style:italic"&gt;emphasized&lt;/span&gt;, &lt;span style="font-weight:600"&gt;bold &lt;/span&gt;and &lt;span style="text-decoration:underline"&gt;underlined &lt;/span&gt;text, as well as colored text. This is &lt;span style="color:#ff0000"&gt;red&lt;/span&gt;, while this is &lt;span style="color:#00bb00"&gt;green&lt;/span&gt;, and this is &lt;span style="color:#0000ff"&gt;blue&lt;/span&gt;. &lt;/p&gt;
+&lt;/body&gt;&lt;/html&gt;
+</string>
+ </property>
+ </widget>
+ <widget class="QTabWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Iconview</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QIconView" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>Item 1</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image10</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 2</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image11</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 3</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image12</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 4</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image13</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 5</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image14</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 6</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image15</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 7</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image16</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 8</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image17</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 9</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image18</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 10</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image19</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 11</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image20</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 12</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image21</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 13</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image22</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 14</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image23</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 15</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image24</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 16</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image25</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Item 17</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image26</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>IconView1</cstring>
+ </property>
+ <property name="arrangement">
+ <enum>LeftToRight</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>Adjust</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Listview</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Things</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Text</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Stuff</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <item>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string>Airbrush</string>
+ </property>
+ <property name="text">
+ <string>What stuff?</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image27</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap>image28</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string>Eraser</string>
+ </property>
+ <property name="text">
+ <string>Here?</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image29</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap>image28</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Pixmap item</string>
+ </property>
+ <property name="text">
+ <string>Nothing</string>
+ </property>
+ <property name="text">
+ <string>Nothing Again</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image30</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <item>
+ <property name="text">
+ <string>Pixmap subitem 1</string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <item>
+ <property name="text">
+ <string>Subitem</string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image31</pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ </item>
+ <item>
+ <property name="text">
+ <string>Pixmap subitem 2 </string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ <property name="pixmap">
+ <pixmap></pixmap>
+ </property>
+ </item>
+ </item>
+ <property name="name">
+ <cstring>ListView3</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Group box</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLCDNumber" row="0" column="3" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>lcdDisplay</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="numDigits">
+ <number>2</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>Filled</enum>
+ </property>
+ </widget>
+ <widget class="QSlider" row="2" column="2">
+ <property name="name">
+ <cstring>slider</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Left</enum>
+ </property>
+ <property name="tickInterval">
+ <number>5</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Pick a base color:</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>pushButton</cstring>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="text">
+ <string>&amp;Reset colors</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="0">
+ <item>
+ <property name="text">
+ <string>pale green</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image32</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>deep sky blue</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image33</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>steel blue</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image34</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>powder blue</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image35</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>sandy brown</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image36</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>dark orange</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image37</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>indian red</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image38</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>buttonColorBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>lineEdit</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>LineEditPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="text">
+ <string>hot pink</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>TextLabel1_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Enter a color name and hit return:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>spinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QProgressBar" row="0" column="2">
+ <property name="name">
+ <cstring>progressBar</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>colorTest</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="text">
+ <string>Color test area</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>PixmapLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <property name="pixmap">
+ <pixmap>image39</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Check boxes</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Apples</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>CheckBox2</cstring>
+ </property>
+ <property name="text">
+ <string>Banana</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>CheckBox3</cstring>
+ </property>
+ <property name="text">
+ <string>Orange</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Radio buttons</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>RadioButton3</cstring>
+ </property>
+ <property name="text">
+ <string>Sprite</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>RadioButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Farris</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>RadioButton2</cstring>
+ </property>
+ <property name="text">
+ <string>Solo</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Date/Time editors</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="AnalogClock" row="0" column="0" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>clock</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>100</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QDateEdit" row="1" column="1">
+ <property name="name">
+ <cstring>dateEdit</cstring>
+ </property>
+ <property name="date">
+ <date>
+ <year>2000</year>
+ <month>1</month>
+ <day>1</day>
+ </date>
+ </property>
+ </widget>
+ <widget class="QTimeEdit" row="2" column="1">
+ <property name="name">
+ <cstring>timeEdit</cstring>
+ </property>
+ <property name="time">
+ <time>
+ <hour>0</hour>
+ <minute>0</minute>
+ <second>0</second>
+ </time>
+ </property>
+ <property name="autoAdvance">
+ <bool>true</bool>
+ </property>
+ <property name="maxValue">
+ <time>
+ <hour>23</hour>
+ <minute>59</minute>
+ <second>59</second>
+ </time>
+ </property>
+ <property name="minValue">
+ <time>
+ <hour>0</hour>
+ <minute>0</minute>
+ <second>0</second>
+ </time>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>dateTimeLabel</cstring>
+ </property>
+ <property name="text">
+ <string>DateTime string goes here!</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>AnalogClock</class>
+ <header location="local">../aclock/aclock.h</header>
+ <sizehint>
+ <width>75</width>
+ <height>75</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>0</hordata>
+ <verdata>3</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image40</pixmap>
+ <slot access="public" specifier="">setTime(const QTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const QTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const QTime&amp;)</slot>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="2093">789c6dd3594f1b311007f0773e45c4bca16ad8d3c9aaea03f751ae7043d507afed25014220249050f5bbd79e995d550b321be5c7fc333ee2acae74ae4f0e3b2bab4baf533d1d9a8e19e84967c5ce46a3c5afdf3ffe2c2dc7aae3ff8aa4932c7f5b5aee4f3ba673347e720178e40171149938229fb0c3204fc4191b34b91706d9890d1bd78293280cf2b538135f928bc42405b9084ee3c6e3da694c1eb1d3489c928b344b290f20ee49fda331f7db0acee22ccab8fe4cd6599669f293b827de0ece933ccae9b06048d679c14668ccf91db1650306ab44c58af337e25cf22f64ad0ac5be175bf120b89b2adb4dc90fec6e2c3e0eeea5fef8d90b72d9cb7b25f95d5c487dd898ea40fd8bac888b8cea966c8aa230e479b0ce0aabb9de63eb980d77c165562625d713b16203dd97d2eab8cbf359712eeb89c55ae63f103b99dfb09b7ef47d9abce9f728967eb0106bf1bc319f47b7b6cc77c12e139e0fdec54a5c8ab5e6f5bcd596f5ccc48eeb40f7c9589fe7fa5b63aebfb24d525af254acd8d8af6d72f2a1581bae3f8a9d98fad9dc38cbf92bb6556ca0df8f75a65eef886d13f97c29f683ea74ff9db2f57c4eec9c22cfd82ee13ceada5c07bacfce99fa3c1ed856ee0718b196fd2ab193fd668db97ecef6f3717db331af977e2f55582fd723b6abf797d796cfdf8aebf3a9c45af6f3b3b6ec775f5cefffae76c53e6557b27f3c23574d7e835d2592df132bf1b47145de156ba9af37e67a25aed8fd290f84f6e0ffb7321a4b798c97e5542be3b092718703ff4aa94f7d2a1ce23da51ef09152a32ffa3ce19832439fbac767cef8acf5098b2fbea27184137cf5efa638c3377caffbf8fadc3f618e057ee01abd5bc70ddcf4a966aed08bfa6ce136eef85ebbb887fbf8130ffe5f8fcf0cf0108ff0d8f73cc13e9ee2199ee3452b637d8f4bbcf21daef1c677b9c508e35626f17b7af64fea671c6386392aecb6323dbfda0210b7014043890a0cd8f67ac0a1810aee60801318c23d3cc063eb0c5f60044f508575c0189e7de20526ed73865798c20cdee01d2f600e0b98c0c7a7ef62f4d558fefb7de91f96a1f1b4</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="1160">789c55d14b6fe2301007f03b9f222237b46a378418a2d51e4aa12db450e8936ab507c78f82cba33c135aed77df8c67129284837f337f7b1c715e7326a381533baf6c777c37138e98f28d5393fbc5e2f8e7efefef4ad5634efa0b7cc7abfea854cf1ce10c574b05eb79ba767dcfffe9dbd612d8e08d4683035d60c08330b09c01196792594e814d9fc9a60f34c8a687dc005b512b6c592e724640090c45188602380646927b4ddbbd2506b8f78ac8c306f08ba870af40462cb2dd37a008b2a306443a6a42e4c8d79c367c9311077590511d07bd1019724de438f789a8b8ed3e5bca88231f90a21e49e02391213f884a584640a9e0052aa062522906fc44aa3a767946ec8e2c95a06bdc23651d2fd927729c7b4d5422005e22d3932df739eda02e50a783f0923d22c3f090c8317ccc88b74a88f409ef19b5e50552d327b42d7516de21751dc377c4743730ce88dd554e0d3c103976b7396d571335f22c7ddcec49d7798da7ff3117ae740b3505bbdea73a2d9e725acfb4361f5ace0b3963b45e98d9725ecc4db55e7dae37e59cd1dbdd7e5dca697d8893e3d7bc34f7105fb42f3be5f3e2249976af4ae7c5a66dccf54d21179bc4f4bab3fe6d217707a574f6a0904b86bd6ebf7f3f1a9f6a0f8f4fcf2f9dd7c9f8ed549b9f9eeabf5f95ff44891e85</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="2478">789c6dd5d96eeb361006e0fb3c8591b90b8a39962cc9128a5e64df176771724ed10b8aa4b3da4e6c673de8bb979af9a9a4a7b5c2001fe6e7909465fbdb4ae7eae4b0b3f26d69be308b5bdbb13766d65971cfe3f1fb9f7ffdf1736939293acd5f18e9f26f4bcb8345c7768ea613df807b01d49557637a6a5d8a09cee0477119cd43b844fd05b6f06be3a4db7a1a9dc87abca76e2ef1059ca9e9415cb69e344ebb894dd55e9d66308babe04a3c864b35a7b085df1bf792d4f612f15cddebaae91ace50afc455b0cedf854bd4cf5bebfaeb8db3a46733ed3752675d35f7c526cbe08dd646bc0f97a8bfb5d6fa266cd5641ae769de45fd2c3a97379f7fc039bcd35af31f62d3d60d5ca19ec04e4db2df228de632bad0f9cfea22818f5bebfc1bb12972d45fe14aebbc0e3be4e5fcfd5e11fbdf47f77be227753f5193dc9f7eddcfd1ef21ba5f8bbb7085f92fadb57edab8ec9579a9f51371ddfa08aee0b5d63a7fab719595aecac40375955756f63713dbd261be575795d6791b76c84b3f9355e84f8770ec3f519bdc88499e6f13e6237fa036589f2fa335cf53d8185d4fce57877eda9f64ffb53389de1f5a83713fe81e36d84f017bec7f5f5da7e87f0b176a76d1b5ce1fc3a67692bf6a6cf376fd3d38ae7f091b78d85af3cfd1388f53d729f6770117f0366c707f0ea3757f740e7b9c479e6feb629ee6adb55ec31ef34fd536c5f9cee042cd196c6c2e9ec1de6a5e3eaf2eb7f1fec9f7b3f3ce38fd7eb7b087e5f3e60be77d21aed53e55933cdfdedb789e5db54bb1df5538be1f0bd8ebfec8aa7dea74bfdf5bebfa577081f50f60e3b52edfb7a3a2fd3dda513b9c9feed43ed5f3730e1bf48b753f52afaa47292cfb1d8d627f1ea9eb14bf67a41e45dfc2e1a53f9e83055318e6d7aba90c16312339c3355b0c17e435a5eba2cf35dff02dae3bbe0fff25f5d98747fcc0639ef0941f25f5c43349cdf53c92780e99177ee5377ee70f5ee5b5905ae70dcd48974ddee2ed30d6798777798ff7f920e40ef9087d9abd1cf3090ff834ece28ccff982877cc957fc3da43efbfc089dbb612461ad34647a61ed8c732ebe64fae1ac65189b5c11f390880cd564c97d66c8d348aeeb90d823e21eddd02dddd1fd97cc43488dc398d0941ee929e46634a7053d7f66c26a437aa1d7b046d3e385dee89d3e6895d6be6642aff5709a61486cd0266dd136edd02eedfd3bc386f6e9800e43fd888e438f5d3aa1c17f32a77446e7611f17e468489734a0ab5f333cffbf6bf9efdf97fe019b6f35ae</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="2013">789c6dd45953db301007f0f77c8a4cf68de92cb1632bf174fac07d26249c814e1f6449ce45127201a1d3ef5e49bb364d0ae2981ffa5bbb920cbb3be56ebb59ded92d2d9672395065d597f3f28e5e8dc7eb9fbf7efc2e550251b69f8d7a39ac7c2b553acbb22ab7a613e380330ba805b56a2df07e738e641445d21b9c63192731f9d55948a105b9ef5caf095daf794fc9f5807de4dc481b4983bc2a9c7a0f9c1355b51fde9a9c2489f23e714ea362fed85b179e93c306f7bf20e7fdc2982c83baaf07c08eb99f902d93c8fb9a6db8fe13391592ac72a7941f39abb8e8e7b970c3d793e450717f8fe4e2bc9be45873bf2b72d16f9fcdfdc2922dd98bc2749ef5dcbc9f2e390d693f30670bdedf215bd27ec0df87d2b588fbdb2b9cf8f9295904c2bf4c78c68ee97d80177212703f37ec98ebcfc8a9a4f384095985a9f6f92bb650b1f73b5b2a9ae7f595610f9d751c5523eaf78e5cccfbfbd7a69ef07952de4829e97c3ec85a6afa7b48d9865d73364272bfb824a721dfff393b7f1f22b20eb97ec2369af663721be17d403621d793b979bee56decfdf8f5e099ac0c9f5f8facb91f40769e37b9f93c05dbb01fc8b63ef9b230f5d3600bea0752b6e4fed68529bfcf3664c89c3351d40fc8263f9f3837d7afb20519468569fd0e3bafdf66e7e7d9cb9d916fc96ef8f5fcff972c2b9ebf67e7cf5f90b390f38a2d787f93dc59e67dca96ec8c9d913b4b1a08db837ebf959198f297b2d294daca18cc78f4b06fbffbd4466680431ce1338e7162e7a7f8e253b3cf8c4d8c708e0b3bdccf25ae6cea15df3632239b7ac7b5adf2817b36b58f077888479f193cc613dbcfa9ad7686e7e89e78c70bbcb4a9cfccc8f73cc4a65d658d2d9bb9c23676f0fa8bcc0ddeda4ec776dd3bbcc707ecfe9769e1a3ad33b6ab3cd9f92a06186ef433b0990c6bb65ad326229b8851607d6b5f2e73810d4c780d61af03363227202105856dd02e010632e841ffdf8c3b4518c010463ee1aeb407cf30deca004c600a2f3083397661014b18c36a3b83b3af46e5cff7d25fb0bce65f</data>
+ </image>
+ <image name="image4">
+ <data format="XPM.GZ" length="1310">789c5dd14b53e2401007f03b9f2205376a4bc96b92d4d61e001510414454d4dac364262320aff010d1daefbed3d39d00261ce6d7fd4fcf4c715eb686bd8e553e2fac377c33169618f1955596dbd96cfffaf7cf77a168334bff986bd9c55f85e29925acee629ec07aaad725d7762bae692d801ef73c8f039740df71432702b60db92b305c42fa916fc27320e34c32c3113070990c5ce00419d8c80f601887516838cb19039f8091174681e163460c778912799bd3843b8622b2b19be6345d498c22011c13257207e45e24b907ac0063c96d3cc603d1c7c9d7441e99f02531c1510219b3d87443a0f0b351cf441a15103992e534e1bb8cb85103193bb8914f64c82d91e3be2e31e1a6eb19ca98236da470620974880cf94e4c84e10a287d4d1f786398648c91f0021360c2649230e0069938d8e519b1fb62a847e1a98648e9e01506448ea7ea1169df2ba49e6cf895d36cd4022abd115ea1496418be27720c5f64c453d5897485b78cca706fa89483ec13751f58cb88dd754e05ac1239763f739aae222ae4997e4ad9a3d7798debff988b922c1dd512f8ea6da474f190534a8ed5e45dc9e9694ecd26f305d596e92a5d426dbdd97e9ce47672f7b9ffda4e8fe72955add52f2e7fe6e4eeaa7192d3a97ab3754db5767ad36957d36e7a9bf6ee8e72b57efdbed9ea0d1e8ee6f5eb8f4ffa1d3e1fe52035180c5f2a879aedb89edf6041253cd4a687a7f8ef77e13f3e1c3a3b</data>
+ </image>
+ <image name="image5">
+ <data format="XPM.GZ" length="2702">789c6dd6d952eb381006e07b9e2245df51537de245725ca7e6821dc296b0c3d45cc8b64c026401c23a35ef7e64f52f9f01a60ca13ed469b55a8ae0c74ae77270d059f9b1f4b4308b71d92947e6b1b3523d4f26ef7ffdfde73f4bcb91ee345f49b7132fffb1b43c5c74cacee16c6a1bf0dc8112379844deef8d5393a6a9f1a6c6caa85c79d36b631dc7ddb8ebc7dfbc8daeb48c3f36ce12a5949f8c2ec55a696fbe85ab2cf19e8ab3484c3bde45eb41e35e9229f8d8bb70f349fe13710ff1bc0be73df16bebc2c7dbc679dad63711670af5bf8b433eeac37926efdf80ab3cf53e12e7919817dea50af55d8bdb7c5d58215f24ce23a997185679e9f355702ea687c66e7bbaa9df2f3a15e70aebdd0c467d87621319f13aac609fdf94aa2bfb4d4371dbaf2bb8427ed81823f5ad352e52d5957e722e0efb4d637116497f79206eeb8bc526f4ef3918f56dc3b610fbf35354712fce7d7c2a0ee793cfc43ac2fc23715ea17f883711fa7f00a37f34870dea89608bf74fc5458cfa08d6e847198c7ab7605354de4fb015b36a5cbae388fa358cf3c307629d4bff0c89dbfa2f60d46f1836584fde5ae2d782d1ff425cc4585f0fd6387f3bb0c17a505f6165bdb4292ee352f9f80d58c37ebde5effd49c4ed7d70292e62e4cfe070bece83d1af6b7119a39f37c1321f295823be0f9b523c83ad98fcfd55a9a494fb8feec4aac27df722d6393ebff76213d6bf272e63f82358d6c38fc1a8af86433d27b0ad64fc595cc56246be4a63dcdf6f95552a91f32ff5d80cf5b1d46f7be13eb880c37d75262e713ef9050ef56cc1e80faf8bdbf917ade5efc7043670015bd8dfb7d6455bedbd2db631c64d30c68f602d26ff79b2368b707e3271bbbe5571dbdf040efb732eaec2f9da87c3793a0d967a08f95c07249fd4676dd88fe3d652ff3018f51fc2dacaf81e6c61fff9aa755b7f2ccec37d3b13db18fdefc206f9c7b0adc50fe2e6f1f6ebab6b172ff38dc4758cf11bd8d4b5770dd7e2e1421ea6af8ffcfe4b8ce102dfa55325515f622cd77cc323f73ae65bf7eaa3bee5a9f98eef79e27e4e79e6a3e65f621ef8919f78c1cffcc2af2eea8ddfff1bc31fee31bcca6bbcce1bbcc95bbccd3bbcfb29a6cf7bbccf072ecb211f390d78c8c72eaa8de1133772ca677cce177ce96abf7231d7dce528c470cc09a7ac5873c63dceb94fcc03223254480c9554b9c7524d3734a231ddd21dddd384a634a379c8430ff4484fb4a06737e78c5ee895dee89d3e6895d67ed743ebb4419bb445dbee75c745ec529ff6689f0e3eadaba2433ae22b1ad0908ee9844ee98ccee9e2730fe992aee89aba14514c85cb724e09a5dffa7c4d8a3465d47331b961f7cf207d8b99ffdfb3fcefcfa55fcb6370f5</data>
+ </image>
+ <image name="image6">
+ <data format="XPM.GZ" length="2782">789c6dd5d952ec361006e07b9e628abea3527dc69b6c572a17ecfb32ec90ca852c79180e3b33aca7f2ee91bb7f99840a06aa3ed46ab5dad2f06361707eb03b58f831379dd9d9b51bb8897d1e2cf897bbbb8f3ffffae3d7dc7c6206dd77560cd2f9dfe6e647b3811bec3ddcb71de82c8086c3244f6bf1ae3a1b1656bc03574626d3a9b81abaa4129fabfbf97beab42a34fe511df2a9977b6bfe6d3847fe2bd8191967e4cf5dd988b17ee1eb5ce2c76a93c05b9d9361e2b41eaed47985f93b30f2d17b7495891fd4455169fc36ece1ad685d8fcfd4fdfaafe2b0ff2c11bfa9fbfa4fd4a6ae9db8803d7cdc391d96b5d57c129fd669ecefbe3a1b66babf4fb529b0fe3d1ceb9b76ce9210aff5dca98b02fdfd50c7f5f81df656eaa115719d3bbc2f17adef8b5b755194d23f4ed5a6403f315e259a8f479df3c4c4fe3ec0b15e592fb7799eeb7a17b083973a176919fb97ab2bdfe87c12dba2d67ab9569789d6c3ab708df536d475dd78c93fe96c52e3f1bee4bc1a6bbcf68bbcba8efb5957dbc415e29f9dcb2cccd7f59ed465025fa8abd8ef1bd8c3729ecb26e627995f8578f46b536d5bac77206ec2b8e65feaadf1576a9be8fe3883e3fc52dda44ec78f6003cb79aef3c6788d97fdd7ae8efd3f5487f93a7e0f1bd8c0adce27a9d7e6753cef33759c4ff27eacb3898e531e8dfb50c01696fc4d6e5bf46f51ddb45a3fc1ce78fdbc93f3d0789be0fe1fc3f1bcbec016f7a9815bd433523706efdf45e3fc3daa5decd79bdaa7ade96ce53e84cb14d7cf60ac6f3d6c61d75be337a351dfadba49b53edbc006fddd87add667096e51ff9adaa7e8cf4734eab562df589cc7126e918fd52ec5fd79860d7c0d5b9c87388ef7c35a7fe80ffa75071b5d9f5fe0564d52af6f1dce2fb1ba9fdfc02df6f3a96e4d2b66f9ff1484fdb28d467ef97fd186fcd86faaf6a9ee978e608bfd0da351cf656f1ddf8063bd87bd75fc46ddc6fa93de5a1ff2755f122fe363d3af3753b7b8bfb41e8dfb3685711ec9c216fb2518fde5ebe8b18ecbe7d978dc8f0fd5e354c7791736e3b178028fd5a3993e4cdf1ffdfbb718cb0d7e5c90d7a8ffc4b43ce62b9ec873cd3fc36f89fa8ae11bbee53bbee7077e94a8277e96a8698ce119bff02bbff13b7ff0272f86d1a510b5cc2b318657798dd779238c6cf2166ff34ea86997f7789f0f3486477cc8477ccc277c1a22b6f88ccff9822f79c84988d2989433ceb96013f29421e2942baec3d6892c351a438e3cb5340ea35d4cc8445734a16bfa4937741bf3d01ddd4b1d13cee881cfe9919ee899a634a3975833bdd21bbdd3077dd2222dd132add02aadd13a6dd0e6d7de698bb66927acb14b7bb44f0734a2c3107144c75f3121ea844ee98ccee942222e694809a594fd3ba67b5f94534186ca307e149e942aaabfc758a6674be1f3baa1dbf0b9eda9b6edf7189efedf33fff7ef73ff00aa8c7a59</data>
+ </image>
+ <image name="image7">
+ <data format="XPM.GZ" length="2366">789c6dd5c95223471006e03b4fa1206f8423a7777587c307f6556cb3c08cc387eaea12abd000629df0bb3b3bf3af0e07b60a019ff2afaaec52233ead8cce8f27a3954f4b8f0bb7b8f2237fe91e462bddd36cf6f6e75f7ffc5a5a4eab51ff9534a36cf9b7a5e593c5c88f0ee777a107050125fae8cddfe002aed4b5b8d67c07d766de803d7cd43b4d129fdafcd29c1666f2eaba1f5affda3b4b529f59fed0dc0ff53a5c98e946dd881bad17700dcf7be7699ee4a9e65bb830f39abac9eb5cf3f4027bf8b97791e6beb0f9ce5c2430c18599757ee1c44e9dc3353ce95d66852ff5f079d55c26700697b0ae5fbab2296d7edabbcacaaeb2fa177395c2ef7009efa95dd55436ff19eeccf4d07b9c57588fde065bfe327a9c6b7d6a1ea7a8df45a3feaa6e639d6ea3adce677009df0f6ed50f70036b3f753eee6acb1f98e576312fd46d5dd696df851bd49f066b9df47c9aa28efbed9b9bb429d47a3f37be691aaf7eeced0a973aad93f6ebbc0bceea9bbddba2cd5a9bff19aecca4fdb49d4b6d3f7a824beb8fae6187fd7fc001fb7b735c8f93c19dfa1576663ae9edcb61bf0d38ee770c3bf868b0e57f465b3fc4e636b37ee810aed0df0eec70bd07703c1face7335faa67706526fd7bf0d2bfe569cfec335ccf3e1caff71676de7c030758cfb32bbbacb3f5b7d4c1c7fe56e1006f9abbd8df15ec3afd3ce4160e66d2fb215432dffa9b99e37cba80637f6338583f1ca243a5de36870cfbb968ab939e6f907e713eebe60ef71b6dc3381f5ac0f17e98c301d7d79803ce874f07dbfec77085feb66079e87afa7939edafcfaef7ca1c32bb5eba8bc6f95fc215f6fb0e3bac7f0ec7f3b8889e9a6bf574a89f98a719ea53581ef6cfcc06d3c761af7fc8386ef1f4a2ce521f3281a718177c29df3565f70a5ff30ddff26c582788efe4d9a7e676ff8bef653c0ce39117fc24af3ef30b32aff2fb23bff13baff21aaff3066f4a6e8bb779877787cc9eecb0cf073c91cc211f49e68d8ff9844f256599cffc45d6dd939e6565fecadf247326f573fece3f9049a49a72c6b9ac5270c99566c65c73438ccc26af1291a3960bf2d451e084a67441977445d73143247b1474439e8f2848e6956e69467734a79f96a17b5949067e2692b8a7077a94c4829eb0ce849e65bc4857677c26bbbcd21bbdd32aadd13a6d58e65fefc5a97471419bb2c6166d4b6287763f66688ff6e9802674286ffa111dd32e9dfc679df9ff8de5bf7f5ffa07d6011b20</data>
+ </image>
+ <image name="image8">
+ <data format="XPM.GZ" length="2814">789c6dd55953e3381007f0773e458a7ea3b67ae24bb66a6b1fb8ef23dcb0b50fb264738600098130b5df7d15f55f6686dac930533ffaaf6e5976c53f967a9747fbbda51f0be38999dcd99ebd35afbd25f7361ccefefee7af9f0b8b89eacdff66652f5dfc63617130e9d9dec1e8a99983ae3d28e96755d20f1ec016de17e7b65f05ef05575dfe128ef9cfce92bf12e7393c9c3bed170ef965b12ad0ff22586755aa838fc48513f3b6b82a643d6fc15ad6f3cbdc5992f5b324ac3f16e7fd54e63d89ab44f6c3a7700167b043bf9368cc9b066b1de76fc21ad7b331779ee416f39d5817d83feada61de4ab0c9f3dc84fc81b84c72595fcf5da4d1dc8735ea2be24a63bd15eb22937939ece037b189fba16053e842d64b7fa312e9c747e232913aa773abd418eca709364a2ba92fc34e4cebe22a41fd7eee3253aecc829fc56502ef06d7a52bebe0557155a0df211ceb85d834629a3fdc5465ddfa75b14d5578f8e936d8f7ab64de21ace1cfced2ef0d8efdc2f3a3739de83c38dc5f6dfd03608395b856a82762abd02f3c4f26d70ef907b1298ce4cfc47583fabbd82af8186ea43f85fec69a44eaa4a2a51f6dc205ea256c30efa2b3d46fe046ccadb84ee181d82af4afe6ae739f977e1fd1b5d4d7c4752a66e46b050fc5b11f4fc40ed76bc2f3593b93e0fe9ec3b87f34830dcec3c0383f3a15d70afbb7d1d8dfb8b30bf3c2f5dba29b57c098675ad8c04d67c9ef46633f8fe23ac5f53838decf03d8c87e4c0de3fce9355af6c7b04d6d113c8315bc031b18f31dee8709d76f5d1defb78663dd886d2af3680ae37c6835da8aefe038efa6b3ec770437c8cbf93997c2e1fbda15b1ce65b40bfde859ec527804c7f9e1fbdf357ebdccd7e298e77358617d031b17de7f5cc30dbc266e309fc3fbaf514d8aba896e54382f0ef6f3719eb9d8e179a733d8e0fcd268d92fedc0d83f3d889bb8ffebce32ff12f67f82c7e216fba1f0fe6a55d7ff43dcc4f3de8ec679bcc3f17c0836e8c77023e6bbe856eae1fbbc6dbbfa95b84da5ce7bb06adbe05bb8150f26f261fafe91df7fcb18aef163bd9ca47ecb34dcf20ddf86cf1ddffb7f43ea2bc30f7ef5230ff9894721f51cfe77fc1233fcca639ef01b4ff99d3f78e6ab9f3eb5cc2b31c3abbcc6ebbcc19bbcc5dbbcc3bbbee71eeff3011f4a868f78c0c73e31e5133ee5333ee70b3ff192aff8daa724d3e78453ce38e78215977e52e5d76b7ff1444632549325e77f1a6a43e2956ee896eee89e1ee8b1cb0ce98946f44c2f3ca3571ad384de684aeff441b3b867faa4655ae111adfa1e6bb44e1bb4495bb44d3bb4fb75edb447fb7440877444033aa6133af53d76e88ccebf323e7541977445d7d4a7242452ca28a7e2d78c3fa51552545245da27cefc27376ce85b868ca1a9a9fd1bc7d1a37f8bb486cccdf70cbffcdf67f1df3f17fe031c788805</data>
+ </image>
+ <image name="image9">
+ <data format="XPM.GZ" length="2862">789c65d4c96ee4361006e0bb9fa2e1ba19418d76890872f0bedbdddedd410ed4e66eef4bb7edf620ef1eaaeaa7e24c207b069ff9932c2ed28f95c1d5f070b0f263e96d6667d36a504deceb60a59e3f3c2cfefceb8f9f4bcb6136e87e9260102dffb6b43c9a0daac1d1d363d381460e1406611206e2545cb874d1d9d69da3200ab4dd56621305da4ed79de3302ab49d17ea3888436997feb1890be443efc888af3a2761ef2d7512a879ec9dc8789cc309ac79eb6ca5ff3b5ce8fcb6e99c4609d6672d5c845a4f0657da9fe1d4d7affd6d5245da9fd469a0e6144e51ff9b77ac9e786bbd740b1bd4efc733a9cc6fdbce5994a65a9f2dbd31df056cb45ecb62d71fed315cc3893a0bb19e356fecd7096c32b91cbc09d799b64b3d799ca5e83f867dfe15aef358fca1ce433812975988fd36b0c17eddc035f6a7f0d6fda06d753f5e05637efa80ebbc94fd90f10a571fd66fe15ae7e707b5efcf721f8bd2b753a2ce43d4b7a72e42ecc7339c6a3d54f596f9e9cebb10f3103685d6bfd15bf3725e26c9fd7e9ca90b83f516706d1271a336a1dacafd3255817af91cf6f76f556d501f4f61632ab1dc2ff7baf8fb1bc146fb73a036befe03b8b65a8fd46bab02e767a76a83fbc6a7deb8efefbd753f5f6177c1a57d5d6d53abf5cd3b976e7edcbf176f8cf7a8b64da9fb21ef57591bd4c333b50db11f9bde78df57e114f7ed0bb6babf740a3770d95beb1ba9cb089ec099d6c335dc94b558c6af526b71dff77bebfc536fdd0fdaf5c6f9bfc10dfa6f7823ffa4f6f5d08eb79e170de10cf7f913b6d8ef636fad9fe4bc2bb71eeccfbdba8ab09e1d38c3fb907ba3ddc0b6527fc20d2ce755bbf9701e27de584fd05be75ff7c6fb7f0837dace77ea2ac27d7a52d7519d8aa5febaf1ed3487338c3783adee0fefc10d7ca3ee1ec91f756eb2be7d4d5d47f0be37dee76dd8efe7b137f218af89747c6ebd9b4cf2f27e374d13e17bf3e88df55df7d6fe727f5ad71fe77de98dfe0b6f3d0fba8033b45bd8627e821b35bf78b7da2edfd7b6eddbafd46d84768633351ff66ec597b0859fe1563d9ae9c3f4eba37fd76f3e975c71cd0db77c83df89cb4c35a5f78eeff89e1ff8919ff819cf0bbfba7f25a5ef1acf78ceef6eacefa90ffe94d442bf2ffcc5ab2eb1e6c65aef531b2eb5c95bc86cf38e4becf21eefbbff0f903ae4233ee6213223d772e2463be5333ee70b377e97bae42bbe7629cd8c39e090238e39e19433ceb960e3964e64a9d48cdb9931555453432dddd084a6744b77744f0ff4484f3e23a9677aa1577aa319cdddf34e1ff4490bfafa37e35239add21aadd3861b67d3fd6ed136edd0eef78c8cb547fb7440877444c734a4119dd0e92f1972a9333aa70bba74892b97bda6f1ff32ad8c15b8ba428a28a68452cafe9b716bc95daa706318cb96acb5a57ebbbe8db390676cdd77dab6f6c64eecd4de2efffdfbd23faf5c83f3</data>
+ </image>
+ <image name="image10">
+ <data format="XPM.GZ" length="5374">789cb5975b53e34a0ec7dfe75350a3b7a92d9dd8b11dbb4eed0381e17e09b710d8da07b5ed90102081844bd8daef7ed492da5c86b3557b9b9ed4cc2fddfa4bad56abe1b71f2b83defeca8fdfbecd17b418972be5881e567e548fb7b7cbbffdfdaffff8f6bd1daff0dfa8e8acc4dffff2edfbd162a55c3998ded51ed031404bfe08af1a27ca70a79cb43231867be32423e19972daea38e1abc0795bf8c63855c696729616a5706e5c181f08e7ec30177b32ce95c9e6933c11ff34554ed354e2c348b953b94a78c373d46a9591eeef41d90f61324e946953b9d137fbacd2fde29e72a77089f0ae71a50cb70dabff33e53c323e354ecb54d62f958ba8503db5cffd10ffb97292c41a5f6c9c1b6bfc79567524bfb4aedca9ec3cb695833edd18a7c63f1bd6fccbfab81595aa8fa5b21fb2bea39c56ed48f854394b8d41996a523de522cee342e62f943b455b793f70a2f663e5bc325e2a179132d4ca145552bfb06a5c5bfe77945d6ce7f3e4b91db55b165faa1cfc414799f5b59e87c645a5e7532a37fe5e955d66e7590917ed5cf703997211eaf152996ab527892f617dabaf893291ae873de5322b459fe4be24e4e254e3ab8cb33a137db96f699c94e6ef5a39dc078a94833d9d1867ca28fb4f1b3dba532ec9eaf3dcb856c623cf59ecc8f623f16654c6763f32e3acd6f92dcf9d36df3fade75e60aba74be532b6fa5d33ce94311176653dd4f86e95ab58f383278187439997fde7de5eeb7f57b9223d4f927ac85d64f50c0fca79a4f1d3a1e722c90bf5ef4a63bb5f0e958b4819526597e5e28f0ae132b7fbe74099d7eb7c669c1a1f1917d62f73e5a007a7ca95d50fa6812d1f72fe944489ddaf44b9284cff2cb0e9af1957c67de53a36fd8bc0aa0f6de1b2d13f57ce43fc7de3e0af540efad455ae6ad27e73dcb0f607d30bfed0e66bb2f314ff2ea1d4f2313526cbf720b0f6331819d7b6fe39b0f53b9bafad3f90bc5fae6ae69db28b8db71b96785d98cfcc5fa15c87fb830d6bfdef1ad75aaf20ef499936ef49a11cf4e9ded8f471ab619d7f0eacf9c44763d279780a6cf3b1716df3725fca2acaad1faa7dc5fd5dced79172b37e1058f5a0ab5c5abc80816dfea2619d1f1b5bbcf0d8b0ce2781ad7fcb7eab342ab59fe25239d863bf61ad9f993119ef07b6febf6e6cf5462f816d5edebfaa0ef3b8086cf353e5caea05260d6bff991bdb7b000d5bffdc37b67e4af2bed459bbb4f7665339fcbc0107ca2eec6f4db9d15f04b67e6cf6411fd61bd6f87ac6a1fe40b9b6fe092eb0f5c757e561acf50b6781ed7e0e1a96fb0992bfba0ef1c2b572e3ef4539f8c3bbc0ea0fbbc699f14ec3da8f82bdbd3778635ceb7d03a9ef61d6b17e8487ca8d7ddb38d83f07b6f773686c7a386e58d78f94433e70621ceeb79cc7709824767ec7ca6965efed4360fbf9f948997fbcd3fe38372eac9f55c695f5979e7251d97d3b0c6cfdb456a6d4f27fa9ecc8ea25522e433db694ab90ef57e5667ff7c6b63fac03db7bb36a3cd4f33f5afc77e3ffa3818084ee3fd7c0122bac71c8e3df5079af81576c3f62fbf1bf5241a7e32b0dbcc6095bde88cae8cf34f016ef70ca63f6a61334380bba87118f7bfef8887e51c1075698f358f098e1a3ae68349ef0195f782c25d2252bbc7ed6c055ecb2fd9ac4b18e3ffdda370ddc60bf2fac62dfb24afdab0a677c938757d13866b8e55798c6367bf0513436ac32fa9859dec78e28ece21eeeb3fd3a7b5c060d3ce0f587ac30fca0b1fc9859d6e8b1c6111ee3099ee219f659e74dc3b187bb8f71c8ee6f58c3bee37df82876f11c07788197d8c208e30f1a77bca28bed4f1a635668f3f78effdfe6287aac91608a1976388e1c0be0e344173400786df7bd06902974c1fbe8c94e7228a1821a86d8822b18b1c6b8d1e8f12a1fcb12c8a2d8e06c78851d99e9c1b53f1398c00debdcf2e706ee60ca51ccde69f42c9631677895631889f5fb1836a5ba66ec7f06f7acf0e0e3f075661a9bec4763e94a5ed47ff75d0c3d98c302e71cc9233cc1330f1fc5f2bd865fc5eb5e2c1ef9185b0cb060fb092ce11556390f5dc9c512d654c35703ac9bca35fc840dd8842dfea6d7e461ae3b816dd8815dd8e37f7d0cefea432a6a9f57facf011c420f8ee0184e6022114875fb1870ca319cc219f4e19ce319701c8fef35e002e7e271032ea10511c4d086c4ab400a197420e71b3265ffa750101210115732956f1a12c95cf6bc49155cf26fe343bae2dc4d684463baa609aba438a31bb6bea53bfe774a33baff74f71defce677d8b1e684e0b7aa4277aa6175ad22bad5297d6a0837d5aa79fb0cd0a1bb4c91ae5470daf422f3865ef279cd113baa22dda668d1db6dfe5cf1eed93e376bdcebb98d2011dd22f7dcc723263ab2768730c3d3a8227e6255b1fb3c6099d7a0d5671fe17571e67bf6a888aafdd3ef5e99c06e4cf6f411774492d8a389e98dabe26f8db180694bcddad4f6f838381f4a7be7dbce205c7b0c36fb068f89a6085ecebbede64c559f5c8c7fbe55d7428a742ee29d796c38f3df28b778e730553f686d2ebbc5fe433e021d9283fbe2d5f6b041d07307524778263619cba2fecff5c23e87c1e5faffc9fbcfbfffcfddb1f4bcc6304</data>
+ </image>
+ <image name="image11">
+ <data format="XPM.GZ" length="2127">789c95d44d73da3818c0f17b3e0513df323b2d7ec59e9d3dd88eeb80430a69094977f6204b328a3010c020a0b3df7d253d625b3a21d9351cf80d7fc9aff2c7abd6e3a0dfbafa78b16e50f38c5b98a155eb8a6c66b3fd9f7ffdf1fde2d2755af21b382dfbf2b78bcb0f2ddcba5bcca9facde56fabad37455f336ce376a8d851b443dbb335b1a26bbb6d57cff34533723d3752bc33c440a4e8d99ee7e9b8d4449248d1320c819f157dc76ffb8ee227c5c0f149a0790b0c7ce0574d24a9c74e0d23605bb1e376fc8eab38d62c3b51a754740c09f09b62e88676a8e307cd328c42fdef8b21013e29465e48224ff11918d9c047431fb8d1c49258f1de30022e0c09f05a117911417a2c03221b3830f481074d2ca9c7760d113030a44057b1f4102df5d83eb0748013c30038d7249244b13144c09d21052e15b15f52ec2b6640ec0053c300586812493df6c61001678614b856243ea6448fad80c4010e0d03e048934aeae759182260624881b52295290d14732075805bc300186bca94eab13d4304a48614b852ac645ae9b17b60e5003dc300686b5692952231ac801fded94e1a0ba94ff9568309a1d5843d5ba575aee17c3a25b49ecdd9e2c542679a2563b25ad17addb00d7ebdd98a9daee85e5493037ead913b8b935457b110cd353e6d9075acb675c6d8a77c2b6ebaa70d26cc2a8f554f14b7795257fdbb5f9a7c79c0f858b1cfdb3a1119c33f379cecb76931305539cdf25a0c8bfb2f278d3c97b82e32a8beeee4aee441df9fcec3a6641ff7f24cce8ff1aece733112938731ffb9c998ba2a7274d52c9b91c885a8d78f4fdfc69cff38779eca485ee19548442dd49ee25df7c0364f6d75bea6b1e54c63a233f9e989753a9f34937e77f1324696b9cedcd617586572db564d3613d53a6bfaddcd8373bc17dc4ed24c656a1b0feb2adfe6c32acd26ee60f1effde2855727c5326bdcc1f3e3741cf7621a27a359b19b777fdc539f679ea8864dc01e0ed7ec76dcdbef7bb9a86eb2e6f4bef35def663960bbf5925dab8393d5a82a7e79e639efc8b2c94749c1f499ca1d0e5f5d179ca77652a76ca0aa557e66edc86a5feb074e5667d7d7712e59bdb106392fe45cf2b8de5ca766ae77d6b23eae77d7bbacfec33b81ffeff7c6b9e6efdf2ffe0193880354</data>
+ </image>
+ <image name="image12">
+ <data format="XPM.GZ" length="5054">789c9d975b5322491085dfe75718936f131bb974030dc4c63e78c70b2a828a6eec43d217c52b228ab2b1ff7dab2b4f96ca30bb1b634beb67569d3a95555dd9fefa6d6570d459f9f6eb97a7a94c47e94a7a2593956fd9f3dddddb1f7ffefed797afd578c57d478dc64afcf5972f5fbbd39574e5e0e13e2f81c90155fc57c972024e2b4d1fbf308e34de578e2b71cbc705dcac469e53705af571e929b732a9954c236589943902d725f5bc05ce95e94c79180fb5fd333819669eefc1b93281d3187c659cd67d7be324d538e69f0ae21570ae713e50ce62f02658326dff1a58f33955cee33cf1fc084ec07760c9b5fdb57211832fc149a1ed33b01485e721b85026d56b365bcdaa675d8f66c8e7213847fede9443fe26e01cf3bf51b6fc700ece75bec42547151b4fba8187befd39385396a9722b427cd57333aa45babf364aae45b54a4df7cf9a67a9d56ae2791ddc04ef969cc4f54c59f63c4b3dabfbcd2dfbca4904ee04d6f607e03ae2d78155bf5972a39ad431dea931da3f07f6711a805b60fffc348689f9b90bace31f1a273e4e37ca0df377648c785172b36a716a836dfc29d8c6ef1a27ca7ebce6b05187de1cdc024fc0f023c7c60ddd4f35e566a47af25072abd6347fb3c03ade35b80ede3386de11b805de0aecf7078d3da7a1ff061871ae8233c4778da1b71658f59e955b11d83f3f6e3b59fb2765b73f753f6f82cdef4360edbf6a8cf66f60f813ef47528b73076ccf8b8033c4e3c0da7fac2cf04371609dbfcfdfb066fde545d9da731158f5e660f3bb1358e36cdcd2f3610f2ccae2f7db3013d1f6543546fc129cb7fc79237ebdd2bae4186fdb58db937ffed2cce2f4aa3c8cc1eb8175bc477002bfc682f126e01cf5645f394df4bc235f8fb2baf5e71a18f3e163b0f9bf524e639c9f2d30f4f80c2cca42609cafe2fd67791a233faf81557f0b9c806f8dd5bf6460013f19eb792d2330ea9df8e72f4f42fb1b30f2411563f8df56ceac3e76c0899eff6471417ddc3446bd7b02e75aefe845398f95c5e73bcf33abd77570827ade34c6fa3402eb7c8660cbef6a60f593806dfe6bc6a85f7363d4abbe728efa4fa781b57f618cf93d04d67a7c0b4ec02fc6a8e75d30eab9f8f78f2209f3cbc0980f5d80e1577265f3c33db0d5dfc418f33906633da81558d7e3126ceb736b0cbf3b81753e27ca45acef1b043ff6fe417efd8ac2fc50648cf1cfc1b65f7ac688ef07d6f11a60f8e3b631fcf5950bbc3fd14e609dcf1b3881ff8131de97c66001cf02ebfbd3088cf7a7ee94a93bfdf9cb6b0a0f997e5ec76ba49c71cec5cfaac0c7255f398dd1ff51f9de317c5cf38dd7f80f95b23fdf2ed510bee37b68fc50c5f77fe0b1bb96fb78e449d058aae2fa3fb9c8d87f96fb98f2f3078d0515efe02528cc7ee0e395df3e697c5071fde7aedf7b64ccabbcc6ebfeb3f1c1c7266f2d6840c5296c73db91a9cc788777798ff77d663a652bf838e0433e5ad0e8fa391c738ffb9f7c9cf0a9d338e381fbbdc3e77c011f158e38fe4ea3ca35ae73c28d4f3e4eb8e9345ace9df3410c8d9488c4692e68d09052ca167d504e45e9832e3ffba02b1a2dd1b8a6d4f9e8b911677e4d663ea303ba29f341b7dec75df0714f420fdf698ce9113ec66165474e63f2231ff4f44961c62f34f13eca7c8c3f5c039a2ecd47e9e339f4f63b895e6846aff03178d7a0379a9b0f5a5df0b1e6f7a01fc98df5c64f34a575e4c3f5f47f2b3f63efc3e7831e16f2b1612dddbdefee9b34371fbe67f87cf0f1bce063cbb7edbbfbadbb37689bdaf4aaf970fd764a6dfc0cf9a0dd857cecb99eedb27779d13e759cc6017c9882aa1c061f47c107f1b9f3d1752bd5a063ead13127d4e76d3aa103cd07eda847a770ea94db211f7b960fff649dd3190ddc5af5b847e7d4a70baa50613e7cef5b8ab8ea721453d53d712defa3663ef07c9a4a9d126a50d369781f8e2f9d46cb65b24ab1b0cb448bcf847c3e6a968f704e781511194a4a4dc9d487e452b8d9bbf1e552ae4a0519c9c865abf431f9e8e35d45aeb9e3fe1fb8915bb92b7dc8bd3c7055c6f228137972794a5cbedace57998ff97b3ede5564ea549ee54566f25afa907b9acb9bcce5d1395b9535c99d46990ba7e2f6527bd1c7c28cd6e94436682a9b4e614b32d996b6ec8870e13c955fbb6e97169ff3b130a33d97dd82da4e615fae654f3a72e0fc95d7350df492433992ee328d0f5eeee4588e38929edb81238edc1e5af673a9065458bacee9b9f4fdb9fac34bcfe4a555ed822fe4a4bcff5bed447df9fbb72fff000126f975</data>
+ </image>
+ <image name="image13">
+ <data format="XPM.GZ" length="7166">789c9597c97223390e86eff5148ec6ad6282ad9494a9cc98988357c9bbe5dd9e9803c04c59de2d4b5ea48e79f7a1881f597659d5dd532a96eb1309f0270882f4efdf97ce0f7697befffe6d3ce1c9b55ff2437e5efa5ebedcdf4ffffd9f7ffdf1edb7567369feb7512c357ffbc7b7dffa9325bfb4f7f850cd81a601a811ffcc990791f3465bd95f807d238ffdab734e1ad64f7be05c596e95937612c7531a39b77ede570efdeaff189c2bd3f99c9b8d309f725739317d4fc63a5edec1b9cec78972b3ddd4fe5ee4a2093dfe1c8cf1fed458c77b9a732bb1f1323546ff23d8ec7bc698ef12ec31feace622f28972aba12c3bc6ad24f2307261f6bc32e776d26eb4633fef46e676bb15eddd1d386f73f4ff06f6ca12e39136dbb98ee775b0577fee46396da43139fc133855e659e4e05ff5f2b2b1eaf5ac1cc6eb7c2fe042995370897e37e7ac19f4eb7a1e9453ac9f37c06516e77743e52c51a60c9c2acb75e4b05ed83794d314f15a0397ba1ed957cea0d70d8c33e5125c80e12f2b95a53fe74e2bc3faa46d0c3d7b60d3bf6edc6945de54ee24ca7218593a589f1370d191a83fe653deaad7b7ad5cc76b0a4e914f57ca9d04eb3d025bbce279cea583f5731b0cbd7eaf66edef2be7a6f7019c623d649c47bd72072ec0bbe05299637fd14e1b385f27cae64f6635abfd3218f170185f24453bfa8b7a0b6fe743c858e773f7e0bcf0b1df2b9b3f790297ca14f586e365f5eccd58fd9131ea1397c65a8fdcad31477dee41b9532acb99729160fe55709aebfa3330e247317fd8db7c74a59ca21eba47e5e03faecf5d2be789b2c778f3c7b1de48d007ce9473cbef897261f1a99439d1f1fe1a9c6afc651bcc58df26b8d2f9c35514599ae098df526689e6abbb52ce4b2923eb7c659128fb2e18fafc8331f2e555992d9ecf6086bea672983f325d8033d1fdd900b3ce270773f6695d1f8ec1a54f234f953b893293728ef3cb23b0ed87572e0a1deffbca8cfcf6fbe00af1dd3186fe75656922df633efb32e4a39ebf5765ab077ea81cea899edf3765d3e76f9405fbe537957d13f17f02b38f4c315fcbb495ebfd4f8f607b0f54c67a9edd96729ae23ebb01177a1fb97de54e89fbe45cb98e5f014ef5bcf2a1725160bf5899b9d4782e2bfb0cf90e3d9e753cc5f74159d57a1f8df57e75babe2a2d908f89720efd7ca0cc8cfdbb55b6f928e64f9585e790d6b363e5dcf2a309b6fa766facf19547b0d5b767e522adb2d82fca5c613c2b4ba6fd1ef3fb4ce3e5efc0b6bfeb609c47bf6aacf1f16bca65133c0367aa9fe2fd50556dec3f5f2887fd8df1225d4fd529500f5bca79a97addb27281fbd74f95aba6f6fb777056c6f728471e645982f74da16cfee9a466cdc7357089f9b794f304f9770a467df72bca45a2e7878e95c3f9d3fd19280bf65b568c35df240557ca847e8ffae676944b8b77a91cd6a7f9e3c1acebf502ae743f19eb1b342b8d878e1fa429dec70f605bbf53ce12ec0f83f11ea0c458e3412d70a9f94f2fca9d14f7496a8cfdadc016ff6d63f5e70ec1883f9d1ae33dbe698cf7c68d31de3b6de5f0fc57fbd79ad53e37463dde03432f0d8d35bf5c0f6c7a07356bbcc818f15935567bba03973ade5d2a17d0e7f29a55dfadb1c64bce8d513fad1ffbc1ce18efa70e18f1a426b8447cdf8c717e0e8df13e7c3546fe8e8c35bfdc8532e33cb8dd9a55cf1918ef0f6a18e3fd7204ae10cf9d9a359ecfc6b0bfac59df2fc85f69c27e52b3daf78df15ecc8db59e39e4ab6438df669fe97de8b76bd6f3f66c8cfbbe673c18442ec18cf9c7c6f87db530c6fc2fc6b0177085fdba31467dd932c6f9c77e7b7b7f3cd5acf75bc718f5a63446bdd900633d7e5cb3fa3f32867dcb58eb89437c3deb7efb1763f5c7c39a554fdd8ffbe0d518f759afe698df7c6dac7a1df2d757f8fd323386fe49cdfa1eef1a63bd6bc6d00f2e9b88f7a631f4768db1fe8eb1da13ea6189fce02b63d4eb7363bc370f8c519f778d71df0e6a8efdb265acf9e156c08cf7eac818f5a066f54f66cfa8f76363f8437e9795faa36b63bcff4c2fee735aae59efdf7763dce73363c4a7b6d7f918f5dbee67191b0f743fea7e1d2f382f5586fe59cd7a5e909f15a3bf5bb3ae0ff5b7825e3a34d6f848c358c7fb7be581e919d5acfa8fc1d81fea1863fcb8661d0f7d03e8a3fd9a553fead1dc22da4f6a8efdfdc9fce3c8b113e75de92a3770576ee8aedd8dbb7577ee3efc7c08edf1f34fb5eb4f3ef810f7e4460bdaf32fbe5fec63ec260b3e2f0bbf1d072dafeecdbdbb8f3ea6c1f7a2d1b385df3e050fcb6ec5adbab50f3ed67fa16363e1b7aaa1ebd65cef838fcdff43c756d0b0ed76dcaeebb9bdbfa1e36b3cf6a38603d77787eee8938f637712e6dcf8d44e7fe2793b8b1acedd45f0b0173e971f7c34fe563c126868aa06d772ed4f3efe3a1e69d490b94ed4d073b92bc87df051fe553c88e61a8849dc2179b747255534a0ab4f3efe54070ddd325dd30ddd6a1ce88eeee981aee8f1838fc19fc5839e82f5889e69ecda3471bda0e1855ee98dde69fa49c7d77d41a3192d073f2bb4eada712f725a0b1ad66983ba9fcecb2f74502fb4cdf0bf53daa26dda891aaaa0613778d8fbe9cc0d16c583f6e980fae1e7211dd171f07142a7310ebb7446e75fceedf0ab0eda0fed22f899ffbca40625d4a4901161156d4abf9e7dca7ed6112d3b211679f052b06362e6f08b0d87cb8607345d503f7ed231f730ff86af421bf235dff02ddff13d3ff0233ff1e8173e7eeccb6958c1013ff39883377ee1577ee3779ef28c97798557798dd717f9e08d1f3a4c43a87913ee728f37798bb7798777798ff7f980fb7cf80b1f88071f85761cda09cdf894cff89c2ff8921b9cd0345837436b717ba18f54757cd2907187732ec409d15498fb22e2a5944a16c65475fcd0e026722543b9969bf0efaddcc9bd3cc8a33cc9489e652c93453ee4c58d3f6a905779937799cee79759987f59566455d6649d8e6443bad25be8e344f74236654bb66587e6f6bbb227fb72207d39942339961339953339970bb95caca3d6d0082d09f337a5256d4925938ee45278e7463c74a3b90e4f5f7d789ec7c34b683eb432b4ca0ffc951ffa6bdaf237d2f0b76eeceffc7d6c0ffe71818fa7a02268087746ac3b7e142c9e698bfbaeeb83423f896de45fe63afceb421d6f51c75c43b8fffc34b459b058f62b7e3558afd1be5f878e8dd0ba7e414c7925a8dd0c736eb959503ef6db61053b7ed7ef85b6ef0ff82cc4a01fda61d0d0f5470b751cfb9e3f89ed542efd59f89c060a4d7a72a92dd079fdff8bdac77ffff9ed7f861313dc</data>
+ </image>
+ <image name="image14">
+ <data format="XPM.GZ" length="4574">789c9d97595323371080dff9152efa8d4af57ac633634fa5f2600c2cb01ce63e5279d01cc636f8c0366048e5bfa7d5dd12c61c45c22cc767499f5a2da9edfdb156b96cef57d67eac4c6766d6cb2b79d74c2a6bc5c360f0fce75f7ffcbdb25a0b2bf42f88ea9570f5b795d5a35925af1c8c86a505a4fe15a8f2976573a31c29f7854d994596e196b9611fe699722e6c7ac25928fd4d47b80ccb84f9de725075fd61dd71c0f3e19d7010099b52b84c747c2edca12f1edfb01ca6611ea6dc5e58ae05615e0bd8d715ae5585cd403952e6f96a29318f8742b9218c1de55cd80c2d47412d8fc4df148eaac266ac1c697b9dd9101bf6e7ca0d619c2be7da7e61390ea33ce6cd42e5b8aa3c548e85e15a383705ef2754954be553e1221436bc7fb171e331f12cf19c2ba7caa572210c7bc2ce87c67212c64522be33e124103623e558188e857d7cbf1ccbfec2aeb0f343ddb1b69f2827da7ee558da91d79798244d24de48d8cfb729ecfd5b8e753cafaf5eab07f51af38b722c0c67c2ce67d0b1c6b721ece3d5f13e3ebe5ff58c7c19f3a972aabcab5c08c38eb0f7cd95d507cfca46fd7cbe1bb57ad190f847c28d401842e558b926ec7d6365e7cb9833ea2ff115caa9301c2817ca32df6b7c2d65f541d3b3e4ff5ed9e5efc9b39c2fae3f69d42852ae27f82c9c06ca27cab1304c84fd7c46d9f97b9ec5cfe72fcd697cce0ccaa9f258b910862361ef03cfb29e4098ea9df8793e13a58591784361d70e6dc71da96f9972a2ed43c7d28e9c1f931b63249e81b0f77595753c068e757c4dd9e87c1c7f16654956f0f844d9086355d8fb22c7321e7e2aeb7e62dbb1b6a7cc85f73d2a9779ccf31b617f9f51d8f9e0c6b1c67fa45c2a1f7a96f703ce5f1ee7a1f8615b3911c67bcfb2de3b65238cd7c23efe8eb29b8fdfeff2a270f52416f6f19e3bd6fe07ca3a1e1e3d73bc980a7774fff1ca33b71bdecf22a67a25ebd9574e8471a2ace711a7c2eefd16636517ffb1b09b0f0e3d4b3c5bca89f20373e9d68b3b8ed5bf2eece603edefd7b3a9ac3eb85436eae7f3634f93f6dff62ced1bcada1f787de5ab7f5fd9f56f29bbfea5b2fbbcc0f5a4f3ea6f28bb782e95b5ffd1ecff3c0868e4af8f1c9861bef0149f384aecf0ef9b65078fea527b46f3f4b08fb778675ffb349a019ab70eea3dc4118ef11e2738c519fd7cc0477cc2f9b2059fc9ffc27f35171d6c78a471ebd8c20ddca4678bbe7fe236eee0eea28522fc4511dce0dedb7ca8614ae3f7d5708087d8c6237a8ee955e32c784286535ae5199ee3c5abc31b2ea9778be3b8c26bac628021d630c2985eeb8a855631224342cf1ceb6f1c238ea1459606fd3cc614d01a00c090a78a3164ea78c13d9af10272ac43e11c58d01c3dce430b4a8e65133a70035d72f4c8d2a3580ea00fb7b2d3b486a18d018ad77c501473b8a3dc6dd0778bb3189363004330308231dcc3042398d2dc9a558aa129e763c1915114d6b0010f94cd6378a46c0614c113cce1195ea009403901587f7f46bc03c861f7e28af2d0818ecd264ca045860dd8842db200fc846db8fdc2d1a37361e7b759b0797031ecc02efc823dfaddc323d8ff2a0e38c0091ce2158fee421b8e348663388153729c516ecff1e9ab38e082e2bca435d8f360f7a2a9315cc13554c931267b0bcfbf88a3a09bf568b301760d938518ace19af231a1bd9dd25ce1670ece481fa7700836934f50234744793855c39c5618d309fff0fe2e38e690d0096d531c2d729c419d56609f393d0332b4a081d9570eb6ec424a67b4cde77b4cbbb963907eb76c0cd0a7b3f9491d59bafba7068ca1b3d4a6b340f7047a26a33cc494096bd8331f5a966b101458400a539af780eebcbd2353ec9bc2aed5d01b28d59e77968f6aa1b9c10b3ad5dba64b156cc8d5313337a667fae6966e6c7fd9b2900f5fa7b158acc96e37c97d47773521cb522c0b0e5fa73fca9b5a06d87c1fcbbbb5509db6b5e953cb1dddf9a558fcf978a61bc31160f333c3522cdea2677dbc58a7bf7e38960eedb5b7c867717a16ea3451f95f2cf279ff6d9d466386df88a549965b6b91ff63bdadd3df799cc58cf04ef3716e6330e3ef1a5e2d7061eeddbe2cd6e9ef5b6066ebdaea3fbfaffc0bcb04b0de</data>
+ </image>
+ <image name="image15">
+ <data format="XPM.GZ" length="5502">789c8d97d952e34a1286effb2988cebb8e893cb62cc9529c980b838166315ed899988bd46230e00530ebc4bcfb4955fe250ccd99e9ae96cde7aacafc7329c9fee3c7dad9a0b7f6e38f6f0f4b594ef2b5fc4aeed77e148fd3e9ebbffefdcfff7cfbde0ad6f47fd088d682effff8f67db85ccbd70ee6b3b2025e2850c3fd73fc52735231790e8df9ce71e2990ec089eda75ecd36ff00ceb17f5071b3b267eb9760ccd3b17135dcfa99e3da3ea7359bbd39d8ef6f1bfbfdb40f0e9bb69ec00958c039fc5dd56cf39715070dcfb4675c0dc7093834e6cc711ac01fed7a0e52c73be004dc00e7e056c5ad6690b79a8e7f1ab71ae01370083e739cfa79cec13ede028c7869db73cbf9e3b2e250ed215f31380fcd7ed3386c18f3d8b1b4902f8a8cc33014c721383116175f148479e49a4f8e8ca38631af3b9610f593d0b3f9932de3a8017b9be0c8f6d346cde61ff6a214dc0517e0fb8ae3208a908f1b706af1c8d233d677c0456cfede8ce326f8d5b1c4516ceb1fc129f8195c188bebd7762b2eda2d377f6bdc6e1acb1b3802bb7ab4b3187a6408f67a26c6ed26faf1ba66575f7906c31ea535678e9fc02938001760771e92566d6fe0d9e2e1237084fe9fd46cebb73d239e47700a6ed6ecfcc90d18fea5f09c98fea9b1b6b3f10c1c81dd794db2a469fd4d637004ee7b4e2cbe393835e6045c809dbf344c52ec3f041769e8e6dbc669d3982ec011e65dfed33c29707e6e8dd326fa3bf70c7f31384a7367af04fb7e24cf36cf21b83016771ef5f8f97cb68cbd7d3900439f3c8153e82fc0382ff2e019fe22cf62f1c1be348d89c111e65d7d25177f5e72b03f2fa79ec5ec076001df804bdc5fb63c63dedd1fb3504aeb273ef09c99ffbe711618d3263836169b2fd49ecd67c659007b0d708cf373e7392b1c2fc062cc3d70692c4e5f1e79fb121867b1e9975bcfd0730dc67e3ef49c478e9f8cf57161f18d3c637e0f1c1b67eef99617827e97045cdafeccfc69bce89f0cecfd5f18e731fced7bce2dfe11588c791b5ca25f763ddb7ce6ea5944b5bf0b700c3ef46cf9ca266041fe7a35dbfa1d30fa21bbf28c7cbe1ae7a87f760946beb371cd56af1918f5cc0acfc8ef39d8c7f7e819fd0e3d455cb8f5e29e3745e9ed672518f66402467db3bc665b9f191701f27b0d8e514ff10c7fbb6029dcf73b1a824b6376df17cab840fee8085c96b19b3f352e03f4f7c0b3cd67ee7c971a0ff24d605f8f73b0cfffbe71817e942be332809e2518f37c52b3d5833d97b67e0b8c7ea373cf987f0597c6e2eecfe3b8d673665cf87a8f3c43df2918f6a50b463d64cf58f5dbfa75b0cfff5dcde6ffd2b3e54f080c7ddcf13cb6fc6f1a8f7dbd1f3c235fc79e51af37cfd83f04c7c6e29ef7e371ad7703ecf5bed46c7a4fc0e81f597886fe2918fd22c735dbfab1b1ea33ee80a187bb60d44b4acf98dfa879ecea2be031e2bdf76cf3c3e5af83898533ceb9e092c75fad781f5fdbe04bbed26bc2d77cc3b73ce5cbff6f83673ce705df7db8267ccf0fbce4477ee2677ef9343fe7d9aa0dfde49e5ff9cd5d6fdcd1f70eafeb671bdce54ddee26dfea91617bcc3bbbcc7fbdcd371c07d1e7cb031e4111fe2eae9eb915a38e6133ee5333ee70b6e70d35909b8c521471c739b134e3fd878e31eb1ce4744fa3a21e173ca28a7824a1ad3255dd184aee98617744b533766a4d17fb271c801a91fbaa305dd5719a5075aea1ebd56073dea78a2677d7da697cf3a38560da15a58f088e6eae956d7bdd21b75685dc7860e7befeae7aa46635a7cce076daa963eb78855cb962a22daa69f3a763076698f89f6555f8f0e54cb9c3fe950efba9b0f747795b516b7a9af360634fcf5d2884655663ee978550db1cba7e69c0e35e76dcdda3655f5f965d0310f758df6c9a7587a5a37cda846d3d32bd0cc1cd289fafccac69ebe0e2b2dbfd4a5a7165a74aa7938d4389e346f3f2b1d9a3dbd74c7bd7edaa5bebe9f39db4ecbbb0d3aa74dbad041da3b81c6d3a70b8da6f1373a9a9ab7c1bb96957c04ae7f83aa369a933e05d4321dd4818611748414515c558cafa85ddbe868655d4e5d2433dd176834c9d73ab48a23ed80535d95beeb10d6de9a6b7c6d579baa4baa8cec381ddd6ab5e544ffee547f0be910c9247fb741e79a812dd5d2af7a4b7312d14c8abfd3a1df054b19cba55cc964c5c64077579d15aacf394e95d751e563dffcebb5affd3e956bb9915b99ca6cc5c61107eab73a8db3eaec6a8502997fa5031ac6ba7f217772ffc146bfca92de17aa0eadf2325dc947df74d0a994aae14196f2284ff22c2ff2ba6a43cf49755fa93a7c2a6faae159cfec271daaa0e3342c74accb8674576de85d2ea815cc38a1b94676ab2715f9a02eef6b0696eeba954dd9926df9a93676566abbab91a4f2e6bae2495fab7bc7a37650ad4315ac6ad8d3fd5dd997de071ba7dadd7a62b52a95955b8da6ab770b5f97912ad8540d07d0d097810c6524872bf9186a55a7ae2766aeae7d5a97233a361dd070ac0a4e5441a5e154359cc9b95c7cb0d1aa6aabd9d43cb85c6c48436da80e9783a65e816a684143f51b2c96b6242b396dc9911fbabb7aadce558f06d030550595867445433be3771b5f3de7c83dd7e868258a7567a1ab5918a98276461967f26ee3eb519d812ccb72f7eb699c5dca6b76954d745c67379248a2bfb17ec3c6ef8cff6de377c7f7fffef9ed2f80c853d6</data>
+ </image>
+ <image name="image16">
+ <data format="XPM.GZ" length="1947">789cc5d45b6fda301407f0773e4544ded0d4921b249af6405ba0a5e5da8b264d7b706c877b82038442b5ef3e1f1f9785d2292f936683949ffcf7c1b1432e2bc6f741d7a85c96d61bb29952834e486a54d876b9dcfff8f9edad54766c437ebcaa6195bf94ca1706357a49cce1da94d7665535e044d345f6157d491f986afac81b4d8a7c025ad52ab5d4dc29123a30d4749144d1870ebc05da558bda6af415091db8d674915da01338be1300ef811ef1028f001f8035bb66d56ce0005877ea5edd015e29869221f00ee83b75e6abd1a662e87bbe1a1d6906c8474d867c0106aecf0217b8410616926a7ac8992295a4c0966680bcd664c86720710346d4dc399258c885a687dc2b524935f7a049905b4d8e64c0d0253c547397c8d046b6356bc886229364c04c9320634d8eec00a91772ea013992da48a15943f61499a49a9b6812e44e93238740e651ced4dc08c96ce458b3865c297249f5785f14b4ff98318fedf38c494828378447d158f65cee98994ccd199d2f96314fa26835862e528cbd67d674335f6cb7592c44b293215909be279957ba3fc87745838bddeebd8eec3ccd65ccabeb837c9d641986c6ba523cc9676e9af32d447892afa316745cb319ce5a87761ceb1f5355ccd335cbd094dcdeed3b1d5da7737fbcf9fcfe440fe674d311aa8a0c74cff60742e35edb4cfb6a9b07ac75dcea93b348f96a37943de18dedfecf699c9e97897793c4cb51eec03e9e29ac6528da8f7f39535d298a92ac918f9c3f3fe970280e2791f3cc534ff07941a6cf45f65c90317b22a3451921962f4519b981a3e24cbb30b3e28d665126ea14d6b9f8f0e7fa3473defe59e6d7d7d26f4dc4ad2c</data>
+ </image>
+ <image name="image17">
+ <data format="XPM.GZ" length="3709">789ca596db5222491086ef7d0ac2bc333672a09b6ee8d8d80bd119150795f130cc6cec451f4505e58cb0b1efbe59995935c880ab3ba61df291957ffd9555d5e187bd52e7a255dafbb0339ec493bbb49476e351692f9bf6fb8b3ffffae3ef9d5ddf2bd16fe497bcdddf7676db93525a3a7b7acc0d201040997f0c436c388cc328e4c170e73866ce0cd7925a54f3b9de779c30df2867ca9ee1ba6f19f62dd7a5fe5ab85e51be540e94af9813cb30742cfa15e5481816ca99e69f0c47d520f32bcc5f846d1ea696a32af35238aa687ddbb2e607ca81307e624ec38a1f71be2b6cf3008e531e7fa11c299f2b67c230331c571ddf5a8e456f2e1c57348f96258f67ca81729939b50c8563a99f28c73abee558f27de55c39359c542de367cb89d49f0a279e72a41c2a7f67ce2c43cf71c6fcac1cebf8a663cee3a172ae5c379c068e3f5a4e03e603e1d413865c39541e336796f1c4b1f8b9578e35df702cf3ed2be7ca35c35960191e2c6752bf14ce3ce58572a8cce72bcba34a55eedb48d8e58f1dcbfdfda61c6bbeea58f243e55cf9abe13c8c8240eef7a3b0cdc393e53ce4f147c2b9a7dc510e95a53e8f22d1c350d8e59f1d8b7ea21c6b7eee58fcf1792bc22853bd409846487e66b990faa970e129f3fba928e28ad6c7ca41c0fdc4443809e57d86a972acefb35c38f5f4fd73a71cebfba0ab9cebfd2f1ccb7de809679ef2ad72a8fc6059efdbbdb2bd7f13615a51c13c568e9547ca85707bf26bf1ba06c2cb58cdbc4563bd7e55e7a5de668d9f67deacb55d637dcc666faf696cabdfe6f0bf7afa7f7dbc759736696ccebf25ac0655c69860ca4ff63e15d1208514732cf096a2a04fc97b54e47f15f26015ba147744d9b633f6b3ba6a24a4708f0fd823855c57b4fd818d1a29cd6d14cc2a62f2d0c7c7579ecd1a09b9e89117a3f0b47d159bc3f9e8b18b140744431cb918e304a738c3393ed3f7435ce012f7b181071487f8911e703ecc7e985dfd4434a28a391e511c534d034f687c134ff133b6f00ccff102dbf8052ff10aaff166c547977bf1951586a4d0a1793ba4f2cda91ce0778a169655a5821efaa6372bfb627bf18c55aa9e63406be860488ac75863f7758cc84d0b102f008c06c42b1aa9ebc5982a86ac3183445764bc981e1c9a15418a67a4423e40cfb3f3617b31a739ab5437e72e762886c44bac41ce5d89c84701b7d0c56bb87ba1916a2f66704fe38d86e987f150350af000396934a1077d590badc4b7e7c4f9905e74a87b4b78a4da108fe04914284c570f756fca74240630b42e567c985e1c91db06552c48c5542f60a41ec6ac401d85097774fac385d3b0bd68d27cfb3032c1f3d7a80f63faae4e1ab22705cc6825d73f5c380dd38b2a8d69e221d5347817ccd3e03ea8075698f3aefaebef31aa37bd58d05a239ef180ea4eccc327ab69154c37e19676f552cec59a06d0ac3486469e428f2a4c5d139ef9f329f46937cc9938a768d33ad6de734ea341634cc70b3acb2d8e32df8e339efb82fa38008001dd929bd55eac681cc0021674f2a6b0a49928cc5f5852ff2b145730a4d9f7a90b3e64eb0a2b3ede159bdfebbf12bbfffcbef32f7804b985</data>
+ </image>
+ <image name="image18">
+ <data format="XPM.GZ" length="6238">789c9597596f23cb0d85dfe75718c3b78ba0aed4da5a08f220dbb22deffba2200f644bf22e5b9b653bc87f0fbb7858e399892e90a929599f587dea90c5d6f2e71f6bd7c7076b7ffcf96d36e7f97db156dcf174ed8fc1e2f9f9e39ffffac7bfbf7daf656bfa3f6b54d7b2ef7ffbf63dbcae156b872fe3610972a14095f8af64ea38e7b5c89fcea3515c5f07d7b17edf19f149e4dce3d24b9cc7f5e7ce583f04e7888f9d11cfc005e2e28cf87dc9d58a5f2f357051357f77ce585f352e478c0f9d11af80eb16979bc8b9b2edffe48cf57d708ef899b3c5e919ecfb5f959c55aa85ad976be7ccfc7c3863fda5713962fcded9e23c00c34f68466e6775ac0f89db317e06ce8d69cf19d76f955cab7a3c1c828b5a35ae3f75467ebbc635f8a177b0fb7989dcf6ebc5d6b76b15e33006d78db970865e0fecfdb051725df56be6ef199c1bcb03b830a62367a9475e3aa37e2fc6f50ae23bced8ff0decf9c4f3af73bd5237bf67e0ba31b59d4d8fc5197adb60e4c30c869ff0587223533d8efc00ce8d6901f6fa9f1837dcef16b801bdd82f0dd56fc49b9f2e8c1b15e3700b6e203e77865e17dc865f020fa01fefafa6eed730bf2370db989fc103ec374c6cf9cc8c9b55ec3705bbffd8df4d6e569be66f046e80abceb87e130cbf21f653abd66c37cddf0d78604cc7ceb87e62dc723f15b0fb694596e6a015df1f8318b7aac6f40a763f7d709b8b588fe08c7a8ec1038bd38633fa3dde6fb9fab1faf101b8817cd8b9259109dc36a643f000fdbdee0c7f2fc639f2e5d89fb9fab37cf8128c7a9dcc9dedf3819f8cf3aaedc7f17e6bd773d423ac83dbb65ee2fb4dbbc8abe89789b3e9cb12dcc0fed5c4515f0ab0fb6b26b6f81378807a549c738b6f19b7ddefba33f2794b6cf52370a36df77307dc3696580fbd9de147dec1e80f0989cd4f6eecfa7c08f6f3db76b678d877b6fdc25562eba70f30fc845a628b7f8207f0ff9ed8faedc098ab32887c036e148de83fdeff5cd6cbeaf368cc55d3a33c71d40ba7607dcb89d7c7f727513f389f7563467ebceb0c7f3b6086fe7562f37beb6cfad4020f8d79692c19f68fef4f3260c6f9bf8187a8cfb533d6778c25c37e4d67e8f712dbf55be0a6b1c4f793a2c143e477652c19f6177013fbdd26b6fd1a60c6e7c70378682cf1fe2a06827a848e33eeef2bb0af1f1b1719f4eec14de370e28cf38efd38d0fd509fccb8688217ced06b248efdc3a760f7534f1ce3a1ed5c4496d8df8361817ce4c019e79b25b6fa5c3a43ff018c7cb99ed8fcdc190f32cb2f54c1eef7d6d9e27c92d8fc5e3a0f2c1ecf77d82cbc5f4689ad3e4367d47f6a3cf0fea924b6f5afce388fa3c4569f6730fa83379cb1fe3cb1e5d375463efb892d1ff8d78f1b8bcf135bfcd3789859be62fa43df4f3ec0380fd97446fc2cb1e9ed3863bf5a62cb6f1bece7d577463f72628b5f389b3f82de30837ff81bf2b019394b6cbf77e2e7dd48f383df4f67f859389b7ea883bd9eedc4e667e48cfe98258efb8529d8eb3b7786fe5b625bbf7436ff7c031e22feee8cfcf6125bbc613cca906ffcfe341a0dd11fb2e38c7c5a609c173d3ae37e39486cd79333eacf609c1ff97e7e7eaf892dff8533ea354d1cfdf2b9f108f5e7cdc416cf9d91ff4662cbffda7914e3827c467e3e93c4b6beef6c7a5424b6b8efdf84de0c8cf3e23d67f8e925b6ebd37abb3eec26b6ef9317e011e2ddc4317e320f1438888e42c740c7308cc26db80bf73a1ec26378d2f1ac631c5ec2ebaf236a5298846998857958e87cc358ea780f1f3a3f4327ac878db019ba616ba5c62c6c871d5dd1d3673e67cae5dc0d7b613f1ce8b3f2f9e10a0d09471adf0ec75f54665f544ec2695498a993b3bfd0e8459573a8ccc2053c74c365b88ad1f2f9f5ca5c6e54a31fd7554235a9ec46952cd4421d0ab3d008cd151aade8a31755f298d78f5ab49187a9ec5158a151c0877b398f0aa58f3d22e2a4300bef247fa1117d501177cfe31999c22029947349c3df5562cf8f4a1f7a7d3f65b41fcfe8846ef555f750ce2509ddd1fd0a8d1e14ec6455851e743e7ef130830fd5a0a7df7219ba0f2af4b1cca8a77d95c7f3d88c5d61b317dea28f677aa2f12f3e5e568e579ad0946634a705bdd192decb7ad0477cfcfc49a313c70badebdcf8f27743353655a34b5bb44d3bd4a35dda2b33518d7dfa749598cb880ee8908e92968f757571ac2eba74028d53d5f8a03375715e6a984af4714197e198aee89a6ea80fa5d24b4535aaaab19532395517c8248e4ef2714719d5a84e0d6a528b72ed8a3eb5a9c3415d549968aedfa4857a5cd01e0fd4c590c63f14a071afdf8e4754e35bbee37b7ee0477ee2671ef30b3c7d1de5b958269d9f6a7ac1af3ce1294fc39c673ce7055df39bea2c29e777fee04feee86347ffaec7feb8d38a767ee98f07de500d1b9baad5e5056ff136efa8a72d1dcb387b3a77a38ff15785a4f11afa3cd14eedf39efe5df23e1ff0211ff1b1baba55bae3139dfb7c1aebf9938269f099e6725eba2895745cf0255f6965ae79379419bea9b79b38fbbf2bc0c72357522e7ba1cb55ceb856feeee226b7a2bb4d9db9cef6ef0ad078528dd287ced095c01521619ed3838814fa9b666299ea3c90e12a0d19b982ee5c7a9a0a512decf0426ee5ceb3d47bf251eeffb7863c943e44ef737992e7783693f29386bbe15cc6eae405759ac8ab4c5669c854f45d58e65161024f0b59e829d7e54d96653ea5b2fa5895cb982b54c8bb7cc8a3d745e76698ca6754e9c83ab7cad75463958f0dd994ae6cea75e73f54e2b3bed6a4af55d992ed524576a4b7426357f6645f6b728c8921073a0ee5488ee5444ee54cce75af8b15b91ceaa7d7967e729c852605b9d47125d772237da9e86355472635fd95a7bf3356f9f8fdd5ff6f7cffcfdfbffd1765b20a0d</data>
+ </image>
+ <image name="image19">
+ <data format="XPM.GZ" length="3277">789c8d955b53e25810c7dffd149479b3b67a7227a9ad7d60c60b33a38c78c5d9da87e424082828c845666abffbfebb4fb302826a3cc61fe7f4bfaf099ff62aadd393cadea79da77136ee9a8ae964a3ca5e31e9f7e77ffff3d7ef9dddc0afe0378e2bfeee1f3bbbcd71c5541a0f8392811c80e3ca8f705539b4ecd8fd842fd9cf948df21766cf758d67ed7f5af642e533e1046ccf17ca8972c9ecbb7c09fbcaa172229cfac64f8573e6c0f34de009ef5b0e5ce5483954fe269c82adfd0173e8856168f76f85337026dc514e9407ca46998be7447e682229263d588e5ce527e54879229c81adfd77e542f99e39f6a322b6e71f2dc79ef29d7016a7b13dff8bb91a54bd6a205c538e94a7c2393817ee2917cacfcc49502d127bbe6e19edb0fc43384fa2c49e9f2ba7cae7cc69987a6928dc508e94dbc2066c842f9553e543e542f982390bd322b3f6c67216297f1636607b7ea45c2a1f31e76156e6f6fccc721e2bbbc205b8100e944be5636613e5a589845b968daf7caa1c2b7f152ec0d67ea89c297bcaa5f20d731199b2b0f65dcb85af7ca21c2bf7854bb07d3eaf954be52be612bb652ccf2759e64bf66361ec96f67c5339534e99db71db6fdbf3a1b0fcd897c3472e72c8d9bcf3be066c33f99b93611d2ad6b5ded3804d496dfcbda50e75a94777744ffd5595ed1a3676280c603da0077a84fd23ee431aade6b54d03a79ee0bba431ee13ac47f8679529cdb0f74cf31795373438fa89c4c0f73b5cbfa8866c783d239acf0b954d1af48532da87ef311dc0f2908eb0a650a8c3ba8e08ea50f88afbb76d1a88a003fb07c4f19d8ee904cbc0e7881a5098d30f2c43a7d82fb6e7028d89d4624e4de43e85e23e9d6175d09f7359175875c4b53117e97f0effb7f0d584cf09aaeae8c5f3d1a04be465e3ea2223675d03e77a52ff0962b842ddc6a88b7651542e607f210a06f5b84696e5068d1a62e00e720c03565889f152ac39863eb5a43eafe2c0b93399c363d46182ff9db53ab1c211146e709fbeccd98b063efb2933f08c5ed4b80e6b0a2eac5da81fa30eb54d738a333c033d2c839307ebcf15f667aad0220f916cd668c8fcf570ea92fc5751b042200aa788a34fe1a659a708dde02b40efd715d83a402f5ae8e8357a1663f51653b6a451a0170d4c8fbba8f7ff0a2df13fc4d545ad5ced4d8daa6bb9eccb0c72ff67b8274b5361fddf88420cebfbc5d4ade6824fced1353b83475069b00aae53cd7f883af611438a33c5729e2b1a1e2c17fd77e17591bfa719f4a50e295675b386cee84c6258aeffc2ff9543b0e72bc41c6f799f426324d6ee4afe0bffb1c4c70a57fc66de92cb107e3df5df7af1af197431c139bacf4a77f6497b1d87e3c0628e9af611c195fa6f4af431bc07c4cf125799e768eb77037f6fc0ff35ac03f19f2296b9c41f22c3a56e6faba93e55297c1fa26ab1f8bf80cfb168ccb67dc7ad6a884a13b540ddc56e8867b890ff67d0fda086a8cc256bd630788738f219bf533facc116aa756967755b0dded2588aa77cdbf23d8df77daf68fcfbe7ce7f0d107249</data>
+ </image>
+ <image name="image20">
+ <data format="XPM.GZ" length="1617">789c8592cd8eda301080ef3c45c4dc50b50b496883aa3e42ab1e2b553d0cc624c6eb21216177a1eabbd7bf210d31b538f863be8cc7e3795e243fbe7f4d16cfb3b6c34eb08455784a16bbb352979fbfbefc9ecdb334d1bfb44856f30fb3f953c2926f47e2660f7a0f4bbb0cbe194c37e97255187c3798add23cb5d1d663e1f0ec9139bc58dc84e8c1a38f563d6e0c760eb3a5433498afb2dce13660660b161e0b1755015d942c62c09347e67067709de6cbcc7efbe2d167963dda28b38801b9c7c2611330b7df5e0d7e4c73e6f0e870bd76b8b78801eb1ed160e971e3f0d5e0a72ce0d3c402bdc27eda01c02d223c7000d88eefcb6d055107c441b217869c471d50c4f89e315e46cf02c1253bd692498a3b8dce52d71c9be8bda0924ae7d1d5a8b8c38951cd45d39f34e134a890e3e1d6c1a97a4ed4944363e4d8d0f015ee1d201a45ef1c68094792cb387438e3750543a33bc0c84125fb3732c6b9d23784713dafe54de904e99723b8bbd74dd1fdc616793b7686d59a7eeb4c3cee80e448fae5f8a8e67f9c664b9c6a7ae0c09bd079de09c7fd193ad4888b22757de8208956f866c51c526d7b8dcf3cb8c314c4e7b9223f21fd5f13f36c7b3b5c13f32cc76374e79064583d76eca8fee7aca935fff379f617c93e5058</data>
+ </image>
+ <image name="image21">
+ <data format="XPM.GZ" length="3613">789ccd955b53db4a0cc7dff91419f68d39a3c6d7d873e63c242df40a855ea19d3eacbd6bec5cc1242da1d3ef5ead249b1c92703aa50f874d20bf68f597b4d29a477b9dd3e3c3cedea39dabb99e5779272f75ddd9338bc964f9f9cb3fdf777603bf83afa4d7f177ffdad93d9977f2ced16c6a1d8042505dfa21fee4d84bb2d84b1c2bb7590569900429d9878e432fec861ed9cf897598849aec81e3c80ff38882a94be6a82bbc108e8481584769c4fe5ec386f37bd7b08d697f2e6c64ff3173ee33ab91e3d88fbd98f4612a1c097799f35898f28f35da59af104e853f0a1be1d0712f884d2fa0788ab9e731c3857024fc9e38eb7996eb39138e7a19f997c2a9f085b0618623c749907809c79b1067499ab03d66365af8c4711a26260d69bf664e3d61439ca7519a134f8553e1cab10e53a3693fe4ccda635633e148ecaf99ad2f7c459ca39df46026ac9915d9b350db8cf747cc992f7c201c0b9f121b64437c23ac85b5b015a6faf228b379443c67ce7d6635148ec59e121b64f25785b016b6c256b8766ca2dc1af61736bef0ab86a5df563816fb3362dbe6f786b9cd6fcc8cfbd9df6fb8288897c25aec89b015a6f9b7e8cdf70516ccd617be168e850f5b66ff0f0d176cef3117cdfee7c4b63dbf4be6d6bf2fac85c7c256f82973d1eca7797624f15eb6ccf596cc85cf7695b5ccf6817093ef13e2a2bd8f8f999348eec75be6669ee11b73dbbf17c24dbfbe32b7f5ed33174d3f2a612d9c0917cc27f387ad3fa901aa59bfabf17bbeab1a0f53f8731adb6af9d5335a3dd3357f0d19adfc7e9ddbdeae46c44f062c14700e2554a463b6ebfc7b3e24f7218c608cde254c608a4a19b2fb3bdbacb33e63b8ef826257924146f94ce0126aacee6a5de5ae062acc61815e53f1770a157c856f98d5355a96aeaaffa8e506fa12ff1cbd07f8eee3e7c7f004bfddc70afbeb2a6b1a0718ab2fb5b81c4afcfd149ec1737881dfbc8457707857654de308ab6695b128bc8663388137f016f37807efe1c3dd5cd6343ec22976d5a99c61fd19697c822ee69281073e9df4182df5adca9a4600214418a7c6ee34b311438f72f0e594f7b14709a48dca7a5f947bdd288dbb16d8515451197a7bad82d398a075899ddea2014395c38532cae2ae84545673e05562264b55b0caa61953e73055a5aad4904e66d2cedaedaaf0bc4658efcd660d5219c1195633c3484b3cbf1233b9ab52c2428dd51077a9cdcf53aca850133545158bf1ae316ab932fb6e0df03b0bb59a6dd3a05cf04cf0d69fd2ecbb5e8f319b6aa59a31aa5b9ca7ad1a7cf75065869dd658f9124fd16533907c2aba3fb5babc4f839f04a8720073acbbc61ef5f17c07b72aea0aa3ccefd76874705a0aca6441cf9492b2a9955623ece096be6cd44949c14d97c5139aa142a9169b67ec5e9d84fa31c2b989d464db9dfb059d0dcffaffdbffec0769fcf87be7270982f4fa</data>
+ </image>
+ <image name="image22">
+ <data format="XPM.GZ" length="6366">789ced984973e3c81185effd2b189db70e470e011220100e1fb4ef1bb56bc2872c00242591d4be4ef8bf3b51f90ad39aa6a65bed091f1c664549fc9085572fb30a2552bf7c699dec6eb5befcf2e9ee5eeecf8b563192dbd697f2613279f9f59ffff8edd3e74ed6eaf45a71d46ec59ffff6e9f3de7dab686d5f4dab1af85881dafe55b3bb0277c1d79e33e5ccf3149c19f36ecd51bb5d44367e645cb79a6913dc35968ee7ac6efefe5570612cfd9ae376043d69376cf11563bd62f7371cdbf865cf79dc35a68d8673cf97e0cc985fc105e2173577a2b8e8449ed9b8d336e613cf7927ebd8fdb7e0027c537337eab6bb7ebcec83bb16775eaf2b81250a8cf17be0cc98a7e0a22bde8f1f9fc4dd0c7eaec045e21757ae8d93b68de70a9c589c1e3dab3efc16c61ab7f104ce8d25ae398d93d2d84d8cd308eceb954a1aa5367f064ec067e01c9cd7dceb047655c336df12b8048f8c7b1178c1b3eb25bd8ecf67059cf79ce76570692c0735679dc0fc68ec62d3e307700afd3bcf2ecb33afcf6bc622183f6fec629bdff97ae55d1d6ff30dc1a5319d19e749def58cb8201fba01231f4ec182fcbcffbcc8511fea05b6b8b8c079e1e387e012f11d6389a037d7b0f97b0527a84f02ae503f3f9f6e97b03e5bc6cdfcabc612d9fc3c0c2c96ef2e58ac9e14c6439fcac08817c62e463dfdf9219a8fc5c5f48aa0ef4a70622c3760c1fc8be00aeb7162aceb67f9ee832b5b1f3e6bd8e723be3eaef66f7e16c19558bc3276b131b5c121df4960d4e7c8588f1be303708a7cc4739987fd3b367629d63706073f93c0c8bf0cec8c8b864b7fff33b8427dd68d8b14f591c0960f6f81c5d8f9f3b348c2fe914330f68f1c83b19e726faceb69bc06c67c720e0ef93c07863fe815a8af0c02239f2770f03b0a5c249e3b60d483e1679082c760d487e16730005f04363d67f132e4eb8681915f178cf517362e309fdc0686bf49c396cf29b8029bdfb24c91ef088cfdc7997115f2cfc1582f5e0757c877ce7810839fc0d0e76b70d82ffef9289332acc73c18f3d3b57115f6ff7960dc5f8143bd7be0b01ea70ddbfc7be0e0b7dfb0c5178c0731eaf70c46fd9cdf1f65a5cf9bd5fbd1b88cf17c5c80f1bcc965c3e63f03877c93862dde0787fcf7029b5fba0b0c7f65e0d27fde22f35f35f5da098c7a5d81512f7a69d8e2c82fd48fa60d5b7dbae030ff867153afcd866d3ce60ff5e3c5c0a58dc7fc033176fe3ca9523dbfac7e2918e79324609c777204c67923a7c6cd7a6c376ce31fc0617de603e3f9990387f3edaa61ab0ffc34ebd30d8cfde40257a98f778c43fd45025bbd08fe2a3caf740b16f051c3363ffc87fa13356cf56d1b37f58f03a3de87e050ffa586edf3fa1d58c097e0017810d8f273966f15d6c78d03a3be27c64d7d37c078dee4c538d443a6e0705ee5e090ff5260f34f6be0709e8d0323bed5b0f98f8c433dc8356cf16d70a8c73218f5107fde0d74bdec7e7902c38f1018f3b35fef817fd5bc77ffd7b5ff861e13d35fa7a76ac28e8b9fd37c47af6ee5cff8fca31e573cf06a431e799fd5c734bfd1233ee70bedbf6b7ec8e75b3dbdf352b5c6e8a639f13ea77cf5537ad7aaf475ffdae70ddf7e444fd7f48eeff9811ff9497f5b7fe617ac8f789faffcfa01bd399ed7fea48af3bca04a8b3ac3122f6bff5db3e4155efdbe1e5fe95d73bca67d9d377893b7b46debb5257dbfa3ea0b6f7ceef2ee77f46e784fd5fabccf077ce895b6f5dd916a6fe8d5be46fb3ad3d73e8ff9f83d3d3ed1bb4ff98cdb1c71cc1df5167357db29279c728f33edb9f6be8e7853cfd97abac58884843be438a2fa555049150db45734d43ea273229d2daa470445ba98a5479734d671424e7526aa34a52b6dd774a34ad7da4abaa53bbad7f8d88f79d01153557b9c9d2fafeaa8277ad6bb6ee945db2bcdd13c2da8d2022deaf5312dd132add02aadf931f56c0bb44e1bb3f46893b6685bdb0eedaace1ef5b5edd3011deab523d53ad67e42a73ca433556d6b744f67eb53347b7d799762ea50575b42a9eaf42853dea69c8e85e949cb2ae2f4fb5ea9dfd006329491c6138a79e5bdfda2ab11c9b95cc8a5f6ba8d65a2196a93a9bebfa21355aa6424d77223b77247ab72f16deddeee3fd57c947b79904779529d27f5f62c2ff22a73322f0bb2284bb22c2bfa7355fba3accd7e46de9e0774a13eefd5d3ba2a6da8d2a66cc9b6ecc8aedcc99ef4b5efcb811ccad1acda7dabe73537d4e7b19ca8ceb61cc9a9f633551b4a5bd522cd37d62bc7d2f9513dffb4aca8cfae7e1f4f24959e64aa9349eed8911cd4ff46995dbbf7f5bce6aafa3c74ce15fa3bd26faffafdd59512bb811bbad1c7f5ea261d8adcb97a4cd5af3677e12eebf7efdff1fdbfe7badb6b9fe33a4b3751edc3d927d58fead5cd8dd4e7b0f6f967b5fb713daf39f53e87ee4fff2e7decf38bbbfef604fd4ff4bedffeaff73faef7afbf7ffa37f568f0ff</data>
+ </image>
+ <image name="image23">
+ <data format="XPM.GZ" length="3549">789c95955d53db381486eff9151974c7eca8fe4cecd9d90b680b4d29064ada023b7b614b3604484220a1a59dfdef7b74ce6bc78424bb5b35110fb21ebd3a52c29b9dcef9c95167e7cdd6e32c9f0d4dc75ce70f9d1d3b1f8d9efffceb8f5f5bdb61d0a1ff49d809b67fdbda3e9d754c279b8c4b075a11288fff3956537004ae1cfb9e6bcc253812d681e3d00fbdd067f6c091b0ba11ce73f1699f39a5f194390427e02ed8807b8e233f3491f823e1c81356b970e20792cf8263611d33e75114e5cc0938015f808db01a0937f3bf3a8e83c8c45c3c7d2e1c7bc2ca081779c079d515b814d6a7cc799cc6b2de17b0155677c24589fa9d38ee06b1edca7a67c2dd18fc8d392716df009c823f832df8d2712fecf9bd90f988b9e8c5bd82f93dd882df394ec2244ef879a5844d80bc63619b633f7cbe4991a409cf57f7c2b6c4f3939a91ffbbe3344a6c1a318f84531ffc81d9d4f751df0ba7716a9853702aac34d862fca7e39cae8797303f830deeeb4cb8b9bf07c2a9cd65fd7de1dc07ff00c7e047661378b81f137082f31e830df8ae669c6f25dc7c5e8e85c92ff93f8273f0145c82f97e155133ff165c7f9e1e84f3b290bc4fc245007e0bee823f315b62cbf51c3a367189f55451339e9f335b531a79fe56b8aafdbb8e6d6c4a1b3397c236005f83bb60febcda9258be8f0ec139380797e03dc7253d5d769987c26520acd85f75aba092f13eb80bce982be28ab900e76003ae844f67ab9a565aad1e596eeb1c64c875f1df3c1b1c8536fcfa57cf6a07a77006ab4bee377ad63a0cb74a5fe96b32994d795639e8e921efe286e7deeabbcd79d63824c508bdd1633d214bb9ba3eaf1da885b47bf64cf503bd3fea1959e6e459cab3d2e1663d359eefbca7a9fe41efcffa2759765f7a961d34b247e30f54c9b7d46acf3bfd9edef7f5018d7da0b6cb79fae279e980e123199ef4a1fed4b2187d444dee8cf3143a13cb4b07eee6319f8121c794fb137d0a4ba13feb33760c1686b60319f6a9b993b494c555f20bcffeda588cfe46868273ec2def8538e331e739a60a5e63deb9bee0d99718ad775170f5e75ad50ee243faada77decf998e75f34092ef9f7322eed90e6ccdb39f83316f098af43ee8d8ed816f3cf83d678803371a7dc38b89a5993c33dd7e5993d6a6290f3a8c7337a5e912171f7b671f4695cfc5eb39ed7e41ef0fc7a5c6ae1ee48e3e054c58b1c2ffb41e3729c35b570b5c65ed8d96ff6297d86deb5b316f71b83a11469cb91b265b1ce224741f7417656739fcf7497cedc2cee183b52de5ff6aa2efde64e3a76e32e45abb5ce853c4af36965ad3c190c354b352987522ae7b50f1677acf6b4f2f8f4caa81619d6f7b9e714aa5046597e7ede76b43c079ca78f5ad475724637bf541539ae3807b795df41afebe3fa4c5df32e866a48ef46d13713b96e5639161ed4c7ad2f396865754bb3afe875877eb4cef12a4f9f32f0b7961aab09bd0cb7b1ba773b5aef58ae0fef44a9a99a724d37d663431e398764712eebffbe6ca88fe24c8a0c1397e3ff381acf5283e3efdfb7fe0120af7f9a</data>
+ </image>
+ <image name="image24">
+ <data format="XPM.GZ" length="4574">789cddd6db52db481006e07b9ec295be4b6d752c5996a5dada0b20844338271cb7f662743006e313d880d9da77df56f73f0a4e2061b357bb210af531d3fff48c2c91776f1ba7fb3b8db7ef966ea76e7a9937f29ebb69bc2d6683c1fcf73f7efb73e94d2b6cc8df20ea34c237bf2cbd399836f2c6ee68585660125053ffa81d1cc1993a112795a9696e2566a7f38366d8c4f80446bdebd6b6f98577a0e3b402fbbc529d84898dbb0b38872fcd2d5f3f36473e3f839147981fb731deab1c36ebfa3bd8e75fd5b6f9d7e6a889f923d8afd7f746fdb0b6ad7f626e17989f9be3147958af13c0c7e604e36ea04ea304fd8c61dfdfc43bb4fa4d731cd87a7c08a770ec8df56ee002b6fe52df0f5fc2383fdef2c6f808f679fbe6b48dfe74bc15d4fdad9afd7adc31d7f507b0ef67684eb11e65b5ed7c77cdce615c3f5f2de907eb0570012f9b7d3daf9b5d80bc39ec60fdfc45553fe635735284a9d67f30d7f55bb03f9f356f5b9f5318f97ce46d7934306731f6a3cf43e43a7ebdb63909b09f433845fda9772b50bf37a701c63f7a63fc16c6f930e63b7f3e1b30fae36db8441e9ba55fdbff9e37f28e61bfdf7d6ff4dfae6df97abfdb61a788acbfaed9f7cf2db39ca77907461e1fd4b6f15d7316b6cc098c7e39f4c67e22d8d7efc1d82f3faa9def8f7be624889c3a82db663a37e7a19d379fc00ed6e72d0eebfac09c95e8b769f6f389e012f5e7b5adff07b5cbcab6e59d998b18e3d5cb9f3a2d57b6f59701a5e6bafec85c84387f07c7d8ef29ec607d7f76b20c79fcd93b36df9bf3d0faa147b3e499636fd4cf2a27ad7afe06ec2ccfb1b9aed7f74722eb755aea1d731ec209ec629bbf0e63be237381f3227d9ee5751a7732f5b577a2e6a9b98891a7fb4df3bc4c348ff5f97251ee30ff135ca691ce6f990b67667d5fbb3c0fe1391cc383dab9d6cfcc05e6d3198c7cd6f75526fd61febdb90c9d8debfb57b6eb7d0bc7f0436dad677dfe243eccdb6a7dbf166d6f0ae118e393da858eebf35194655cd8fc3e5c16f6ff0f3ddf32aeddf72e63f58ab91b625c7f5f95653d5e9abba199b6614950ebf977636f1ec3ae6bf5fafbb7db1577d5cb70d77c30fd775fffa50c2676fefa990ccea432e7824beef205f7d4d9eb3374ed4bbee2be245ccbd5d7a4010fab9e7e9ca1eb8d78cc13bee15b9ef28ceff85ebe3f884b9ef3e39714cbf87a9fbafe32aff0aa54ddf37b5ee30f72adcbb5215e95944dd9172d642cec517ad8d2848fb2f6b654eff02eeff1be5cbb7c203f9969cadcd7f83ef8d0f752f7f0893fcbba477ccc277cca67729d7393030eb9855e22aba9fb68735ce54a0f1d24249c121391a38c72deb28b0a2aa92b3933d96569bbf17dd005f5e852be5ff198fa744d034ef944ea8734a2f197cf074d2ad30dddd2946674f7551f13b97743eed33d3dc8fa737aa465993dfae6ac8856e4e7abf45e7ab9a9c6ea3ed6a4fa03add3867c0d346168eb3ff7b9d1944dda924f1d7de9833ed236ede8fabbb42709fb92907d5bbf907220f7ed691f87f4893e4b75957044c7550fdf7902aa7359a113e9e4691fa7d2c799d4cfe95cee45f3e51efcb948c6883617fa0828a4164592d2962baeeed17733aadd4caa137f725f62ea50223da44e02e9dcb17d5e5ece708e56163f1ff21fb59c2e9f5e72b70f5fea45120a57baee4206d97be1b9eb858c0b572e3e73ffec4b127aeed2f57e3e434ef38eeedcd5d7ef8f7fd443df5dbbfe6bde632f260cdcd00d169f80d767c8f9921bb971f57d71e475195a3fa9fe7dee19fc7186553e5ffd7367fabfcff8ebd7a5bf01ac66b48c</data>
+ </image>
+ <image name="image25">
+ <data format="XPM.GZ" length="1812">789cad924d6fe2301086effc8a88b9a1554b480254ab3dd0967e51567b5c69b507c74e4a20e1237c53ed7f5fcf0c4e61a97d5a0b053ff293d79e71ae1bdecf1f43af715d5baec42a939e1c89d26ba87551ec7ffdfef65eab072d4fff42dff3eb5f6af52b4f7adf67d304e7a0e7d0a481f88a18f84133207378c490718018fa6133247c2114a10c05e21362d40a65d442bc2714d14d44abcf889da0ad3a01e22363c7673c207683aedf25dc238a50f82244ec21ca284ef8907d46d99611e29250c976eb06716190cf7c67502ac4f11185df455c196479522145ed105524139625a36a35091f0813251475f2f68809a3404cf5e0332715d2bb23839c1c1be4123283dce76985d4c9ad41eeb3aa905653839d18f1cd20373637c88d5d5728110b8331adce0c729fe70615e1a642aab73498a6f48d59061cff1d0e08f83f4eec7440afe25d034d3f7540240090bea5fa9908b0e48cb2f1242ff2c9381b5972b4344df3d97c96a753b09f1916c5bc9c174b70d405abf5a6dcac570e07b67aaf8dde6b6bdd0b926cb7c8d7f9629725d6da85ae7aabb6fa293eaf1d4a80fd017a71cfda43286feff6877b70dc9756faa838eed4a438eebd4ab9b27e631f2927e3dc818743ff423977b4f2f874a19c395a797e19bcfeab9c3a9432185e28278e2de5c4b1a67c38f694ca71a418c79572749c29ecb853d871a7b0e34ed1ce9fafb5bf980e8315</data>
+ </image>
+ <image name="image26">
+ <data format="XPM.GZ" length="5630">789cad96594f633b12c7dffb53a0aeb7d6a86ece9a73349a07f69d242c09309a873a4b420849c8c27a35df7dcaaeb29b25ba4d5f0d6e68fd62fbef7f2d36fcf163edb27dbcf6e38f6f8b252d87e55a7943f3b51fd5c378fcf2effffcebcf6fdfa3788dff0579ba167effc7b7ef9de55ab976329dd4061018a061bf2c93722c0c4be1308e02cb57ca59945b0e859346b3304c5dcb99db8f7dcf999d3f55ce84e141d8ebed08478d58ce3bf44c960f94e3c4060337ca9930baf5a5f29167bb1f757fdc1026dd1f67a9f08b30c71359fd48380df2d8f29d709e9789e557cf956552ae8429331c341aa5c48b5d617ffe83b23b7f53d8e5138e85d3242f2dc7cab9f289703320e1b6701614e2178429103f5858ceccb0e70d85933c93785bc2cd5cf73f096789f2b36789f745380f84d1e6336c045a5f5c3a0e6c3f14a05c0ad3ad701a64d23f23e54418d685b380e4fc33e544e22d6cbec39c15a55faf859344f20989b0d3a347e54aea4977c24dcd2fa170a6f1d344b9d2fc9e3bd67c6c08e79a6fb2fd16055143ee0b6e082795f65347b81968fd326557dfd4b1c6db54ce8569acecfc9c0afbfce49e65be1026aaa45fb72d9b78ed7abc16a65ae669cf701c44a5debfb170eef4361d4bbcd81076fba1142ec2cabe2f706199f24afa834098fbd1ae2facbf248cca50ea371126ed27982a27b29e6cfed230d3fc90cd574aa9d61b9f9473e58572a51c0897ea8f2c3723370f73e16620f5a24439513e14ceb5ffa01226d2f86cbd9a05af97fe1d2ae7cabbca95f2967091ea7b315526655bcf2c72eb29742cf7153785f93a8bbf63e544e7757d49122f9e39ae53cba7cab530d9f72e2bdc7eb8f52c7e17cab93066ca95cecf8439bfb65e68ef5b1e677adff0593877ef292a6b3fd240d8e51323e1a2d6f7b52fecf4e15e3955ae3d4bbcbbc255aaf1ee7896799bffbcccddfdef29e7eab7e9d9ce63ae5ce97ad12f8b507f1f3484cb50dfdb3d61771ed9fc53ecf6e3a563e967bc1726bdcff8a0ecde83aeb0af67ac5c6b3f978e255e180857daef85cd37954e0fe79ec54f4f998469a65cebbc7d3f8ad8f348b808f53d182ba7caa970e9de179b9fa272f3547b967ebf5226dddff12cf96c29d7bafe55b8d4f78d48b80ab5dee7caae1f1265d27ad8df9765e2f4f0cab1d4134f844bad2f0e9453adf79e67f1b325ecf20d3d653d0f02e55afb6f5fb8a6bef87df1dcb77ad67f59b9f3e148d99d77a94c3affe859e65bcaeefec8793e1f64ff1eaa123f3f72acf7b72d5ce97da35859ef1b3d296b3c64ef5755fbf97dcf32bfadacf5c263cf327fadacfd0c97c2b5d6930acfb2ded6a74efdfe0d65771f2e1c6b3fcc849d1e4e94f57da07bcf529f75e17e28f5217b5f3858f79e4c3dcb79cfcaee7d1d7a16bd5b6597afcab1d65ffcd6ee3c7cf52cfd60fdf453b71fef1cabbfa5b0df5f29a73a6fdfcf7edff3c2b3d5c75259fb0f6be5be7067f97b03e1f367ab74109056adf5b35fd2c1024bacb0e6f5fdcf3bf8d3c117756e70c8e3d6abbdf16655465fd401ab23e3eead37ab32363a58ffa6ce102738556fe2e5deea80f8fce9ec173a13559aa9977b9cb38ef134c7c5671d394175965661aa0a3f558c9707fd7ec427feec9907fcd4e14f5ef015d7d5ef867a99aef022df8fd6cb266ee136d23b9d1ddcc53ddcb76a07788847decb31cf9eacf062545ad8c68e28f9b84ef18cd5f6789cb3da0576596bc3fa1b630f2f3f7859b0ca15abb4f927bcd3b9c60606ac1562843126985a6f47d8e41d19ffcc59c37b01b45eda9ffdf0174181d750420535f4318201ab5dc00d0ce196f399bfcb8b7869c38875e06ddd59e98e958cda18263065b57b98b1d221cc450916b0840758b0e6181e75981ea00f3a4ff00c2ff00aebb0c16393b5a6b005dbec680776596b097bb00f0770c81e5a9cfb011cc1e30a3fc770022d6843074ee1ccaa9dc30574a10797ac7505d7d0c00402aec121eb18ad16eb7cf063954288208604526842063937feb9f1c6e176f96f9702fad0e7bf5a2aaee5c80caae188eaf77e6ccd66d4a701ddd0906e690419ddd1d878a3897ae3bcd114eee99eebd8a319cd6c677df24373d659d092c7801eacdaa3f1c66a6fbd4de98975e6dc933d8e6ef4d18f7534312a7cbf6fe919a7acf6a26aefbcd12bf7bcf493e9515aa133639521adcb5d677f1b3c06b4f9d11b6db152132f39b2de2a3fbcf35914f876ceacca36ed988efbe06d976bb6c55dfdc0e3934e67497b46e1a70a1ed33e6becd0018c4cdf796f875c33f36a6cf1cd5ba57344c75c8336efdfa613de2f5e5ad4322a3c73426d126fdc7fa6b7d9d3a7fcd8d8fa48744a67bcabad2a07ecc6a80ce8dca860872ef88ecc8d8ebd252bfc785f5d56eb520fafe8d228bcf17245d7bc7b243796dd6faef6f3d91b9fd8712ae2851ab403b714705d421edd5fe9bcf5663cd015e72de2ff63fed93391b14a42a75fd37997b794fbc568f568dff881213529fb1d9d7779cb39fb7981460917c55fe4f92bdef84532359b17bfccf357bc1585d0dfd7793ffe6f3afffde7b7ff01db83b1d6</data>
+ </image>
+ <image name="image27">
+ <data format="XPM.GZ" length="827">789c6dd1cd6a84301007f0bb4f119c9b14775d2d084b1f614b8f85d243cc8731eb76a1dd1e4ae9bb77c6980f57070ff9f3cb243aee0af6fa7262c52efbbaf1db209830fc9315f2fb72f9797b7ffacdf2c381e15335acca1fb2bc64823d5f3f14ad01d7b09f8ae299625dd5fb7ada2929b6b557eb625bb5354543910bceb9a038cc51b9d853ec1aaeba86624751487f9476517021290a8af2d1eb48516b1fb98bfe5ee522d5f439eb0228b70578079b82203685407a01ac25ccf780c2820504d1ba870524626001f73d11ee7a128862b027852066301674027e3a48f60cba8f1065c096c15a144915a40484de38c07984194c2f4737d1763a30998e761d7e7e5e7c47b83dcc0de68e149ca8758713395abb82494659c6ff16e5ef98fd03965bb80f</data>
+ </image>
+ <image name="image28">
+ <data format="XPM.GZ" length="2269">789cadd4d76edb301406e07b3f8510de05c51f4bd644d18becd1ec9d14bda048da597696338bbe7b299e23c676560dc44a8c7ce6e11994e2a9c9e070732d989c6adcf665ff5405ea44de0493faaedb7dfaf5fbc79fc6441405f6276b05d1c4b7c6c4563f50c1fa65cf544069219aeee56c9c73cbdcf98c1db32fc8ad3871c920d92a91cefbe4bc90aab2d0e4222c63b7becb4e4aed3ccfd62a71f1ae7ed8f4f9cfd9395b78533d458e9b29ad37c96992972e1fd845e1ea8b92adc9d823d7fd629d6cfba5fe36d875bf07ec82fac5269bfbc71c591ae5e2459b5c469ad633b28a349d7fd7398f9b348f9064df2fcd97676141fd1d9365c8f572b6e1fc05d9e74fd9a9499db72b47febc84206709e5171db24ca87f44649572be7be722567cde6b645f3f21fbf8c5caad304952ba5f1d72a6791e4dce4349f763a5721c9686f7b7c8ba9e67d559faf962b236867c443611fbb072f212bfc0aefbfb59398dfc7a9f5d9fd7acb3f4fdb8fb99b74ac9f32eb3ebf967c84af2fec7caf6b8eafd616d5eef392bdfcf095bb22f2b4be5f7df92b5e4f9a62b97b19f7fcb597b3f91fd79dc54568989da54ffc1f965fdb9b24e8ce4f51d67e37dc736ec6befb6f35265937a9f92db11fbaa72dbbde8cbe8ffafaf8a8718335ea21c2b5e41c38c95bf8dceeb1a1fe43fc1a9ad71f65e3cce71e17fbb367f0f97b81aad3114dfc3b58da0eb06b7e8e3cefe3534c740fc3d1ef088273c631a3398c51ce6b1e0760cd418885fc41296b1829f58b5b16b58c706366d8d2d37877915bf8d1d9b77177bd8b791f3367e170738c4118ed1ac2b0cc45fd8f810115a88912045861c45152df0663fe7420889a690a2144a689b3b1bce3d1c2f0c4a7bd17b0925daa3b93fbebfa2339afbb3e76734f727cfcfabdc9fe41fef79966f7dfa75ff8fefc6fffddef807271766bc</data>
+ </image>
+ <image name="image29">
+ <data format="XPM.GZ" length="751">789c6dd0dd0a823014c0f17b9f62e89d84a62218d123145d06d1859ee3ac0b0bca2e227af776f6a1db7488eccf0fc6d9d2989d8e7b16a7c16ba8871b30b8d64f16e3bbef3fe7cbee1b8479cec4b76159b80ac284013b3cee2ded1bb18fd67251d626ab82b2a3ac0aa3a0b2ca38a7e494501a8d5442ae142939871c4aca56252d3983b7a2ba11ff05890088e62240d24c2410f9a241902723f862817b9a0dce040ed8826d6b8125c8b926099320bd952405a3a07a46411a8c68106440cb08bc33a06409a420e21c8ce00cf4698a1c301310b9304e8de8c174531f92f0b70dfee366b514</data>
+ </image>
+ <image name="image30">
+ <data format="XPM.GZ" length="2910">789c8dd6594fe3481000e0777e4544bda1554d7cdb1aed03e10a10eec030b3da8776b79d03128e041258ed7f9f72557504885d91c6e08faebeab87f9b6d1ba3e3d6a6d7c5b9bcdcd7c645b76681e5b1bee693279f9ebef3fff595b0fc3167d0541d40ad7ff585b3f9bb76cebf86e5a35c02e01dafc690cf7eab89d73fd8577c0f53855db40ea17e2a02d862776be6a1fa97375eaadfd056adfdf481cb443a9df53dba8603b7118c786bd54e7092f0e77c4519c48fda6382bca987dbdb263cb7af3bcb0e2ddc6417bd5dea8f354fca2b659c4de16c7b1baadb6b9f85c9cb4f392f7e7569d14329f637196e87cb6d47e7e736f9bb07fa89dfaa7384fd4969dd37c653f40ede79b8873a7ebed884de0a4fd893a719c1f30681cb6433d0fe8ab633d9f521c591def519c3963d9cfdebaff67623f5fb86417d41f9f2f6caa73f585da8a7126a6f1e43cf61b474168a3807d294e9d91f126623f3ef07aa322ca259f604fedf3eb409c05dafea1711c94a9ec07fe525755ca7e12db507dca3664893f6a9c84b49fb25eceaf344c9cec170cc569a0fba72e7c3edc884da5e7c1fb9b9a3491f503e74b1665899c2ff07e642559f28def13a54320f9080b75a2e6f3c94bb2c4a3ba50f37d2ae2dc49bec2545cf8fcbd15fbfd00be8f85a57a3e7f0075a13e533b35ef97890b3d2f78151bbfff95d8ef2ff07d30d624925f30561bf5b9bad2fceb895d584b7bbe6f656c2acd87137119aa7bea54cde75f3a329f07d46aa33e54576ace379b9446f3fb406c43f5913ad5fbfa2a76a9ce8fff7db18eeaa5bf6db5511b75a5f7376eec125be9fded8b5da8f976a74eb57e20aefc7ef0fd7595f3f99da98de69b53fbfcb3e2ca687bcecf8aae9b9e4fa5f6f9301357fe7e84ea547da83675cd1eab2b75c1ae9adfb073b551d76a8d07fe7b56a7b5ae0fef5696feaed8fc913f86ef0b021a7a4ab4e83ed67d1a6fb0c21a0738c4d197e201c77883b738c1e917fbbfc37b7cc0c72ff63fa3fee7f884cfb8f8bf785ce20bf55d5279c54dece0166ee30eeee21e763f8ddfa7160778883d3cc2638a3ec1533cc373bcf88ff82ef6a9c5255ee10fbcc69ff88ba2db1860f8593c461853e9f318579868df29669863e15bbc89ef02028081b219032cf79d82838a9efa633c0c60082318c30d6650e1126ea9efa079078705d43091163e9e7a1fc214ee68f44c5bdccb3ba919e3e16d3c453fc2b0993f8cb1cf7df66146adfa306f6648bf99d0184f6fe287549ea92c9afe286e092ff456c2825665e0151e640df2ff33d8840e972d6ab14dd1083bb0a4d11cf7b1cb757bd0c1aec4e31574b974a8ff98fa7ce607f81d294eeb7d3cbd5d3585e225f2f9ddcf0eafccd0c8beff825637a3f9eeebbcde972d38a0d51e426f154f2ba393edc33695970fcf11adf598ca98f6cecfc7500f07d4430d3daa7dff9cd0ee9cd2c99fc174157f4efbfc4a4ff3597e78a6b4570b2a2318493c65c305ed68f36c429f9ecb0f3ffbf436a0ef03daff7fbfaffd065501ab27</data>
+ </image>
+ <image name="image31">
+ <data format="XPM.GZ" length="2061">789c75d4dd4fdb301000f077fe8a887b43d3914f27d6b40718fb1e8cb2c180690f8e9dd0022dd0a65098f6bfcfb93b5763ed3055f5c397f3f96cb2bd159d1eee475bdb1bb3ce74231bd9a199465b6e3e1e3ffef8f9ead7c666a222ffabe328dd7cb1b139e8221b1ddc4c9a1e587a4052f911931f7aa7716c63f62776128bf7c8dabb227fef9d25a94d79fe889dc559423eed9d9b3ccf0d39ed5da49995f901d9e495b862177141c522887541cf83eb5d664a8c27bdabac28324d3e24d7de9c2feeadf3522b8ed764ab9dcec9af7bfbf22ad9dfc7a5797f3371e847c22e13a94fb1755165545fb3744df359ef3aafd39ad6835bb2334949f3508be5793c131bae0f5a76ad0cd77bdcdb16a5937e2cd8cb7c97e250cf83d888ef97e6faf260596fceae53712756da92a7e2c69091f66b5de972eef79760c5fd31ec2ae17998b16bc3cf03b26d5a3bf29d58b1f1436f57a822e5f37dcf2e251f5eb26de30a32d5ef1a9dc8fae76c975a9a07102b8977623f68def66e9435725e13b693f3c3b15859ae6f286e1a4596e79b544cfd6a9a52cb7dfacaf6fde4fc376c2bfd84113bac07466ca43fc360de0fde2ecdf574c1b2bfcfec26e5fd21add7aad2493d3b6c5d48bfdeb1437df8466cf8fc719fbdacef82dda4bc3e8cc5d25fb8161be9ef9538f46b11dcb277c9ad7f1d717df7e2427c2dd6f2ff78152cef2faea7d589b8655b25f77d220ef7ff2e58f6fb2d58cebb1637127fc076e17e3e8ac3793cb1433ff0ad38dc9782dd2ad9ef48ec7ff8e53ce810fe330cd67fc55874cf3ffeaf0db678f157cc104734c2f725455ce1f5b33c3cc7df631f31e923f0e6591e2b9f11defa883b8a98e26c6d9e0ee77e957b8ec08735f52cf0119f7007777dc46bdc1b746bf6f506dfe23b7c8f1ff0237eeae756f27cc67d3cc02f788803dcc3a37f62b89eaff80d8ff104bfe3299eadc4f47b3ac718134cbd323ff235790a54586285da1f0280817a350f5870d0400b1730f41123b85ccd0357700d638998c00ddcfe1be3f3dfc11466d0c11ceee10116b058c973b46e50ccef971b7f008068e53b</data>
+ </image>
+ <image name="image32">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c4b54c4e4bb44c067113a1dc3408570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e00eaba6126</data>
+ </image>
+ <image name="image33">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c24d4a4d4b03711321dc642308570f0de01653460270b1c4241844128383a1a30e8bdf8808975a6b2e0083ae60d7</data>
+ </image>
+ <image name="image34">
+ <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c43531b4304c32017193c1dc44183711ca354d4a019b8306708b292301b85862120c22c492136170e8a8c3e23722c2a5d69a0b00768563b9</data>
+ </image>
+ <image name="image35">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d3249354a35037113e15cb0623d34805b4c1909c0c512936010490c0e868e3a2c7e23225c6aadb90090db60e2</data>
+ </image>
+ <image name="image36">
+ <data format="XPM.GZ" length="424">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022130543251d2e253d856405bffcbc54105b19c856360003103709c44d334b343533027113c1dc3418570f0de01653460270b1c424184488c18512878e3a2c7e23225c6aadb9002a2160a0</data>
+ </image>
+ <image name="image37">
+ <data format="XPM.GZ" length="409">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022630543251d2e253d856405bffcbc54105b19c856360003103711c44d4bb3488170f5d0006e31652400174b8483a12d86c56f44844bad351700a36a5d2f</data>
+ </image>
+ <image name="image38">
+ <data format="XPM.GZ" length="439">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022530543251d2e253d856405bffcbc54105b19c856360003103709c44d4e314d314d04719341dc1453183711c63533029b8306708b292301b85862120c22c4921293132118bf3a98aa6402eae8611e16bf11112eb5d65c0046af6444</data>
+ </image>
+ <image name="image39">
+ <data format="XPM.GZ" length="29843">789cdd5c59532bc9727ebfbf62e2d6db0d4759486c0a871f9000b16a6107871f6aebd68ad006420eff7767e5526a01678633f78463ec39d1233ebabb2ab372cf2af1affff8eda17df9db3ffef56fb3b999f7dc6fae6ba6bffdc32f46a3f7fff8cf7fffafbffd7dab54fa2d5e3bfb7bbf95fffe2f7ffbbb5afce67e5325fc0f7127e1fd888d12bc85f7cd59c2785fcd196ff3fbed84e9fd37c1f4be5d244cefcf18efd3fba69a30def78782f9fdc0d8d1f381e7df62fafd1163a6c7f610ef0b7f669830d1d717cce3bb8489be16631ecf0c12a6f7b5605e9ffd84e9fd2663e1cf244cef2f05f3fcdb0913ff6dc165baef1933ff364f98c67b174ce3f94ec2783f5405d3788ab1ac5f384898c61b3116f94e19333f81e9df127a6e22de4af20b2dc67c3f1b264ce3ef09267ac33961a1275f0aa6fb6e9830be6f9b82891fd363ccf46665c1fcfe8c31d3afae18337d86e72ff3fc36632cfc5f224efc9a53c2f2bcb28ce579c358e6538cf9fd1ce55d4ee3e7d38491bfec4430ebd72e631e2f7f4f98f445de1779bc12ae087d82657d02631ecf8f1157d3f38eb13c7f9630c9afc458f4bbcd58ecb34b789bc773d71157b6d2f35dc642ef65c234fe1d61795ff984f1be3b622cf4a3fd5512bde69931df7765c63cbecf09cbf8a19c30decff704f3fabf32e6f1dd2861b2f70bc1f4bc9a3096f9a709137f2bc6b25eaf0993fc7722dede127e94662cebc5f765bcae12ccf6f4ce989f57d70913ffa782d9fff0fd1d5e0f5d4d98f87b63bcc3f4ee09a6f7f37bc6559607bd6fd27ad1fb6647ec799ff10ed9733662ccefab2c6192f7a1607e3f27bcbbc5f3a37fde29277e036199cf1e30f6bcbea782cb555cbf8cf0ee16cfd716cce35712a6fb5dc1e47ff20e635e8f6019f37c16e3cd8e81f9e9fe24619287174ce3e734be91f9f237c1952d1c6f9f31cf674e12a6e7bd608e1f55c6bc9e4ade97f5dc124ccf6715c64c5f2eef7b8e2f270913fd75c1fc7e89f01eaf9fb109d37a5c08e6e733c6423fca6777bd9e6dc6d50aca2b778c79fe702c98c71b0ba6e70de334ff5c303fdf4d189f0f43c63cbf1d244cef6bc12cff5bc6acbf614730afcfb1607ade117f69fd4dce98f9d1fb8485de702198f8c9968c7788de7c2298f4c31bc62cefac2f98f9b94d98e6db134cf4f961c234df81601a3f7b4f18ef2ba187f5c3761326fa5f04d3f8e128615aef1bc13cfe94f0bee87f2698e943fbdeab883cb25dc12ccf3bc6c28f62ccf4b99660a6e72161e2772e98f5e79e709aff2961bcef5782897e23f7859e8784697c23989f3f60cceb9d1f0aa6fb01f563cfcafafb6dc64cbf6f254cf4bc0ae6f177080bfda12298c7bb4a18dfb7e9fe36deef1ac6bcde612698f57f9c30d12fe331bdf68d31d36b1609e3f36e20989ecf69fd6c95e59f39c1f4bc9d0a66fa51defb15e1370c080bbfd94230f1176a82893fffc898e5114e1326795d0aa6e733799fed47e58299be9960b68f73c13cdf246183f3ed3366fa6d8b70e2b72698f97d67ccf4da15639e5f7505f3fdf384e93edae37e924fde66ccf23034bf95f7f323c64c9f1a274cf1d312364cafe908667a2f1226fde0f10dd39fef244cf2c17854dd16fecd2d635e3f37672cfa3f13ccf2eb278cefeb5dc12c3f4fd8707c725a30ebe33d63f6fffe52308def2a09937c468269fc709830cad79e3136f4bc7f164cf7f321e3c0f39704f37a087d81f97f276ccb1c6f9c60d6f7fd84e9fd9160961fcf6777395f3b4f98e2d55230e73f2f8c0dcf779530d9675b303d9fa13d549de89b7b662cfa3d14ccfabf12bc83fd89fc98b0e88bbf612cf65765cceb197a8c03fb970bc1f47c4eebe784ffbc9930e9c78e607adebe248cf475991f599ff02698d7e74130cdafaf0573fc7082697cd560cceb69b613a678772798c6d7270953feb910ccf35d09e6f57e651c389f7f4b98e2fd4a308f7f9030d52775c19caf3c244ce3f37c8ef54f3f274ce3d705733d749f30ad9f62ccfae72e1226fed37d7e7f8bb1e81bda9749f668278c45de33c1a44fea9db0c83fdb16ccf2384b98ec755730bdef6e18eff2fbc70993fe3505b37f3f4b18c7f34e308d674b8c59bece08667ff62098f5f35630fb9771c234fe9e601a3fbb62ccf2773b0993fec8f32c7f5f4a98e423f4b3fcfd56c2444f5b30dba716ccfc2f1246facc23e1a42f8b84495f4682591f6709d3fd8660d6f7cb8469fd83608e37bd84e9feb560a66f2761a44f337fa28f3a4f98e65782993e9730dd5f0ae6fcca274cf6f22298f547d683ed5f9f254ce3f505f37c938429df7812ccfe9ef5cfb1bcd543c2644f321ecbdb3d254cfe1ef305e3245ee5b4bec91fba2c61bcef8e19333f6a2f615aef86607e7f2998f4d3bc3066fd563dc11c0f647ed1e7d784f1beda66ccfc8584797db712a6f87c2f98fd432361b29f8160b64f4b58f4d5761226ff732398ebd32c61ba3f11ccf5f763c294ff9c08e6f5eb274cfad213ccf66e12267a4782995eb92ffa7b9430e94b5930eb532d61d28f84397ea6e739ff7a104cf4ea66c224bf95609677bacffef38e31ebbb6f244cf409bda2ef8384291ec978acefea2461f2474f82391ebc274cf4dd0a26faf47dc2a46f82255e9e264cfe725730dbcf79c244bfd0cbfe310f82395fbc4d98eeb37e7ad6275512ccf1fd5230d773682f36c5177bc598edc33412467eb20163f6dff65930ebd36dc264ef75c1345eb79b30dd5f09dec5fb9edf17fdcf54c2648f2782397eec264cf2ea08e6f8762398f3bb17c1acdfe384c9fed3f3444f5e66ccfaaf0e13267aee0473bf659630f5739e04733d3b17ccf9db96608e1fe93efbc303c6e2cf5f13267f2ef48b7e4f13a6fbef8239be5d244cf5a7d0c7fa1dd698e83b16ccf6374998e80b82d99fce12a6f85c612cfa5f4a98e8f38299fe9030e96f4d30d35f4e98fcef9e60ee47a4f7997ea157fcf373c2a47f39612ff9433761a22f13ccf9623d61f21fd782393f58635adf1663f67796f4c58bfe67645f5efcaf3b13ccf76f05933e661dc632deb160ae3f2e1226fff42c98f3cfba60b6479f30cdef18b33ed9ad84c97f58c1ec2f4709537c96f9589fcc55c2b41ee97df637a70993becc0573bd769d30c94bd6c7ec122e31967c749530d15b13ccfa651326f9f604737c3a4a98e2a5ac17eb973e4e98fc4b4b30fbffbb8469bd0f05133f7a3b61926f9a9fe4db652cfa686e12267a8d60e2a7334f98ee0f0573fe769f30e94b4330c7b39384291e5404b33f9f264cebcdf2f652dfd712a6f90f05b3bd5412a6fb2f82d99ecf13267dbd13ccfa722d98e6578f8c593fcd3461f2c7a80f6e47f427d413a678fc2898d6db6d3366f9da878449fe4a30eb6b59308fb72b98e5a713a67c8a9f17f9e4e782593e09b3ff784b98e6f782d9ff5613267bb914ccf5e869c234ff8160f61f178c253e2d05b3fe1f264cf3f705b3fe3f264cfe55e8e3f8a52b0993bc7605b33daf31dd3f662cf56a2361d297b9608ef7f709137d428fe463c22ffb97ec2861eab738c11caf9e194b3f0cfdab037bdcb3789ff427d9436e13267b7814ccfc2d12a6fbfb82399fb84998ecff4df07e05f12a619cdf8d194b7e769430f1130473be96254cfe4709a6f9c32261a2cf08dec3f9d50e63f6dfbe2f98f39366c254df3e08e67cbc2398f339a147fc6b4d30d71bb29e6c3f994e98d6678f7090f5c7fcc783fe54b771be13c6122f0e188bff6d0be6fb3dc1347e67ae95365afdd94f6db583ebe3e71f5df46ee1fa67e9405928ed7ff115be71c5e7329dc3f58be6a538f74faf495eb8d2eff19efd0399fe2299c4cf5f22975c77717d8b17fdfe57cbfb0fe5f22bd624c9c17cbe8af759566bbbe969f72be6ff85f6f2d10efc2719fde8795778e7af602f05dff423d9f0f5c9aefe72f6f2b58ffabcde24a7ee07fbfaabd94b5f7c167c0ef4103567146d017fb6681378c5dfc3e728cece9f83bf98bd78fdacc7405994857c0e81ab173d619b18e9295c16f08b9ec59f91ebc0cffe75ec650e147aa20ef1582fd00e2287affa0d7f475447bfb5846ba6df91a31573f557b2178fda1235ad8f964dbf5b688a316f5156a861537da06bc8c99235b10ef7fe42f6026b9feb43e022527d0417e76448bd458aa3dd2cf5b16e0017272897289331be77faab7cd92f91cb195074861445aacf81e20b7d099437754bb775475fc175ad6ff4adbed3f7fa017effa89f502ef1bdd2aff265bfc45e0ef51650a4c0aacbba02946eeb1dbdabf7f4beae2aad9432cac26594535e0595a95c75554ff5f5a302eb57c3ffd5f842b15be27731b64bcc78d52b35d24df5acc6ea454d80eaa99aa9395e73b5285cf17733b8fbaaded452bdab953ad00d156d287c98e3a37ffb437ff71d7b8119cee0eaab3aeb3ee5502375a88ed4b16ae8b13a51a7ea4c9dab0b7509d43691e6b96af1675b75e05ae0b5e6285e57ea5aefa91b75abeed4bd7e550fea513fc3d83355534fc0e10ae4562ad445aa985bfc097bc158adb6e29a0937aa0c9c54f49bda86cf1db5abf6d43ec8a20ad42fe2e04601f51da0ba782df013ffc1fdb631c855e447196b9cf17aa98ec08b7bf0f043f4790eb4568137fc4e4ef15d7b61b93037f4a689b1c10493e91d939baee9910c90933e5c03a0b49564137f46999861e484ff69919119996733362f6602f67612b980958a14c71c625594c73f692f59c15ee83a3353adcc4cf5cddc2ccc2bea0b528e6b2d72987f71a16ccc1bf1023f6933304bf38e1c4dcdca1c807c6aa68ede3ac6a9b15e9ac39ff1637f642f511672018e5ef4cd1c9963d33027e6143818004d4bf8ff80a98d9a56948bd88b7014b58c3511af33e06c89f239d7fbe6c25caa13981bb8019d1b9ae68f72ef3f175f926665e07dbbaa610ed5cab474d58c7045911aa4d014fcd69afab5fdacefb5d7b603ff22376ff07bb01ed3361d7365ae81c267a0b08f7941f69dbcfa3bf6122d5e64626ee0b3079cdc82ad47dd6a1993ac7d81728832e924bbd105fb50289f8e79877f4b944f1b3e91afe80d98fb99b933f7a0bd0f60370b73631ebfaa79fea4bd88ff10bbe9e9a67982e8172dd9b0050c80aa41b215f1559d0fffd6b6d4a64fe464c1b25cdbd9dc94c072b64c192c7ecb543ef512f24ff47d3fbe440f193395d8103c0299ec98dde493801bb3c736b0cfdaa290bbb9f82e8c3733f673c654c1d6d7fcb54d353d472b409efad26aabd4893598af2d50db8c7eb6f6c7b2f996bdc47812b3c037b4932765909325ea3c5a409449e4c13af0515a7eab66713f4f55cdb9b23603495e41049acb3f9bb3cdb431d6cca2ada1762a5ca19972b66bae54cd9a82dd56e8fa27f2b12164f4d1a744edba654e86512a6a617bacf7fb6c0fa825d6837f73b66f07766847f6d9383bb62f7662a776664183802b9253db2ec8ee31d6c471348ed3466e5fed1bc4af065775b1fe19488cf9e8dbbe6d2f6f7619eb42fb6e5760f1738aed29962f687dd15e227d55a0e1c0d66cdd1eda23d5b7c7fa123c78d936f4933dd14d7b6acfecb9bdb097203318cb3663c4e1f1d8bb01a618dab52ddb066e02674fb1a25bd73bf967b9fc91bdd80e8cf06e1eec95bd86f58c32d128931bd58c51055672001a833aa526f6d6ded97bfb601fed932dd92d3d809588d570aca2e33553076662cb20af0ae46f57e4b3ed768c50c90344ad6bc26833bb6377a152686005176ba09e697eec45ff94bdf46dc7eee93bbb0ff16491627b8c85e281810a1bccaead3a302e072aa567c0c5c839b45acaa74bd87f39433c35f5b8f7e23297c7681b478371dbe8db0c47da05f00252765dd7737dac4797984fbf147cd746ffed5bf1e518ae5337c0595be497a29d80c5a0bdb8f8e9ddc83d9b2d3746db2a77e6f182f92d56cf79877a357d8c5331b70b901797dd8b9b980b37759805915cc0d371fe005cc5ace1cacdf593f16e01356903abeb2ffa703fb097cd1c14f876af6a07328b57f495cd64250bb6912672f2e6966e629fdcbb5bb95777a017ae86ba1d2d7691728758dfc74a3ac378fea6eaeac9d5819b43b49d39d91d65d0e81b07d127ba23776c827d02d94cb1dafe585be59fed052fca4907ae112900dfd5554776cb9db853cc1cd7590aac5ab49b2813c872c7ee4cada02aae6de8b2d41d31cf7e71e7c0495f1fba8b582d74e6dc7d1dbb4bdd724dd78adc403ef0c6b169ce1eba1f57d0b55d076402560f2b34d8183ffbc25e48ef38c6e3dd579cf90a226459edb9eb98cf7324a30c5efc58d55877e36ecd117623dee0bd8f3ee6ccdde967cc4ecbf0cc509db87bf7e01ef581aabb277d04b2ba7025b785d1a7bd91b771bee0caaee2b6dd8e2ea923e0268f578c7b1bb5e857727188bd5ea88adbd5af6ecf646adff4303a76300eb6b04e210fdc74fb760c9c78b04abfa9c3c9de200b710d900bf83057f5206ed3f646df821c4fc8c3aa7b0f6aea3d6b5a9bb457f23ad0b2990f608b607b3ea3de5b87faa492276edacb5aef025aeb336a18640db0de3b18555abc662d8e0151ab673ef75ddf03ff52e70e519f57a2d8e387ec4395e0f707beef077e88bd802babfd086afd13bb7417f05e43dff967378d7196e34c7b2d1735f763ff02d9660f344ce2cb3a4ffc1db9c013938487e6d84f50fa4da9df392f063df6533ff37358df55aa9e7cd2df756e7be85e4193966ad72ffc2b4694e845a6aee5827ff34b5d72bb90679d806cdefd1457adc3768317ea42d5affc01649b63552eeedf44b9fcc05e88df3af61f33904d80ecee14229ad48c4dae57fa717cd0887db305fec5c56e9faf816dbd727f387ce8e7bf826d1cf891afc78a276629fe10d6fac81feb5b57879528b92bdf5027209b13cc6ea4ba61d9448fe34ffd19707e8ef998655bd9e8d77c940bfb9709f5854d13f4fb227a7fcc24e75c9f28b31f7931affed237cdb636c005d59b23fd92e2720eb50e45c6d83bab0025ad281353f56de0a50399c24c197f053eac0eb1e63056c4fedaee9a76e406653f4831277ab64b7f033a728bd64fdc50cdeb243fdb882f622f0ed7d5c37a9d832dbce0c8ed752f85bb0e557beb3cc4f6956f604c37dc4399f258dd5883f298effad6df819d0027a9b6a1dc7e6ae72e40563142d9defb07ffc8fd03a973da52d7f82758d9d2860ffb54bf7c8aa3312f2e21ef977a5b4d20eb52d25b91ac3c5aa3bdf35bbebcaefbc4b760ad7ea84fa35c40239cafd87bbfed487724cfe7aa2b6aaa6bf91df708f22de981dff57b7e1fad7391e2ff007380a6affa3964463946e1a055512e057b091b31c66126187fbe801b2e6af83a8fe5359d412e7cef2c5862a9e0b3689c852e05652a643fae1e8c9da3c553ef6c99aa32c31cd9000c419e05eb1d3cf8dec39855723f4dfa376dac019ec1abaf308f18fd582ea2e3bcb3e0c8a785a077d183ae65d247192da0eeabd98790f9f2177b90877acbd7a01e044e7cc5f5428e9ccc627c92da8433c9183f66304d37f440cfe26a3eea76e89b73f4cc1df661b40a0bf0e331b7a04c757d6ee0a3bd84a4e3f1e703d032d2c9637f8cda2bebd3e18a2b6a58dd3e42195b46fddddc833c851afd0cbb8191b2017af45449732e2cb971ccbccec3308cf405c68a51780e63ee8bac738b057569428c3163caefc4be538f48e422e753686d638d109fec418eb50fa3b652cf8be4328451277a1bbc31ed3d9a8d78425e00bc7098061366a45da92ed1940b23477b71cdc3dccef415acf701ea3d546d618175d23c45ca98ff6f475e202ff36e8fad5f7a441fe3cb5a2e39dacb0be87a093e5be175a3574f7281bcd8ceed517883fa44711cdedccf1f836c1ffdc28cc3123dec80b3d175b545963d37a776eeb53d095ef720cbf11055213a9bf107b974280a8477d73333dab94d57f6237b81cb617d1df7ba7abaadf4bac38af1b81f75ccfab0723df0290bac4fec5a67d1de867ae62b5e8759e4241c707fc3b09691ce609e654e43cd8fa07a56dc438eb1c84162f68e3195ab3ceaf1c0ff67a614eacec48811630ccfd7ffa27e09453f06eb9341b6d8a14e45ea41b25c54351c421d5f7335c85dc71fe26fd08df0ec17e1287a0de0a4cd9e68b3df1ffd5208c7c1f85db0ab4cd79578916908a1116351eaf32c521c9886713841b9acfdd85775a59358cabe7ba17bfe017b7a32a678e4a639370d7d09757ccea3f555053251dab15310d146fe15fbb3b1765b778a86a9ebba1773df706a5ec0e6e2dc75d0fb098da3a3afba35e73c6f3365ffe8bddd5938431dea21adf9a7fa45e4314bb2211fb1d43736dbd45bf69271bfe408a4db851c179e85c88ff527d62eeff63ec59301fb2bb5ee63c63e85ea84f370112eed43ecb2625d13b97953714cd050b385bc248fac648fc086a61a614536533193e9fea0de77c22b67edf1dcc4b5a21d1fb254910bf062c7e01da98e8f7afe0c7229412ebc7255c856b6a91f917afd1d96499b7b9da0fba115daa1e326fe16e49f61a536d1e37015edc61c85eb823ecc1327605fa61123c1a65c36ec45f230914bdcddae47bdb7cf6c2f8b0db9c0fae81db0d867d0a8d88d9840dd7e1477e68c0fcd70e3e28ee4ccbc53fe51f45da9d3ba845a7166e7e1d66f853b7711eedd8599c258b01aaa063eed06e542762a1ddab83abb7ac7513c99712efe45fd22b954e495bb9c2eea2d56611bd68f9f5776a29fa2af93ba3ddc4156bfeb47e101b36a83317e6896916a9189ec91018e9df4b9e901378fe1093ccd1554d171870af273886d2d7b863a4ab9db3ce5cb31428f592ef607f622fec7257bb1787ea501b58bdfb017fa39f626a7f6046a7bca13faa0ef3353834aab4e34a007eda4de7fa7f0bef4f4dbe81520ba84923a895a4a36a747aa661ec256a03ae98d56112b32783b942127207b5105dbfe2c179778c5b343bea4df5d50dcebc1b5155f067a07b1ba09def80c346c04eb598fbe2b5430ab374653879c7bc4e2c3164af696c9b70fb0b2bb04bfbcad62bf38763d205f80798fc34eec9573beb4ce1766ea3aec921f2becd97d55bface5f20c233b88af07fa21ec61c69aea6ea403f22b5fb7a7ba0e3e0838075ff60291f1882a2deedbb7b9f698a7e8b0eeaf34d57a77a26983790adbfa09fd52cc1b7aaea7f6637f899f595bddcc1dbac0f1a5586f7d5557dae4c74671cf05466f867dca8cb0fe8a99479c21ee953a73613c55d2a0214f5ea14cde02d65ab8e24441fc8cdd6291d322f5bda8d26e614636c8b479c814d8feab69867aacfa639f9a7433c5ff596632ab1bc5b3b53fa8f77dc15e48462b7b9239aad0796ddb69d765aac6f61d6b4888d999cf02e65db49767d0160c6bf9823dda922bb0c2de59aa2eafb20c624aecb3accc91ea82841752252be9cacccd28cb41b3dfd15e36fa799bf1e5436f6c127b9750ef97ddd2427649bb22b152e61e19f8dcac9bf5a0ee0ce8952f33a839d4cc1f7a8ea636c75c1877bda3c70ae7b8be6d5c957eeab12ca447a9ae200fddd5cd6c00b5d829d4343dd6cb16aec2221b462f1662ffa1947aa3d487f96c2fc51aba8e27442a3167f5bd6cc4ddd7f5fee322ee50d84b3b827aff203e9f41fe65759420dca18cb8cab2883a350a17d9585da20cdaa8591ff6ff31ffbc024d7b017bb8c5be12565f2c97f87413d6efcd55b3097252b495df974b3cef10a2ee827c1eb32967ed056ea2f543615bc966ba1c3b4fc0d1b16b66a0f9182531ba487da2aad9227bcddeb2653c9b81aba2d37ee6ba071ae36b357bcf56d94194a16a81bd0c413a43ae775aa009b5ac0e1e6990e4d2fba23f263d4b918b54585b1a7c7f76987614c8bb2e25cf5517eaccbd60ef3ee893ecc80598c4727f4b6ac653d0c563fbe0265903b2b4cb8d882b7bfdacb5a04927d9697696bc9dec20d29ecca9bfcccecd767681ab1ee9a59cece37e655eeccb73acc9a166dfd253d7f3a764cb9c7d602f05ebbc2b97bb49b42bc8c5c6fac49e40a67f8af9f182ec44d9ec3298587ffa5bfb181e919b26d7a9eb5d099033aed43e7902e0a0637bdc8b1bb20c9bfed496634709f4652d97e5a77e72b197bcbe4a59d354fcb96f664bf42b863b0fb88365dedc3056ea313fca5a3a9e2f9a676ddb704d3bc70ef70cb570ee4759472b73935d85bbf064cbe178a34e95fed7227a05cca0299e0cd73920af4ad5ceb3ebec26d69ea98e75aaf6237bf96a8f167ebecca235cec033491c8efe96f749ccab7dd12ddc0789b54bddee81dddcd90cf8c82037b8cdeed906c9833ed9fbec41f68dd2ee397394728bf5ae2e69d81b543b537ba62bd4238afd37589d47ac81eda7fed8ef9d85a981e71fab2af65ecf94ecbe5116b2303d77188cbe885d54f510b9c99efc222b856e56d2d7ee11a2e929d68c31df8af9c453b6052a021942568e23e19eede2c3bf39ef490b9ed9905520d39d81264fb8b7bfee897e92cbefec573aff966d673bb1a76cced0a32e30e7228d985b9fedda336ff5d25a98e1508fb2bd6c3fabc24415c8dec7b136c9313e0337757567df21f458b0aa5951db84fa42af72ce57f48c6d3b31d7fad55dc53e6871efed27cfc3585fca6dee7037894ee8ac7d1a5130cbbd771ab27edcb928996d3dcc03d4190778569c329d3e64a067c0cd9baab9173f37e3185bb9a3f7512eeb9c7cc1e367906304bd95e71801c4dffe89fdfd7067cafec5eee0baf50b711b3d349efd18e55dff9cf7d4891ebb2b6bb06e1f415d72ee1a9cad96f2c84ddcbd5010239ec2ae3fc6ec6889fdb64fb291ea3afe261fe4437fefaef211f642d7b5cb9fd8dff70d33cb9ff371eada4936cf7955cc356d00eb9cea3b1370ffdd63cd1967ebe36ec669fe023201f9b82bac7962afe5369fe453eeae7ef18f7b9b73a83f634fd3f1be417f637fe753fdf247fbfb60030b7b941deb7dded3ea14f746d09fe2991d3ff5f57ce61fc2339e61a969af1ab4839bf7913b8372893db0513ecf17f96bfe8671eb0b7b419b843bf9327fcf5721484550b097fce7edc5d5dcabab81cd1c645553a278cc7b0f738ea1586be229899929f9477f06b54dec97ccb0c310f7f12bbc7308b9b7eee5b578722bafe7138ef15f5a0a7305d1353fb4a720c70c77b8d63dcb4fdf79fae679fe41b883985bcd8f7c2e92619b957dcc36eb78f44edab5f3e3bc61959b38959fd0f760d489f3f6dd79731c1e4d2b3ff553c8bbe6d433e31e2dff5f649eec06e2647ea656317fc0be9d4d7125c76ad07cdf5ef42c3f87cf715ecb2fcc7ddce9a748872724e4ec74f1241bccaeace9da6b3bb0b5fc326fc633fdf63e6fe5edac947720f25ec93bc92f7e964ce1acb939873ab66e26e0359e5d434bcf48a5ef397d3bbee85e36f1e5ec465bbb67ebf915e554f1346eca12298f7ee3eab389de7616b7882096ce20dfb46617ae538c2ac8059fa7a13e40b1d7b2d89009c599b862575937bf06cf22f9e2fafb7ff9cfc497bc16a50bb51c48172a59c877fd18296aaefbf56add09fcd873597f12d74b94a94a7563ab70cf7065bf2997366607576127b3a6b9b1bf5fdcfffede794bb0563c4155737be09de7f98d6bc50c4d3521475baef7e1d3a5a973b1c620b1b7755d2c1ca34cf0dc56c156cc67b9c40a0f77fd4c7e0babba3e0f53c821bf6b2ff99d39d4b57017f7c0dc8eb6d95366ed9be9aaf5370f64cf57e423a73f3ac98e36cec2727642f5c957d1fed39973c8474167f3fbfce1c7dfbff84e7c01edaae91ef8c4b8a3b7d25bd6aa5afe685b7607f29a68377d8e9e2d95ce270be5907a410244f509f61f0cf568d25edb909fe3dda67cb9b69d8d7e007063daf993afe85561bffaa7e38b0eb663b6ed12f0ab79cc4bf9565e8668f8605ff28adbdc8b5ff7e4a587b2d10f4eab3e4f56beee02ce638ccfb7f15b271ffc988b7ee4d59e43d6df28f4f2d6fb71dfb797cd8bf734fd963db5f76eee8eb01b583821b5e16165d78165c6156f3bf5fcc9ffc533bcb37c6047f92abfe29d9b74fa173c3c64caf94ebe1bfb3eeebc40d7c6fef537bf2ff6e1cc3676b07bbae11ef3906de59d7c0fbf334279477b83938d9e0b769596058e4966a43f593ed417b84278a2d4e6d89d99473f6e56a603155f034f9f660579fcf479cb4fb219635f7309167402fadbccf75dc50777cddf81a11a1a1eb4db763b9e5b4e5e9afa65f19fc98660374dcc7caa6e9a57edc4befbfb58f586d0d5be1e7537de233efd45dec3f3fd9378e6e263edfb13f1657d15eb05fc96613c03699ff25a76ee7af9a51f769539c54ed6fc835c3efa2afede98d9f5a7760ed5ef31545a718f1472e890a95b5bf7753c23310b73fbea2f740b38a915ce8c7ff57db26f7fbfb2b8167cde780615572dc6df70079eba678255e1323ff6435fb5af7832fcf3b7df285f9ba9a92965a32ea439b6dc7558c7bf42a535821a3ed303fb64265d6fbb4aa14cded14edef99c8dc73eccc677d27f26be7c5a03fc562e9e9d9ce2b7d38edccaed40ae74e9dfcc7137f8b97db6abf0d2cdc23be4cd53cc614e4106d35056d7eed03f657968ea8a9964e7be04b9918b155c9e67cd985bc55c38566b99cd6f219e3c45df0538ca648195d878839e7c532e7f682f85bf31426723f82cf80bf610637fecc8670a72836eee6fdd1ee40833d09a07e7d52ad455cf9d8566b79b6ddb71de08bb2ed8b26e66369cc50adad5604da67ac094623d8a3f4ff5329bb885f178023e9e21e893d7a1ef8ffd497bf9e26f8860053cd693a8bf9d793c9d46fbfcf1e7e82521a2e6b0d690f138134ec2991ad94757b78f6a14ceec53dca5026eb903e16a69dc919cf5c413c5633c05bc8a9faa8ebdd178a679c5ddfb4d5ff6fdf8f2e1efbffcd0c759a28ccfabc839af51e1bb919b7f1fa6f87dc9cddfbb0f7ab1f1de8fe8fc097bf9f1df77c1131d9453e3675cdb45e112ee3e7da69efde65eca669fe5f7fe36c606fea9ef237f219b8d5e88ac5d48549206d177f68bef15e3b59ccb5ce714369d35f8ea6f01157525e16fc797fc4bf9f80f71777d6ff36f2504ecc7cf3ebd27e3ae7b90ebdecafacc67f19c8ddbd0894f31e69bf958fe51361b72f9c1df48fa2a3e6fc8b0b73eebf1719e8fb1ad50e317f1c6b8df944bf78bf52fcaecabbf0ff3f1fdae2eee273891d7e61eca47dff4c1363ecbe4e7eafdf879a63fefd1acd724dbf86eacec21c64ffaab11856f00cbfde2f5c96fd17c9b722dcc9be402cf757bd8efff197bd95cd32fbe23a355c117c53577fcad9dcdef337f25c3cffea968379f65bf96133c079c6cc8e5bb39f2cfe46d1f75febbf77f34df973654f47ddf8f2fff27ae5ff4f7c7fe129fffafe4f2dffff6b7ff0140588b33</data>
+ </image>
+ <image name="image40">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>lcdDisplay</receiver>
+ <slot>display(int)</slot>
+ </connection>
+ <connection>
+ <sender>slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>progressBar</receiver>
+ <slot>setProgress(int)</slot>
+ </connection>
+ <connection>
+ <sender>dateEdit</sender>
+ <signal>valueChanged(const QDate&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateDateTimeString()</slot>
+ </connection>
+ <connection>
+ <sender>slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>spinBox</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>spinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>slider</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>spinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>progressBar</receiver>
+ <slot>setProgress(int)</slot>
+ </connection>
+ <connection>
+ <sender>spinBox</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>lcdDisplay</receiver>
+ <slot>display(int)</slot>
+ </connection>
+ <connection>
+ <sender>buttonColorBox</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateColorTest(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>returnPressed()</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const QTime&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateDateTimeString()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const QTime&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateClock()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>resetColors()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">widgetsbase_pro.ui.h</include>
+</includes>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+ <slot>resetColors()</slot>
+ <slot access="protected">setColor( const QString &amp; color )</slot>
+ <slot>setColor()</slot>
+ <slot>updateClock()</slot>
+ <slot access="protected">updateColorTest( const QString &amp; color )</slot>
+ <slot access="protected">updateDateTimeString()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/demo/widgets/widgetsbase_pro.ui.h b/examples/demo/widgets/widgetsbase_pro.ui.h
new file mode 100644
index 0000000..ec3d1ce
--- /dev/null
+++ b/examples/demo/widgets/widgetsbase_pro.ui.h
@@ -0,0 +1,64 @@
+#include <qobjectlist.h>
+
+void WidgetsBase::init()
+{
+ timeEdit->setTime( QTime::currentTime() );
+ dateEdit->setDate( QDate::currentDate() );
+}
+
+void WidgetsBase::destroy()
+{
+
+}
+
+void WidgetsBase::resetColors()
+{
+ groupBox->setPalette( palette(), FALSE );
+ if(QObjectList *chldn = groupBox->queryList()) {
+ for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ QWidget *w = (QWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(palette(), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor( const QString & color )
+{
+ groupBox->setPalette( QColor( color ), FALSE );
+ if(QObjectList *chldn = groupBox->queryList()) {
+ for(QObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ QWidget *w = (QWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(QColor(color), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor()
+{
+ setColor( lineEdit->text() );
+}
+
+void WidgetsBase::updateClock()
+{
+ clock->setTime( timeEdit->time() );
+}
+
+void WidgetsBase::updateColorTest( const QString & color )
+{
+ colorTest->setPalette( QColor( color ) );
+}
+
+void WidgetsBase::updateDateTimeString()
+{
+ QDateTime dt;
+ dt.setDate( dateEdit->date() );
+ dt.setTime( timeEdit->time() );
+ dateTimeLabel->setText( dt.toString() );
+}
+