summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-08 12:31:36 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-08 12:31:36 -0600
commitd796c9dd933ab96ec83b9a634feedd5d32e1ba3f (patch)
tree6e3dcca4f77e20ec8966c666aac7c35bd4704053 /examples
downloadtqt3-d796c9dd933ab96ec83b9a634feedd5d32e1ba3f.tar.gz
tqt3-d796c9dd933ab96ec83b9a634feedd5d32e1ba3f.zip
Test conversion to TQt3 from Qt3 8c6fc1f8e35fd264dd01c582ca5e7549b32ab731
Diffstat (limited to 'examples')
-rw-r--r--examples/README416
-rw-r--r--examples/aclock/README5
-rw-r--r--examples/aclock/aclock.cpp147
-rw-r--r--examples/aclock/aclock.doc28
-rw-r--r--examples/aclock/aclock.h44
-rw-r--r--examples/aclock/aclock.pro11
-rw-r--r--examples/aclock/main.cpp27
-rw-r--r--examples/action/action.pro11
-rw-r--r--examples/action/application.cpp306
-rw-r--r--examples/action/application.doc36
-rw-r--r--examples/action/application.h46
-rw-r--r--examples/action/fileopen.xpm22
-rw-r--r--examples/action/fileprint.xpm24
-rw-r--r--examples/action/filesave.xpm22
-rw-r--r--examples/action/main.cpp20
-rw-r--r--examples/action/toggleaction/labelonoff.xpm169
-rw-r--r--examples/action/toggleaction/toggleaction.cpp31
-rw-r--r--examples/action/toggleaction/toggleaction.doc15
-rw-r--r--examples/action/toggleaction/toggleaction.pro10
-rw-r--r--examples/addressbook/addressbook.doc41
-rw-r--r--examples/addressbook/addressbook.pro13
-rw-r--r--examples/addressbook/centralwidget.cpp351
-rw-r--r--examples/addressbook/centralwidget.h59
-rw-r--r--examples/addressbook/fileopen.xpm22
-rw-r--r--examples/addressbook/fileprint.xpm24
-rw-r--r--examples/addressbook/filesave.xpm22
-rw-r--r--examples/addressbook/main.cpp27
-rw-r--r--examples/addressbook/mainwindow.cpp108
-rw-r--r--examples/addressbook/mainwindow.h49
-rw-r--r--examples/application/application.cpp294
-rw-r--r--examples/application/application.doc34
-rw-r--r--examples/application/application.h46
-rw-r--r--examples/application/application.pro11
-rw-r--r--examples/application/fileopen.xpm22
-rw-r--r--examples/application/fileprint.xpm24
-rw-r--r--examples/application/filesave.xpm22
-rw-r--r--examples/application/main.cpp20
-rw-r--r--examples/biff/biff.cpp75
-rw-r--r--examples/biff/biff.doc31
-rw-r--r--examples/biff/biff.h38
-rw-r--r--examples/biff/biff.pro11
-rw-r--r--examples/biff/bmp.cpp191
-rw-r--r--examples/biff/main.cpp21
-rw-r--r--examples/buttongroups/README13
-rw-r--r--examples/buttongroups/buttongroups.cpp120
-rw-r--r--examples/buttongroups/buttongroups.doc27
-rw-r--r--examples/buttongroups/buttongroups.h34
-rw-r--r--examples/buttongroups/buttongroups.pro10
-rw-r--r--examples/buttongroups/main.cpp24
-rw-r--r--examples/canvas/blendshadow.cpp53
-rw-r--r--examples/canvas/butterfly.pngbin0 -> 37832 bytes
-rw-r--r--examples/canvas/canvas.cpp747
-rw-r--r--examples/canvas/canvas.doc29
-rw-r--r--examples/canvas/canvas.h91
-rw-r--r--examples/canvas/canvas.pro10
-rw-r--r--examples/canvas/main.cpp43
-rw-r--r--examples/canvas/makeimg.cpp92
-rw-r--r--examples/canvas/qt-trans.xpm54
-rw-r--r--examples/canvas/qtlogo.pngbin0 -> 22383 bytes
-rw-r--r--examples/chart/canvastext.h31
-rw-r--r--examples/chart/canvasview.cpp55
-rw-r--r--examples/chart/canvasview.h36
-rw-r--r--examples/chart/chart.doc41
-rw-r--r--examples/chart/chart.pro20
-rw-r--r--examples/chart/chartform.cpp531
-rw-r--r--examples/chart/chartform.h90
-rw-r--r--examples/chart/chartform_canvas.cpp226
-rw-r--r--examples/chart/chartform_files.cpp113
-rw-r--r--examples/chart/element.cpp127
-rw-r--r--examples/chart/element.h84
-rw-r--r--examples/chart/images/chart-forms.sk256
-rw-r--r--examples/chart/images/file_new.xpm36
-rw-r--r--examples/chart/images/file_open.xpm33
-rw-r--r--examples/chart/images/file_print.xpm115
-rw-r--r--examples/chart/images/file_save.xpm33
-rw-r--r--examples/chart/images/file_saveaspostscript.xpm34
-rw-r--r--examples/chart/images/options_horizontalbarchart.xpm31
-rw-r--r--examples/chart/images/options_piechart.xpm30
-rw-r--r--examples/chart/images/options_setdata.xpm34
-rw-r--r--examples/chart/images/options_setfont.xpm27
-rw-r--r--examples/chart/images/options_setoptions.xpm32
-rw-r--r--examples/chart/images/options_verticalbarchart.xpm31
-rw-r--r--examples/chart/images/pattern01.xpm27
-rw-r--r--examples/chart/images/pattern02.xpm28
-rw-r--r--examples/chart/images/pattern03.xpm28
-rw-r--r--examples/chart/images/pattern04.xpm28
-rw-r--r--examples/chart/images/pattern05.xpm28
-rw-r--r--examples/chart/images/pattern06.xpm28
-rw-r--r--examples/chart/images/pattern07.xpm28
-rw-r--r--examples/chart/images/pattern08.xpm28
-rw-r--r--examples/chart/images/pattern09.xpm28
-rw-r--r--examples/chart/images/pattern10.xpm28
-rw-r--r--examples/chart/images/pattern11.xpm28
-rw-r--r--examples/chart/images/pattern12.xpm28
-rw-r--r--examples/chart/images/pattern13.xpm28
-rw-r--r--examples/chart/images/pattern14.xpm28
-rw-r--r--examples/chart/main.cpp21
-rw-r--r--examples/chart/optionsform.cpp135
-rw-r--r--examples/chart/optionsform.h60
-rw-r--r--examples/chart/setdataform.cpp208
-rw-r--r--examples/chart/setdataform.h47
-rw-r--r--examples/checklists/checklists.cpp162
-rw-r--r--examples/checklists/checklists.doc29
-rw-r--r--examples/checklists/checklists.h35
-rw-r--r--examples/checklists/checklists.pro11
-rw-r--r--examples/checklists/main.cpp24
-rw-r--r--examples/cursor/README2
-rw-r--r--examples/cursor/cursor.cpp148
-rw-r--r--examples/cursor/cursor.doc17
-rw-r--r--examples/cursor/cursor.pro10
-rw-r--r--examples/customlayout/border.cpp226
-rw-r--r--examples/customlayout/border.h104
-rw-r--r--examples/customlayout/card.cpp111
-rw-r--r--examples/customlayout/card.h42
-rw-r--r--examples/customlayout/customlayout.doc55
-rw-r--r--examples/customlayout/customlayout.pro15
-rw-r--r--examples/customlayout/flow.cpp133
-rw-r--r--examples/customlayout/flow.h55
-rw-r--r--examples/customlayout/main.cpp97
-rw-r--r--examples/dclock/README5
-rw-r--r--examples/dclock/dclock.cpp97
-rw-r--r--examples/dclock/dclock.doc29
-rw-r--r--examples/dclock/dclock.h39
-rw-r--r--examples/dclock/dclock.pro11
-rw-r--r--examples/dclock/main.cpp23
-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
-rw-r--r--examples/desktop/README12
-rw-r--r--examples/desktop/desktop.cpp347
-rw-r--r--examples/desktop/desktop.doc20
-rw-r--r--examples/desktop/desktop.pro10
-rw-r--r--examples/dirview/dirview.cpp532
-rw-r--r--examples/dirview/dirview.doc35
-rw-r--r--examples/dirview/dirview.h110
-rw-r--r--examples/dirview/dirview.pro11
-rw-r--r--examples/dirview/main.cpp42
-rw-r--r--examples/distributor/distributor.doc41
-rw-r--r--examples/distributor/distributor.pro10
-rw-r--r--examples/distributor/distributor.ui427
-rw-r--r--examples/distributor/distributor.ui.h383
-rw-r--r--examples/distributor/main.cpp11
-rw-r--r--examples/dragdrop/dragdrop.doc14
-rw-r--r--examples/dragdrop/dragdrop.pro13
-rw-r--r--examples/dragdrop/dropsite.cpp158
-rw-r--r--examples/dragdrop/dropsite.h55
-rw-r--r--examples/dragdrop/main.cpp73
-rw-r--r--examples/dragdrop/secret.cpp91
-rw-r--r--examples/dragdrop/secret.h42
-rw-r--r--examples/dragdrop/trolltech.bmpbin0 -> 30054 bytes
-rw-r--r--examples/dragdrop/trolltech.gifbin0 -> 42629 bytes
-rw-r--r--examples/drawdemo/README2
-rw-r--r--examples/drawdemo/drawdemo.cpp312
-rw-r--r--examples/drawdemo/drawdemo.doc17
-rw-r--r--examples/drawdemo/drawdemo.pro10
-rw-r--r--examples/drawlines/README3
-rw-r--r--examples/drawlines/connect.cpp132
-rw-r--r--examples/drawlines/drawlines.doc20
-rw-r--r--examples/drawlines/drawlines.pro9
-rw-r--r--examples/examples.pro123
-rw-r--r--examples/extension/dialogform.ui206
-rw-r--r--examples/extension/dialogform.ui.h24
-rw-r--r--examples/extension/extension.doc41
-rw-r--r--examples/extension/extension.pro12
-rw-r--r--examples/extension/extension.ui114
-rw-r--r--examples/extension/extension.ui.h7
-rw-r--r--examples/extension/main.cpp11
-rw-r--r--examples/extension/mainform.ui74
-rw-r--r--examples/extension/mainform.ui.h46
-rw-r--r--examples/fileiconview/fileiconview.doc44
-rw-r--r--examples/fileiconview/fileiconview.pro15
-rw-r--r--examples/fileiconview/main.cpp26
-rw-r--r--examples/fileiconview/mainwindow.cpp228
-rw-r--r--examples/fileiconview/mainwindow.h60
-rw-r--r--examples/fileiconview/qfileiconview.cpp835
-rw-r--r--examples/fileiconview/qfileiconview.h170
-rw-r--r--examples/fonts/fonts.pro5
-rw-r--r--examples/fonts/simple-qfont-demo/simple-qfont-demo.cpp14
-rw-r--r--examples/fonts/simple-qfont-demo/simple-qfont-demo.doc28
-rw-r--r--examples/fonts/simple-qfont-demo/simple-qfont-demo.pro11
-rw-r--r--examples/fonts/simple-qfont-demo/viewer.cpp160
-rw-r--r--examples/fonts/simple-qfont-demo/viewer.h37
-rw-r--r--examples/forever/README4
-rw-r--r--examples/forever/forever.cpp99
-rw-r--r--examples/forever/forever.doc25
-rw-r--r--examples/forever/forever.h39
-rw-r--r--examples/forever/forever.pro10
-rw-r--r--examples/gridview/gridview.cpp46
-rw-r--r--examples/gridview/gridview.pro10
-rw-r--r--examples/hello/README3
-rw-r--r--examples/hello/hello.cpp101
-rw-r--r--examples/hello/hello.doc30
-rw-r--r--examples/hello/hello.h33
-rw-r--r--examples/hello/hello.pro9
-rw-r--r--examples/hello/main.cpp40
-rw-r--r--examples/helpdemo/about.txt1
-rw-r--r--examples/helpdemo/doc/handbook.pngbin0 -> 1060 bytes
-rw-r--r--examples/helpdemo/doc/helpdemo.adp27
-rw-r--r--examples/helpdemo/doc/index.html41
-rw-r--r--examples/helpdemo/doc/logo.pngbin0 -> 811 bytes
-rw-r--r--examples/helpdemo/doc/manual.html65
-rw-r--r--examples/helpdemo/helpdemo.cpp119
-rw-r--r--examples/helpdemo/helpdemo.h42
-rw-r--r--examples/helpdemo/helpdemo.pro15
-rw-r--r--examples/helpdemo/helpdemobase.ui239
-rw-r--r--examples/helpdemo/main.cpp11
-rw-r--r--examples/helpsystem/appicon.pngbin0 -> 2353 bytes
-rw-r--r--examples/helpsystem/helpsystem.doc221
-rw-r--r--examples/helpsystem/helpsystem.pro8
-rw-r--r--examples/helpsystem/main.cpp22
-rw-r--r--examples/helpsystem/mainwindow.cpp118
-rw-r--r--examples/helpsystem/mainwindow.h31
-rw-r--r--examples/helpsystem/tooltip.cpp52
-rw-r--r--examples/helpsystem/tooltip.h41
-rw-r--r--examples/helpsystem/whatsthis.cpp99
-rw-r--r--examples/helpsystem/whatsthis.h50
-rw-r--r--examples/helpviewer/back.xpm27
-rw-r--r--examples/helpviewer/forward.xpm28
-rw-r--r--examples/helpviewer/helpviewer.doc28
-rw-r--r--examples/helpviewer/helpviewer.pro11
-rw-r--r--examples/helpviewer/helpwindow.cpp315
-rw-r--r--examples/helpviewer/helpwindow.h63
-rw-r--r--examples/helpviewer/home.xpm27
-rw-r--r--examples/helpviewer/main.cpp41
-rw-r--r--examples/i18n/README9
-rw-r--r--examples/i18n/i18n.doc34
-rw-r--r--examples/i18n/i18n.pro23
-rw-r--r--examples/i18n/main.cpp171
-rw-r--r--examples/i18n/mywidget.cpp73
-rw-r--r--examples/i18n/mywidget.h33
-rw-r--r--examples/i18n/mywidget_ar.qmbin0 -> 681 bytes
-rw-r--r--examples/i18n/mywidget_ar.ts73
-rw-r--r--examples/i18n/mywidget_cs.qmbin0 -> 818 bytes
-rw-r--r--examples/i18n/mywidget_cs.ts75
-rw-r--r--examples/i18n/mywidget_de.qmbin0 -> 880 bytes
-rw-r--r--examples/i18n/mywidget_de.ts75
-rw-r--r--examples/i18n/mywidget_el.qmbin0 -> 832 bytes
-rw-r--r--examples/i18n/mywidget_el.ts68
-rw-r--r--examples/i18n/mywidget_en.qmbin0 -> 337 bytes
-rw-r--r--examples/i18n/mywidget_en.ts68
-rw-r--r--examples/i18n/mywidget_eo.qmbin0 -> 835 bytes
-rw-r--r--examples/i18n/mywidget_eo.ts72
-rw-r--r--examples/i18n/mywidget_fr.qmbin0 -> 884 bytes
-rw-r--r--examples/i18n/mywidget_fr.ts68
-rw-r--r--examples/i18n/mywidget_it.qmbin0 -> 763 bytes
-rw-r--r--examples/i18n/mywidget_it.ts72
-rw-r--r--examples/i18n/mywidget_jp.qmbin0 -> 738 bytes
-rw-r--r--examples/i18n/mywidget_jp.ts68
-rw-r--r--examples/i18n/mywidget_ko.qmbin0 -> 738 bytes
-rw-r--r--examples/i18n/mywidget_ko.ts68
-rw-r--r--examples/i18n/mywidget_no.qmbin0 -> 830 bytes
-rw-r--r--examples/i18n/mywidget_no.ts68
-rw-r--r--examples/i18n/mywidget_ru.qmbin0 -> 799 bytes
-rw-r--r--examples/i18n/mywidget_ru.ts68
-rw-r--r--examples/i18n/mywidget_zh.qmbin0 -> 706 bytes
-rw-r--r--examples/i18n/mywidget_zh.ts68
-rw-r--r--examples/iconview/iconview.doc16
-rw-r--r--examples/iconview/iconview.pro10
-rw-r--r--examples/iconview/main.cpp75
-rw-r--r--examples/iconview/simple_dd/main.cpp187
-rw-r--r--examples/iconview/simple_dd/main.h60
-rw-r--r--examples/iconview/simple_dd/simple_dd.doc29
-rw-r--r--examples/iconview/simple_dd/simple_dd.pro10
-rw-r--r--examples/layout/layout.cpp159
-rw-r--r--examples/layout/layout.doc17
-rw-r--r--examples/layout/layout.pro10
-rw-r--r--examples/life/life.cpp136
-rw-r--r--examples/life/life.doc27
-rw-r--r--examples/life/life.h58
-rw-r--r--examples/life/life.pro13
-rw-r--r--examples/life/lifedlg.cpp162
-rw-r--r--examples/life/lifedlg.h64
-rw-r--r--examples/life/main.cpp44
-rw-r--r--examples/life/patterns.cpp383
-rw-r--r--examples/lineedits/lineedits.cpp272
-rw-r--r--examples/lineedits/lineedits.doc29
-rw-r--r--examples/lineedits/lineedits.h37
-rw-r--r--examples/lineedits/lineedits.pro11
-rw-r--r--examples/lineedits/main.cpp23
-rw-r--r--examples/listbox/listbox.cpp193
-rw-r--r--examples/listbox/listbox.doc29
-rw-r--r--examples/listbox/listbox.h47
-rw-r--r--examples/listbox/listbox.pro11
-rw-r--r--examples/listbox/main.cpp23
-rw-r--r--examples/listboxcombo/fileopen.xpm22
-rw-r--r--examples/listboxcombo/listboxcombo.cpp187
-rw-r--r--examples/listboxcombo/listboxcombo.doc29
-rw-r--r--examples/listboxcombo/listboxcombo.h36
-rw-r--r--examples/listboxcombo/listboxcombo.pro10
-rw-r--r--examples/listboxcombo/main.cpp24
-rw-r--r--examples/listboxcombo/qtlogo.pngbin0 -> 12615 bytes
-rw-r--r--examples/listviews/listviews.cpp260
-rw-r--r--examples/listviews/listviews.doc30
-rw-r--r--examples/listviews/listviews.h166
-rw-r--r--examples/listviews/listviews.pro11
-rw-r--r--examples/listviews/main.cpp24
-rw-r--r--examples/mdi/application.cpp435
-rw-r--r--examples/mdi/application.h81
-rw-r--r--examples/mdi/document.xpm25
-rw-r--r--examples/mdi/fileopen.xpm22
-rw-r--r--examples/mdi/fileprint.xpm24
-rw-r--r--examples/mdi/filesave.xpm22
-rw-r--r--examples/mdi/main.cpp22
-rw-r--r--examples/mdi/mdi.doc28
-rw-r--r--examples/mdi/mdi.pro11
-rw-r--r--examples/menu/menu.cpp355
-rw-r--r--examples/menu/menu.doc25
-rw-r--r--examples/menu/menu.h59
-rw-r--r--examples/menu/menu.pro10
-rw-r--r--examples/movies/fire.mngbin0 -> 44430 bytes
-rw-r--r--examples/movies/main.cpp291
-rw-r--r--examples/movies/movies.doc19
-rw-r--r--examples/movies/movies.pro10
-rw-r--r--examples/movies/trolltech.gifbin0 -> 42629 bytes
-rw-r--r--examples/network/archivesearch/archivedialog.ui137
-rw-r--r--examples/network/archivesearch/archivedialog.ui.h102
-rw-r--r--examples/network/archivesearch/archivesearch.doc25
-rw-r--r--examples/network/archivesearch/archivesearch.pro9
-rw-r--r--examples/network/archivesearch/main.cpp23
-rw-r--r--examples/network/clientserver/client/client.cpp125
-rw-r--r--examples/network/clientserver/client/client.pro9
-rw-r--r--examples/network/clientserver/clientserver.doc35
-rw-r--r--examples/network/clientserver/server/server.cpp162
-rw-r--r--examples/network/clientserver/server/server.pro9
-rw-r--r--examples/network/ftpclient/README3
-rw-r--r--examples/network/ftpclient/connectdialog.ui244
-rw-r--r--examples/network/ftpclient/ftpclient.doc24
-rw-r--r--examples/network/ftpclient/ftpclient.pro14
-rw-r--r--examples/network/ftpclient/ftpmainwindow.ui280
-rw-r--r--examples/network/ftpclient/ftpmainwindow.ui.h273
-rw-r--r--examples/network/ftpclient/ftpviewitem.cpp58
-rw-r--r--examples/network/ftpclient/ftpviewitem.h35
-rw-r--r--examples/network/ftpclient/images/file.pngbin0 -> 106 bytes
-rw-r--r--examples/network/ftpclient/images/folder.pngbin0 -> 145 bytes
-rw-r--r--examples/network/ftpclient/main.cpp23
-rw-r--r--examples/network/httpd/README7
-rw-r--r--examples/network/httpd/httpd.cpp141
-rw-r--r--examples/network/httpd/httpd.doc20
-rw-r--r--examples/network/httpd/httpd.pro9
-rw-r--r--examples/network/infoprotocol/infoclient/client.cpp120
-rw-r--r--examples/network/infoprotocol/infoclient/client.h47
-rw-r--r--examples/network/infoprotocol/infoclient/clientbase.ui276
-rw-r--r--examples/network/infoprotocol/infoclient/infoclient.pro11
-rw-r--r--examples/network/infoprotocol/infoclient/main.cpp21
-rw-r--r--examples/network/infoprotocol/infoserver/infodata.cpp88
-rw-r--r--examples/network/infoprotocol/infoserver/infodata.h31
-rw-r--r--examples/network/infoprotocol/infoserver/infoserver.pro13
-rw-r--r--examples/network/infoprotocol/infoserver/main.cpp22
-rw-r--r--examples/network/infoprotocol/infoserver/server.cpp99
-rw-r--r--examples/network/infoprotocol/infoserver/server.h69
-rw-r--r--examples/network/infoprotocol/infoserver/serverbase.ui117
-rw-r--r--examples/network/infoprotocol/infourlclient/client.cpp60
-rw-r--r--examples/network/infoprotocol/infourlclient/client.h35
-rw-r--r--examples/network/infoprotocol/infourlclient/clientbase.ui118
-rw-r--r--examples/network/infoprotocol/infourlclient/infourlclient.pro13
-rw-r--r--examples/network/infoprotocol/infourlclient/main.cpp23
-rw-r--r--examples/network/infoprotocol/infourlclient/qip.cpp132
-rw-r--r--examples/network/infoprotocol/infourlclient/qip.h48
-rw-r--r--examples/network/mail/composer.cpp65
-rw-r--r--examples/network/mail/composer.h41
-rw-r--r--examples/network/mail/mail.doc25
-rw-r--r--examples/network/mail/mail.pro12
-rw-r--r--examples/network/mail/main.cpp23
-rw-r--r--examples/network/mail/smtp.cpp127
-rw-r--r--examples/network/mail/smtp.h58
-rw-r--r--examples/network/networkprotocol/README5
-rw-r--r--examples/network/networkprotocol/main.cpp29
-rw-r--r--examples/network/networkprotocol/networkprotocol.doc26
-rw-r--r--examples/network/networkprotocol/networkprotocol.pro10
-rw-r--r--examples/network/networkprotocol/nntp.cpp256
-rw-r--r--examples/network/networkprotocol/nntp.h49
-rw-r--r--examples/network/networkprotocol/view.cpp90
-rw-r--r--examples/network/networkprotocol/view.h37
-rw-r--r--examples/network/remotecontrol/ipcserver.cpp84
-rw-r--r--examples/network/remotecontrol/ipcserver.h20
-rw-r--r--examples/network/remotecontrol/main.cpp11
-rw-r--r--examples/network/remotecontrol/maindialog.ui165
-rw-r--r--examples/network/remotecontrol/remotecontrol.pro16
-rw-r--r--examples/network/remotecontrol/remotectrl.ui145
-rw-r--r--examples/network/remotecontrol/remotectrlimpl.cpp50
-rw-r--r--examples/network/remotecontrol/remotectrlimpl.h26
-rw-r--r--examples/network/remotecontrol/startup.cpp45
-rw-r--r--examples/network/remotecontrol/startup.h28
-rw-r--r--examples/opengl/box/README8
-rw-r--r--examples/opengl/box/box.doc18
-rw-r--r--examples/opengl/box/box.pro15
-rw-r--r--examples/opengl/box/glbox.cpp170
-rw-r--r--examples/opengl/box/glbox.h53
-rw-r--r--examples/opengl/box/globjwin.cpp74
-rw-r--r--examples/opengl/box/globjwin.h32
-rw-r--r--examples/opengl/box/main.cpp42
-rw-r--r--examples/opengl/gear/README4
-rw-r--r--examples/opengl/gear/gear.cpp296
-rw-r--r--examples/opengl/gear/gear.doc11
-rw-r--r--examples/opengl/gear/gear.pro12
-rw-r--r--examples/opengl/glpixmap/README8
-rw-r--r--examples/opengl/glpixmap/glbox.cpp256
-rw-r--r--examples/opengl/glpixmap/glbox.h58
-rw-r--r--examples/opengl/glpixmap/globjwin.cpp214
-rw-r--r--examples/opengl/glpixmap/globjwin.h51
-rw-r--r--examples/opengl/glpixmap/glpixmap.doc14
-rw-r--r--examples/opengl/glpixmap/glpixmap.pro15
-rw-r--r--examples/opengl/glpixmap/main.cpp42
-rw-r--r--examples/opengl/overlay/README9
-rw-r--r--examples/opengl/overlay/globjwin.cpp57
-rw-r--r--examples/opengl/overlay/globjwin.h33
-rw-r--r--examples/opengl/overlay/glteapots.cpp457
-rw-r--r--examples/opengl/overlay/glteapots.h62
-rw-r--r--examples/opengl/overlay/main.cpp52
-rw-r--r--examples/opengl/overlay/overlay.doc16
-rw-r--r--examples/opengl/overlay/overlay.pro14
-rw-r--r--examples/opengl/overlay_x11/README74
-rw-r--r--examples/opengl/overlay_x11/README.X11-OVERLAYS92
-rw-r--r--examples/opengl/overlay_x11/gearwidget.cpp268
-rw-r--r--examples/opengl/overlay_x11/gearwidget.h29
-rw-r--r--examples/opengl/overlay_x11/main.cpp125
-rw-r--r--examples/opengl/overlay_x11/overlay_x11.doc82
-rw-r--r--examples/opengl/overlay_x11/overlayrubber.pro14
-rw-r--r--examples/opengl/overlay_x11/rubberbandwidget.cpp59
-rw-r--r--examples/opengl/overlay_x11/rubberbandwidget.h37
-rw-r--r--examples/opengl/overlay_x11/utilities/NOTICE11
-rw-r--r--examples/opengl/overlay_x11/utilities/README22
-rw-r--r--examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c147
-rw-r--r--examples/opengl/overlay_x11/utilities/sovinfo/sovLayerUtil.h54
-rw-r--r--examples/opengl/overlay_x11/utilities/sovinfo/sovinfo.c95
-rw-r--r--examples/opengl/overlay_x11/utilities/sovinfo/sovlayerutil.c150
-rw-r--r--examples/opengl/sharedbox/README8
-rw-r--r--examples/opengl/sharedbox/glbox.cpp211
-rw-r--r--examples/opengl/sharedbox/glbox.h58
-rw-r--r--examples/opengl/sharedbox/globjwin.cpp99
-rw-r--r--examples/opengl/sharedbox/globjwin.h39
-rw-r--r--examples/opengl/sharedbox/main.cpp42
-rw-r--r--examples/opengl/sharedbox/sharedbox.doc16
-rw-r--r--examples/opengl/sharedbox/sharedbox.pro14
-rw-r--r--examples/opengl/texture/README4
-rw-r--r--examples/opengl/texture/gllogo.bmpbin0 -> 17462 bytes
-rw-r--r--examples/opengl/texture/globjwin.cpp78
-rw-r--r--examples/opengl/texture/globjwin.h32
-rw-r--r--examples/opengl/texture/gltexobj.cpp240
-rw-r--r--examples/opengl/texture/gltexobj.h54
-rw-r--r--examples/opengl/texture/main.cpp42
-rw-r--r--examples/opengl/texture/qtlogo.bmpbin0 -> 17462 bytes
-rw-r--r--examples/opengl/texture/texture.doc10
-rw-r--r--examples/opengl/texture/texture.pro14
-rw-r--r--examples/picture/README5
-rw-r--r--examples/picture/car_orig.picbin0 -> 1872 bytes
-rw-r--r--examples/picture/flag.bmpbin0 -> 2386 bytes
-rw-r--r--examples/picture/picture.cpp130
-rw-r--r--examples/picture/picture.doc17
-rw-r--r--examples/picture/picture.pro10
-rw-r--r--examples/popup/README3
-rw-r--r--examples/popup/popup.cpp132
-rw-r--r--examples/popup/popup.doc23
-rw-r--r--examples/popup/popup.h58
-rw-r--r--examples/popup/popup.pro10
-rw-r--r--examples/process/README8
-rw-r--r--examples/process/process.cpp94
-rw-r--r--examples/process/process.doc20
-rw-r--r--examples/process/process.pro11
-rw-r--r--examples/process/small_dialog.ui197
-rw-r--r--examples/progress/README6
-rw-r--r--examples/progress/progress.cpp337
-rw-r--r--examples/progress/progress.doc17
-rw-r--r--examples/progress/progress.pro10
-rw-r--r--examples/progressbar/main.cpp23
-rw-r--r--examples/progressbar/progressbar.cpp165
-rw-r--r--examples/progressbar/progressbar.doc29
-rw-r--r--examples/progressbar/progressbar.h40
-rw-r--r--examples/progressbar/progressbar.pro11
-rw-r--r--examples/qdir/qdir.cpp359
-rw-r--r--examples/qdir/qdir.doc15
-rw-r--r--examples/qdir/qdir.h98
-rw-r--r--examples/qdir/qdir.pro10
-rw-r--r--examples/qfd/fontdisplayer.cpp155
-rw-r--r--examples/qfd/fontdisplayer.h47
-rw-r--r--examples/qfd/qfd.cpp32
-rw-r--r--examples/qfd/qfd.doc28
-rw-r--r--examples/qfd/qfd.pro10
-rw-r--r--examples/qmag/README6
-rw-r--r--examples/qmag/qmag.cpp389
-rw-r--r--examples/qmag/qmag.doc23
-rw-r--r--examples/qmag/qmag.pro10
-rw-r--r--examples/qtl/qtl-qvaluelist.doc19
-rw-r--r--examples/qtl/qtl.pro7
-rw-r--r--examples/qtl/qvaluelistiterator.cpp57
-rw-r--r--examples/qwerty/ANSI_X3.110-1983.map511
-rw-r--r--examples/qwerty/ANSI_X3.110-1983.txt7
-rw-r--r--examples/qwerty/IBM277.map350
-rw-r--r--examples/qwerty/IBM277.txt1
-rw-r--r--examples/qwerty/eucJP.txt7
-rw-r--r--examples/qwerty/koi8.txt7
-rw-r--r--examples/qwerty/latin1.txt7
-rw-r--r--examples/qwerty/main.cpp37
-rw-r--r--examples/qwerty/msunicode.txtbin0 -> 298 bytes
-rw-r--r--examples/qwerty/qwerty.cpp354
-rw-r--r--examples/qwerty/qwerty.doc27
-rw-r--r--examples/qwerty/qwerty.h58
-rw-r--r--examples/qwerty/qwerty.pro11
-rw-r--r--examples/qwerty/unicode.txtbin0 -> 208 bytes
-rw-r--r--examples/rangecontrols/main.cpp24
-rw-r--r--examples/rangecontrols/rangecontrols.cpp70
-rw-r--r--examples/rangecontrols/rangecontrols.doc28
-rw-r--r--examples/rangecontrols/rangecontrols.h28
-rw-r--r--examples/rangecontrols/rangecontrols.pro11
-rw-r--r--examples/regexptester/main.cpp11
-rw-r--r--examples/regexptester/regexptester.cpp179
-rw-r--r--examples/regexptester/regexptester.doc35
-rw-r--r--examples/regexptester/regexptester.h42
-rw-r--r--examples/regexptester/regexptester.pro5
-rw-r--r--examples/richtext/main.cpp24
-rw-r--r--examples/richtext/marble.pngbin0 -> 25217 bytes
-rw-r--r--examples/richtext/richtext.cpp141
-rw-r--r--examples/richtext/richtext.doc29
-rw-r--r--examples/richtext/richtext.h36
-rw-r--r--examples/richtext/richtext.pro11
-rw-r--r--examples/rot13/rot13.cpp78
-rw-r--r--examples/rot13/rot13.doc23
-rw-r--r--examples/rot13/rot13.h36
-rw-r--r--examples/rot13/rot13.pro10
-rw-r--r--examples/scribble/main.cpp29
-rw-r--r--examples/scribble/scribble.cpp187
-rw-r--r--examples/scribble/scribble.doc30
-rw-r--r--examples/scribble/scribble.h87
-rw-r--r--examples/scribble/scribble.pro11
-rw-r--r--examples/scrollview/README3
-rw-r--r--examples/scrollview/bg.ppm4
-rw-r--r--examples/scrollview/scrollview.cpp441
-rw-r--r--examples/scrollview/scrollview.doc17
-rw-r--r--examples/scrollview/scrollview.pro10
-rw-r--r--examples/showimg/README14
-rw-r--r--examples/showimg/imagefip.cpp61
-rw-r--r--examples/showimg/imagefip.h31
-rw-r--r--examples/showimg/imagetexteditor.cpp141
-rw-r--r--examples/showimg/imagetexteditor.h46
-rw-r--r--examples/showimg/main.cpp56
-rw-r--r--examples/showimg/showimg.cpp672
-rw-r--r--examples/showimg/showimg.doc29
-rw-r--r--examples/showimg/showimg.h93
-rw-r--r--examples/showimg/showimg.pro14
-rw-r--r--examples/sound/sound.cpp102
-rw-r--r--examples/sound/sound.doc24
-rw-r--r--examples/sound/sound.h33
-rw-r--r--examples/sound/sound.pro11
-rw-r--r--examples/sound/sounds/1.wavbin0 -> 8624 bytes
-rw-r--r--examples/sound/sounds/2.wavbin0 -> 7266 bytes
-rw-r--r--examples/sound/sounds/3.wavbin0 -> 4709 bytes
-rw-r--r--examples/sound/sounds/4.wavbin0 -> 5538 bytes
-rw-r--r--examples/splitter/splitter.cpp99
-rw-r--r--examples/splitter/splitter.doc17
-rw-r--r--examples/splitter/splitter.pro10
-rw-r--r--examples/sql/blob/blob.pro11
-rw-r--r--examples/sql/blob/main.cpp106
-rw-r--r--examples/sql/overview/basicbrowsing/README1
-rw-r--r--examples/sql/overview/basicbrowsing/basicbrowsing.pro9
-rw-r--r--examples/sql/overview/basicbrowsing/main.cpp35
-rw-r--r--examples/sql/overview/basicbrowsing2/README1
-rw-r--r--examples/sql/overview/basicbrowsing2/basicbrowsing2.pro9
-rw-r--r--examples/sql/overview/basicbrowsing2/main.cpp43
-rw-r--r--examples/sql/overview/basicdatamanip/README1
-rw-r--r--examples/sql/overview/basicdatamanip/basicdatamanip.pro9
-rw-r--r--examples/sql/overview/basicdatamanip/main.cpp40
-rw-r--r--examples/sql/overview/connect1/README1
-rw-r--r--examples/sql/overview/connect1/connect1.pro9
-rw-r--r--examples/sql/overview/connect1/main.cpp31
-rw-r--r--examples/sql/overview/connection.cpp50
-rw-r--r--examples/sql/overview/connection.h24
-rw-r--r--examples/sql/overview/create_connections/README1
-rw-r--r--examples/sql/overview/create_connections/create_connections.pro9
-rw-r--r--examples/sql/overview/create_connections/main.cpp26
-rw-r--r--examples/sql/overview/custom1/custom1.pro8
-rw-r--r--examples/sql/overview/custom1/main.cpp109
-rw-r--r--examples/sql/overview/custom1/main.h52
-rw-r--r--examples/sql/overview/delete/README1
-rw-r--r--examples/sql/overview/delete/delete.pro9
-rw-r--r--examples/sql/overview/delete/main.cpp29
-rw-r--r--examples/sql/overview/extract/README1
-rw-r--r--examples/sql/overview/extract/extract.pro9
-rw-r--r--examples/sql/overview/extract/main.cpp41
-rw-r--r--examples/sql/overview/form1/form1.pro8
-rw-r--r--examples/sql/overview/form1/main.cpp69
-rw-r--r--examples/sql/overview/form2/form2.pro8
-rw-r--r--examples/sql/overview/form2/main.cpp77
-rw-r--r--examples/sql/overview/form2/main.h33
-rw-r--r--examples/sql/overview/insert/README1
-rw-r--r--examples/sql/overview/insert/insert.pro9
-rw-r--r--examples/sql/overview/insert/main.cpp37
-rw-r--r--examples/sql/overview/insert2/insert2.pro9
-rw-r--r--examples/sql/overview/insert2/main.cpp29
-rw-r--r--examples/sql/overview/navigating/README1
-rw-r--r--examples/sql/overview/navigating/main.cpp33
-rw-r--r--examples/sql/overview/navigating/navigating.pro9
-rw-r--r--examples/sql/overview/order1/README1
-rw-r--r--examples/sql/overview/order1/main.cpp32
-rw-r--r--examples/sql/overview/order1/order1.pro9
-rw-r--r--examples/sql/overview/order2/README1
-rw-r--r--examples/sql/overview/order2/main.cpp34
-rw-r--r--examples/sql/overview/order2/order2.pro9
-rw-r--r--examples/sql/overview/overview.pro33
-rw-r--r--examples/sql/overview/retrieve1/README1
-rw-r--r--examples/sql/overview/retrieve1/main.cpp30
-rw-r--r--examples/sql/overview/retrieve1/retrieve1.pro9
-rw-r--r--examples/sql/overview/retrieve2/README1
-rw-r--r--examples/sql/overview/retrieve2/main.cpp30
-rw-r--r--examples/sql/overview/retrieve2/retrieve2.pro9
-rw-r--r--examples/sql/overview/subclass1/main.cpp38
-rw-r--r--examples/sql/overview/subclass1/subclass1.pro8
-rw-r--r--examples/sql/overview/subclass2/main.cpp42
-rw-r--r--examples/sql/overview/subclass2/main.h23
-rw-r--r--examples/sql/overview/subclass2/subclass2.pro8
-rw-r--r--examples/sql/overview/subclass3/main.cpp57
-rw-r--r--examples/sql/overview/subclass3/main.h25
-rw-r--r--examples/sql/overview/subclass3/subclass3.pro8
-rw-r--r--examples/sql/overview/subclass4/main.cpp81
-rw-r--r--examples/sql/overview/subclass4/main.h25
-rw-r--r--examples/sql/overview/subclass4/subclass4.pro8
-rw-r--r--examples/sql/overview/subclass5/main.cpp94
-rw-r--r--examples/sql/overview/subclass5/main.h25
-rw-r--r--examples/sql/overview/subclass5/subclass5.pro8
-rw-r--r--examples/sql/overview/table1/main.cpp31
-rw-r--r--examples/sql/overview/table1/table1.pro8
-rw-r--r--examples/sql/overview/table2/main.cpp41
-rw-r--r--examples/sql/overview/table2/table2.pro8
-rw-r--r--examples/sql/overview/table3/main.cpp90
-rw-r--r--examples/sql/overview/table3/main.h40
-rw-r--r--examples/sql/overview/table3/table3.pro8
-rw-r--r--examples/sql/overview/table4/main.cpp109
-rw-r--r--examples/sql/overview/table4/main.h53
-rw-r--r--examples/sql/overview/table4/table4.pro8
-rw-r--r--examples/sql/overview/update/README1
-rw-r--r--examples/sql/overview/update/main.cpp32
-rw-r--r--examples/sql/overview/update/update.pro9
-rw-r--r--examples/sql/sql.pro9
-rw-r--r--examples/sql/sqltable/README18
-rw-r--r--examples/sql/sqltable/main.cpp71
-rw-r--r--examples/sql/sqltable/sqltable.doc24
-rw-r--r--examples/sql/sqltable/sqltable.pro10
-rw-r--r--examples/tabdialog/main.cpp26
-rw-r--r--examples/tabdialog/tabdialog.cpp110
-rw-r--r--examples/tabdialog/tabdialog.doc31
-rw-r--r--examples/tabdialog/tabdialog.h34
-rw-r--r--examples/tabdialog/tabdialog.pro11
-rw-r--r--examples/table/bigtable/bigtable.doc19
-rw-r--r--examples/table/bigtable/bigtable.pro10
-rw-r--r--examples/table/bigtable/main.cpp63
-rw-r--r--examples/table/small-table-demo/main.cpp57
-rw-r--r--examples/table/small-table-demo/qtlogo.xpm123
-rw-r--r--examples/table/small-table-demo/small-table-demo.doc15
-rw-r--r--examples/table/small-table-demo/small-table-demo.pro10
-rw-r--r--examples/table/statistics/main.cpp20
-rw-r--r--examples/table/statistics/statistics.cpp171
-rw-r--r--examples/table/statistics/statistics.doc27
-rw-r--r--examples/table/statistics/statistics.h52
-rw-r--r--examples/table/statistics/statistics.pro10
-rw-r--r--examples/tablet/canvas.cpp178
-rw-r--r--examples/tablet/canvas.h65
-rw-r--r--examples/tablet/main.cpp35
-rw-r--r--examples/tablet/scribble.cpp134
-rw-r--r--examples/tablet/scribble.h49
-rw-r--r--examples/tablet/tablet.doc11
-rw-r--r--examples/tablet/tablet.pro12
-rw-r--r--examples/tablet/tabletstats.cpp194
-rw-r--r--examples/tablet/tabletstats.h70
-rw-r--r--examples/tablet/tabletstatsbase.ui298
-rw-r--r--examples/tetrix/README28
-rw-r--r--examples/tetrix/gtetrix.cpp502
-rw-r--r--examples/tetrix/gtetrix.h92
-rw-r--r--examples/tetrix/qdragapp.cpp502
-rw-r--r--examples/tetrix/qdragapp.h31
-rw-r--r--examples/tetrix/qtetrix.cpp176
-rw-r--r--examples/tetrix/qtetrix.h74
-rw-r--r--examples/tetrix/qtetrixb.cpp241
-rw-r--r--examples/tetrix/qtetrixb.h69
-rw-r--r--examples/tetrix/tetrix.cpp24
-rw-r--r--examples/tetrix/tetrix.doc15
-rw-r--r--examples/tetrix/tetrix.pro19
-rw-r--r--examples/tetrix/tpiece.cpp180
-rw-r--r--examples/tetrix/tpiece.h50
-rw-r--r--examples/textedit/editcopy.xpm36
-rw-r--r--examples/textedit/editcut.xpm32
-rw-r--r--examples/textedit/editpaste.xpm36
-rw-r--r--examples/textedit/editredo.xpm36
-rw-r--r--examples/textedit/editundo.xpm36
-rw-r--r--examples/textedit/example.html24
-rw-r--r--examples/textedit/filenew.xpm36
-rw-r--r--examples/textedit/fileopen.xpm36
-rw-r--r--examples/textedit/fileprint.xpm117
-rw-r--r--examples/textedit/filesave.xpm36
-rw-r--r--examples/textedit/main.cpp22
-rw-r--r--examples/textedit/textbold.xpm27
-rw-r--r--examples/textedit/textcenter.xpm27
-rw-r--r--examples/textedit/textedit.cpp455
-rw-r--r--examples/textedit/textedit.doc18
-rw-r--r--examples/textedit/textedit.h82
-rw-r--r--examples/textedit/textedit.pro11
-rw-r--r--examples/textedit/textitalic.xpm27
-rw-r--r--examples/textedit/textjustify.xpm27
-rw-r--r--examples/textedit/textleft.xpm27
-rw-r--r--examples/textedit/textright.xpm27
-rw-r--r--examples/textedit/textunder.xpm27
-rw-r--r--examples/themes/fileopen.xpm22
-rw-r--r--examples/themes/main.cpp28
-rw-r--r--examples/themes/marble.xpm470
-rw-r--r--examples/themes/metal.cpp486
-rw-r--r--examples/themes/metal.h72
-rw-r--r--examples/themes/metal.xpm130
-rw-r--r--examples/themes/qtlogo.pngbin0 -> 12615 bytes
-rw-r--r--examples/themes/stone1.xpm353
-rw-r--r--examples/themes/stonebright.xpm353
-rw-r--r--examples/themes/stonedark.xpm353
-rw-r--r--examples/themes/themes.cpp164
-rw-r--r--examples/themes/themes.doc55
-rw-r--r--examples/themes/themes.h38
-rw-r--r--examples/themes/themes.pro31
-rw-r--r--examples/themes/trolltech.gifbin0 -> 12168 bytes
-rw-r--r--examples/themes/wood.cpp1414
-rw-r--r--examples/themes/wood.h90
-rw-r--r--examples/thread/prodcons/prodcons.cpp409
-rw-r--r--examples/thread/prodcons/prodcons.pro9
-rw-r--r--examples/thread/semaphores/main.cpp274
-rw-r--r--examples/thread/semaphores/semaphores.pro10
-rw-r--r--examples/tictac/README7
-rw-r--r--examples/tictac/main.cpp30
-rw-r--r--examples/tictac/tictac.cpp375
-rw-r--r--examples/tictac/tictac.doc33
-rw-r--r--examples/tictac/tictac.h107
-rw-r--r--examples/tictac/tictac.pro11
-rw-r--r--examples/tooltip/README8
-rw-r--r--examples/tooltip/main.cpp23
-rw-r--r--examples/tooltip/tooltip.cpp116
-rw-r--r--examples/tooltip/tooltip.doc33
-rw-r--r--examples/tooltip/tooltip.h43
-rw-r--r--examples/tooltip/tooltip.pro11
-rw-r--r--examples/toplevel/main.cpp9
-rw-r--r--examples/toplevel/options.ui587
-rw-r--r--examples/toplevel/options.ui.h98
-rw-r--r--examples/toplevel/toplevel.doc132
-rw-r--r--examples/toplevel/toplevel.pro14
-rw-r--r--examples/tux/tux.cpp71
-rw-r--r--examples/tux/tux.pngbin0 -> 13849 bytes
-rw-r--r--examples/tux/tux.pro10
-rw-r--r--examples/widgets/README1
-rw-r--r--examples/widgets/main.cpp51
-rw-r--r--examples/widgets/qt.pngbin0 -> 336 bytes
-rw-r--r--examples/widgets/trolltech.gifbin0 -> 42629 bytes
-rw-r--r--examples/widgets/tt-logo.pngbin0 -> 2850 bytes
-rw-r--r--examples/widgets/widgets.cpp751
-rw-r--r--examples/widgets/widgets.doc15
-rw-r--r--examples/widgets/widgets.h114
-rw-r--r--examples/widgets/widgets.pro11
-rw-r--r--examples/wizard/main.cpp20
-rw-r--r--examples/wizard/wizard.cpp226
-rw-r--r--examples/wizard/wizard.doc29
-rw-r--r--examples/wizard/wizard.h44
-rw-r--r--examples/wizard/wizard.pro11
-rw-r--r--examples/xform/README1
-rw-r--r--examples/xform/aticatac.cppbin0 -> 6346 bytes
-rw-r--r--examples/xform/image.anybin0 -> 12414 bytes
-rw-r--r--examples/xform/picture.anybin0 -> 545 bytes
-rw-r--r--examples/xform/xform.cpp507
-rw-r--r--examples/xform/xform.doc17
-rw-r--r--examples/xform/xform.pro10
-rw-r--r--examples/xml/outliner/main.cpp22
-rw-r--r--examples/xml/outliner/outliner.doc40
-rw-r--r--examples/xml/outliner/outliner.pro11
-rw-r--r--examples/xml/outliner/outlinetree.cpp103
-rw-r--r--examples/xml/outliner/outlinetree.h30
-rw-r--r--examples/xml/outliner/todos.opml55
-rw-r--r--examples/xml/tagreader-with-features/fnord.xml13
-rw-r--r--examples/xml/tagreader-with-features/structureparser.cpp56
-rw-r--r--examples/xml/tagreader-with-features/structureparser.h29
-rw-r--r--examples/xml/tagreader-with-features/tagreader-with-features.pro11
-rw-r--r--examples/xml/tagreader-with-features/tagreader.cpp74
-rw-r--r--examples/xml/tagreader-with-features/tagreader.doc40
-rw-r--r--examples/xml/tagreader/animals.xml7
-rw-r--r--examples/xml/tagreader/structureparser.cpp34
-rw-r--r--examples/xml/tagreader/structureparser.h29
-rw-r--r--examples/xml/tagreader/tagreader.cpp30
-rw-r--r--examples/xml/tagreader/tagreader.doc35
-rw-r--r--examples/xml/tagreader/tagreader.pro11
1063 files changed, 79334 insertions, 0 deletions
diff --git a/examples/README b/examples/README
new file mode 100644
index 000000000..eaf566bf5
--- /dev/null
+++ b/examples/README
@@ -0,0 +1,416 @@
+This examples directory contains lots of Qt examples. And there are
+additional examples in ../tools/designer/examples/ and in the
+extensions subdirectories. The documentation contains two detailed Qt
+tutorials and additional tutorials for Qt Designer. The examples here
+are useful for learning particular Qt classes and techniques, but to
+learn Qt itself we recommend starting with the documentation's short
+"How to Learn Qt" document.
+
+It is best to run each example from its own directory since some of
+them assume they are run from there.
+
+
+aclock
+ This example displays an analog clock widget.
+ It shows how to create a custom widget (QWidget subclass) and how
+ to create a timer using QTimer.
+
+action
+ A single document interface application example with a menu bar,
+ tool bar and status bar that provides simple text editing.
+ It shows how to implement a typical modern application, how to
+ create a QMainWindow subclass, and how to create actions that can
+ be assigned to menus (QPopupMenu) and toolbars (QToolBar) using
+ QAction. It also shows how to print using QSimpleRichText.
+
+addressbook [obsolete]
+
+application [obsolete; see the action example instead]
+
+biff [Unix-specific]
+ Biff is a simple graphical program to indicate whether there is
+ new mail; it looks like xbiff but is much shorter.
+
+buttongroups
+ This examples shows different types of group boxes (QButtonGroup,
+ and QGroupBox), and different kinds of buttons (QCheckBox,
+ QRadioButton, and QPushButton). It also shows how to add a
+ QPopupMenu to a button.
+
+canvas
+ This examples demonstrates many of QCanvasView's facilities, but
+ by no means all of them. It uses QCanvasItem, QCanvasLine,
+ QCanvasRectangle, QCanvasEllipse, QCanvasSprite, and of course
+ QCanvas.
+
+chart
+ An application for maintaining simple numeric data and visualising
+ the data using pie and bar charts.
+ Tutorial #2 explains this application in detail.
+
+checklists
+ Shows two list views with check box and radio button items. (These
+ kinds of lists are often used with setup programs.)
+ Shows the use of QListView, QListViewItem, QCheckListItem,
+ QListViewItemIterator, and QValueList.
+
+cursor
+ This example shows how to set the mouse cursor for a widget. Shows
+ Qt's cursors and a custom cursor using QLabel and QCursor.
+
+customlayout
+ This examples demonstrates how to write a customized layout
+ (geometry) manager, like a Card-Layout, Border-Layout and
+ Flow-Layout.
+
+dclock
+ This example displays a digital LCD clock and can switch between
+ time and date.
+ It uses the QLCDNumber widget and a couple of QTimers.
+
+demo
+ Run this to see almost all of Qt's widgets in action, including
+ drag and drop, 2D graphics, etc.
+
+desktop
+ The desktop demo contains three routines, each of which draws
+ something on the desktop. It does some nice stuff with QPainter,
+ and also demonstrates how one can treat the desktop as a widget
+ like any other.
+
+directpainter [Qt/Embedded-specific]
+ Shows the use of QDirectPainter.
+
+dirview
+ This example program demonstrates how to use a QListView and
+ QListViewItems to build a multi-column hierarchical, memory- and
+ CPU-efficient directory browser. It also demonstrates how to use
+ Drag'n'Drop in a QListview. (See also the fileiconview example.)
+
+distributor
+ This is a utility program that can be used to modify the paths
+ used in the Qt library binary to make the binary suitable for
+ distribution. For experts only.
+
+dragdrop
+ Demonstrates image and text drag and drop.
+
+drawdemo
+ Draws a color wheel, text and shapes. This example demonstrates
+ several drawing functions and printer output using QPainter,
+ QWMatrix, QFont, QFontMetrics, QColor, QBrush, and QPrinter. You
+ can easily add you own drawing functions. See "ourDrawFunctions".
+
+drawlines
+ This example shows very simple mouse-based user interaction and
+ painting without any world transform matrix or other advanced
+ features. Run the program, click the button, move the mouse,
+ release the button, and watch the lines get drawn.
+
+extension
+ An extension dialog with simple and advanced appearances
+ controlled by a toggle button.
+
+fileiconview
+ This example partially implements a very basic file manager using
+ a widget derived from QIconView to display the current directory.
+ It uses the DirectoryView widget from the dirview example to
+ display the directory tree.
+ It also shows how to add a QComboBox to a QToolBar and how to
+ implement a context menu using QPopupMenu.
+
+fonts [obsolete; see the qfd example instead]
+
+forever
+ WARNING: this program has a strobe effect.
+ See how fast Qt can draw colored rectangles. This example
+ continuously draws rectangles in a window and has another widget
+ that counts the number of rectangles that are drawn per second.
+
+gridview
+ A QGridView with 100x100 cells.
+
+hello
+ Hello world with colored animated wavy text.
+
+helpdemo
+ Shows how to use Qt Assistant as an application's online help
+ tool. (See also the helpsystem example.)
+
+helpsystem
+ This example shows how to implement context-sensitive help in
+ various ways in a Qt application using QToolTip, QWhatsThis, and
+ QAssistantClient to control Qt Assistant.
+
+helpviewer
+ The HelpViewer example implements a simple HTML help browser using
+ Qt's richtext capabilities.
+
+i18n
+ This example shows how to internationalize applications. Start it with
+ ./i18n en
+ to run the application in English, and with
+ ./i18n de
+ to run it in German. Other languages are also available including,
+ Arabic (ar), French (fr), Italian (it), Japanese (jp), Korean
+ (ko), Norwegian (no), and Russian (ru). Some languages depend on
+ the availability of suitable fonts.
+
+iconview
+ This example implements a flexible icon view which can store lots
+ of icon items. It supports Drag'n'Drop and different selection
+ modes using QIconView.
+
+kiosk [Qt/Embedded-specific]
+ An MPEG player.
+
+launcher [Qt/Embedded-specific]
+ A program launcher.
+
+layout [obsolete]
+ This example shows simple and intermediate use of Qt's layout
+ classes, QGridLaout, QBoxLayout etc.
+
+life
+ An implementation of the life game with a Unix-flavor GUI.
+
+lineedits
+ This example shows how to use various properties of QLineEdit
+ including echo modes, input masks, and validators.
+
+listbox
+ Shows QListBox options.
+
+listboxcombo
+ This example shows how to use QListBox (with single selection and
+ multi selection) and QComboBox (editable and non-editable).
+
+listviews
+ This examples shows how to work with QListView (a tree view
+ widget)
+
+mdi
+ Similar to the action example, but this time using MDI (Multiple
+ Document Interface). It subclasses QMainWindow and uses the
+ QWorkspace class to provide MDI and shows how to implement an MDI
+ Window menu.
+
+menu
+ This example demonstrates the simple use of menus (a menu bar and
+ pull-down menus), and a context menu. (See also the popup
+ example.)
+
+movies
+ The Movies example displays animated GIF files using the QMovie
+ and QLabel classes.
+
+network/archivesearch
+ Shows how to use QHttp to request and receive data from a web
+ site.
+
+network/clientserver
+ Provides a client application and a server application that
+ communicate using QSocket and QServerSocket.
+
+network/ftpclient
+ A simple FTP client that uses QFtp to retrieve directory listings
+ and to download and upload files.
+
+network/httpd
+ An extremely simple HTTP daemon built using QServerSocket.
+
+network/infoprotocol
+ A more complex client/server example.
+
+network/mail
+ A simple mail client that can send email using the QSocket class.
+
+network/networkprotocol
+ A simple implementation of a subset of the NNTP protocol. This
+ shows how to implement your own network protocols by subclassing
+ QNetworkProtocol.
+
+network/remotecontrol
+ Controlling one application from another using QSocket-based IPC.
+
+opengl/box
+ Shows how to use OpenGL in Qt using QGLWidget.
+
+opengl/gear
+ Shows how to build OpenGL display lists.
+
+opengl/glpixmap
+ This is based on the box example. It shows how to render an OpenGL
+ scene into a QPixmap.
+
+opengl/overlay
+ Demonstrates the use of OpenGL overlays (where supported).
+
+opengl/sharedbox
+ Demonstrates how to share OpenGL display lists with QGLWidgets.
+
+opengl/texture
+ Shows how to use OpenGL textures.
+
+picture
+ This example shows how to make, store to file, and read back, a
+ picture as a set of vector drawing commands.
+
+popup
+ This examples shows how to implement popup widgets.
+
+process
+ Shows how to execute a non-GUI application in a separate process
+ with I/O redirection.
+
+progress
+ WARNING: this program has a strobe effect.
+ This example presents a long-running process (drawing lots of
+ rectangles) and a QProgressDialog. Two types of progress dialog
+ are offered, one that simply shows text, and a custom one that
+ shows an animation using a QLabel and a QTimer.
+
+progressbar
+ Shows how to use a QProgressBar.
+
+qdir
+ Shows how to use and customize QFileDialog. Run
+ qdir --help
+ for details. Also shows QFileInfo.
+
+qfd
+ This example program displays all the characters of a selected
+ font. It shows the use of QFontDialog, QFontMetrics and QFontInfo,
+ and a QTable subclass.
+
+qmag
+ This is a simple magnifier-type program. It shows how one can do
+ some tquite low-level operations portably using Qt.
+
+qwerty
+ Simple text editor for testing different character encodings.
+
+rangecontrols
+ This examples shows how to use QSpinBox and QSlider.
+
+regexptester
+ This little application is useful for testing regular expressions.
+
+richtext
+ This example shows the use of QTextView (a read/only QTextEdit
+ subclass).
+
+rot13
+ A simple implementation of the rot13 algorithm.
+
+scribble
+ An implementation of the well known scribble program. You can draw
+ with different pen colors and widths and save the result as a
+ pixmap in various formats. It shows how to do drawing using a
+ QWidget subclass (rather than a QCanvas for example). It also
+ shows how to add a QSpinBox to a QToolBar and how to implement a
+ button that pops up a menu (using QPushButton and QPopupMenu), and
+ also how to use the QColorDialog.
+
+scrollview
+ This example shows one way of using a QScrollview. This widget is
+ highly optimized for showing very large contents including child
+ widgets.
+
+showimg
+ This example reads and displays an image in any supported image
+ format (GIF, BMP, PPM, XMP, etc.)
+
+sound
+ Shows how to play sounds from a Qt application (and how to see if
+ sound is supported) using QSound.
+
+splitter
+ This example shows how to use QSplitter to give the user control
+ over how much vertical or horizontal space is given to child
+ widgets.
+
+sql/blob
+ Shows how to connect to a database and how to write to and read
+ BLOB fields (for those databases that support BLOBs).
+
+sql/overview [to be withdrawn]
+ This is just a series of tiny examples used by the SQL module
+ overview (sql.html).
+
+sql/sqltable
+ A very simple example that shows how to relate a database table to
+ a QDataTable.
+
+tabdialog
+ This example shows how to use a dialog with multiple tabs (pages).
+ It shows the use of QTabDialog and QFileInfo.
+
+table/bigtable
+ This shows how to create a sparse very large (1M x 1M cells)
+ QTable by avoiding the use of table items.
+
+table/small-table-demo
+ A small, simple QTable example that uses QTableItems to show text
+ and pixmaps, and QComboTableItems and QCheckTableItems to show how
+ they work.
+
+table/statistics
+ A QTable example that shows how to subclass QTableItem.
+
+tablet
+ This shows how to interact with a tablet device. It will only run
+ if a compatible tablet is installed.
+
+tetrix
+ This is the Qt implementation of the well known game Tetris, but
+ with an unusual twist, not to mention a comment that's almost a
+ work of art.
+
+textedit
+ A simple text editor based on QTextEdit.
+
+themes
+ This examples demonstrates how to draw widgets in different styles
+ (themes). Example themes looking like wood and metal are
+ implemented. You can switch between the different styles at
+ runtime using the menu. Shows how to create a QStyle subclass. Not
+ for the faint-hearted.
+
+tictac
+ This is an implementation of the Tic-Tac-Toe game.
+
+tooltip
+ This example widget demonstrates how to use tool tips for static
+ and dynamic regions within a widget using a QToolTip subclass.
+
+toplevel
+ This program allows you to set all the flags for a widget and then
+ displays the widget using the flags.
+
+trayicon [work in progress]
+
+tux
+ Shows how to create a non-rectangular window.
+
+widgets
+ Shows many Qt widgets (See also the demo example).
+
+wizard
+ This example shows how to use QWizard.
+
+xform
+ Demonstrates how to arbitrarily rotate, shear and scale text and
+ graphics using QWMatrix.
+
+xml/outliner
+ Shows how to read in an XML file using Qt's DOM classes and
+ display the data in a list view.
+
+xml/tagreader
+ Shows how to read an XML file using Qt's SAX classes.
+
+xml/tagreader-with-features
+ Shows how to read an XML file using Qt's SAX classes, and displays
+ the data showing the effects of different feature settings.
+
diff --git a/examples/aclock/README b/examples/aclock/README
new file mode 100644
index 000000000..82857aedb
--- /dev/null
+++ b/examples/aclock/README
@@ -0,0 +1,5 @@
+The aclock program displays an analog clock widget.
+
+See also the dclock sample that displays a digital LCD clock and can
+switch between time and date.
+
diff --git a/examples/aclock/aclock.cpp b/examples/aclock/aclock.cpp
new file mode 100644
index 000000000..5c6a88882
--- /dev/null
+++ b/examples/aclock/aclock.cpp
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "aclock.h"
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qbitmap.h>
+
+//
+// Constructs an analog clock widget that uses an internal TQTimer.
+//
+
+AnalogClock::AnalogClock( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ time = TQTime::currentTime(); // get current time
+ internalTimer = new TQTimer( this ); // create internal timer
+ connect( internalTimer, SIGNAL(timeout()), SLOT(timeout()) );
+ internalTimer->start( 5000 ); // emit signal every 5 seconds
+}
+
+void AnalogClock::mousePressEvent( TQMouseEvent *e )
+{
+ if(isTopLevel())
+ clickPos = e->pos() + TQPoint(geometry().topLeft() - frameGeometry().topLeft());
+}
+
+void AnalogClock::mouseMoveEvent( TQMouseEvent *e )
+{
+ if(isTopLevel())
+ move( e->globalPos() - clickPos );
+}
+
+//
+// The TQTimer::timeout() signal is received by this slot.
+//
+
+//
+// When we set an explicit time we don't want the timeout() slot to be
+// called anymore as this relies on currentTime()
+//
+void AnalogClock::setTime( const TQTime & t )
+{
+ time = t;
+ disconnect( internalTimer, SIGNAL(timeout()), this, SLOT(timeout()) );
+ if (autoMask())
+ updateMask();
+ else
+ update();
+}
+
+
+void AnalogClock::timeout()
+{
+ TQTime old_time = time;
+ time = TQTime::currentTime();
+ if ( old_time.minute() != time.minute()
+ || old_time.hour() != time.hour() ) { // minute or hour has changed
+ if (autoMask())
+ updateMask();
+ else
+ update();
+ }
+}
+
+
+void AnalogClock::paintEvent( TQPaintEvent * )
+{
+ if ( autoMask() )
+ return;
+ TQPainter paint( this );
+ paint.setBrush( colorGroup().foreground() );
+ drawClock( &paint );
+}
+
+// If the clock is transparent, we use updateMask()
+// instead of paintEvent()
+
+void AnalogClock::updateMask() // paint clock mask
+{
+ TQBitmap bm( size() );
+ bm.fill( color0 ); //transparent
+
+ TQPainter paint;
+ paint.begin( &bm, this );
+ paint.setBrush( color1 ); // use non-transparent color
+ paint.setPen( color1 );
+
+ drawClock( &paint );
+
+ paint.end();
+ setMask( bm );
+}
+
+//
+// The clock is painted using a 1000x1000 square coordinate system, in
+// the a centered square, as big as possible. The painter's pen and
+// brush colors are used.
+//
+void AnalogClock::drawClock( TQPainter *paint )
+{
+ paint->save();
+
+ paint->setWindow( -500,-500, 1000,1000 );
+
+ TQRect v = paint->viewport();
+ int d = TQMIN( v.width(), v.height() );
+ paint->setViewport( v.left() + (v.width()-d)/2,
+ v.top() + (v.height()-d)/2, d, d );
+
+ TQPointArray pts;
+
+ paint->save();
+ paint->rotate( 30*(time.hour()%12-3) + time.minute()/2 );
+ pts.setPoints( 4, -20,0, 0,-20, 300,0, 0,20 );
+ paint->drawConvexPolygon( pts );
+ paint->restore();
+
+ paint->save();
+ paint->rotate( (time.minute()-15)*6 );
+ pts.setPoints( 4, -10,0, 0,-10, 400,0, 0,10 );
+ paint->drawConvexPolygon( pts );
+ paint->restore();
+
+ for ( int i=0; i<12; i++ ) {
+ paint->drawLine( 440,0, 460,0 );
+ paint->rotate( 30 );
+ }
+
+ paint->restore();
+}
+
+
+void AnalogClock::setAutoMask(bool b)
+{
+ if (b)
+ setBackgroundMode( PaletteForeground );
+ else
+ setBackgroundMode( PaletteBackground );
+ TQWidget::setAutoMask(b);
+}
diff --git a/examples/aclock/aclock.doc b/examples/aclock/aclock.doc
new file mode 100644
index 000000000..c45fd242b
--- /dev/null
+++ b/examples/aclock/aclock.doc
@@ -0,0 +1,28 @@
+/*
+*/
+/*! \page aclock-example.html
+
+ \ingroup examples
+ \title Analog Clock
+
+ This example displays an analog clock widget.
+
+ <hr>
+
+ Header file:
+
+ \include aclock/aclock.h
+
+ <hr>
+
+ Implementation:
+
+ \include aclock/aclock.cpp
+
+ <hr>
+
+ Main:
+
+ \include aclock/main.cpp
+*/
+
diff --git a/examples/aclock/aclock.h b/examples/aclock/aclock.h
new file mode 100644
index 000000000..dcd5728d2
--- /dev/null
+++ b/examples/aclock/aclock.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef ACLOCK_H
+#define ACLOCK_H
+
+#include <qwidget.h>
+#include <qdatetime.h>
+
+class TQTimer;
+class AnalogClock : public TQWidget // analog clock widget
+{
+ Q_OBJECT
+public:
+ AnalogClock( TQWidget *parent=0, const char *name=0 );
+ void setAutoMask(bool b);
+
+protected:
+ void updateMask();
+ void paintEvent( TQPaintEvent *);
+ void mousePressEvent( TQMouseEvent *);
+ void mouseMoveEvent( TQMouseEvent *);
+ void drawClock( TQPainter* );
+
+private slots:
+ void timeout();
+
+public slots:
+ void setTime( const TQTime & t );
+
+private:
+ TQPoint clickPos;
+ TQTime time;
+ TQTimer *internalTimer;
+};
+
+
+#endif // ACLOCK_H
diff --git a/examples/aclock/aclock.pro b/examples/aclock/aclock.pro
new file mode 100644
index 000000000..0b3b0123a
--- /dev/null
+++ b/examples/aclock/aclock.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = aclock
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = aclock.h
+SOURCES = aclock.cpp \
+ main.cpp
diff --git a/examples/aclock/main.cpp b/examples/aclock/main.cpp
new file mode 100644
index 000000000..374e468bf
--- /dev/null
+++ b/examples/aclock/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "aclock.h"
+#include <qapplication.h>
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ AnalogClock *clock = new AnalogClock;
+ if ( argc == 2 && strcmp( argv[1], "-transparent" ) == 0 )
+ clock->setAutoMask( TRUE );
+ clock->resize( 100, 100 );
+ a.setMainWidget( clock );
+ clock->setCaption("TQt Example - Analog Clock");
+ clock->show();
+ int result = a.exec();
+ delete clock;
+ return result;
+}
diff --git a/examples/action/action.pro b/examples/action/action.pro
new file mode 100644
index 000000000..e780f7451
--- /dev/null
+++ b/examples/action/action.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = action
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = application.h
+SOURCES = application.cpp \
+ main.cpp
diff --git a/examples/action/application.cpp b/examples/action/application.cpp
new file mode 100644
index 000000000..23a3a8755
--- /dev/null
+++ b/examples/action/application.cpp
@@ -0,0 +1,306 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "application.h"
+
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qtextedit.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qprinter.h>
+#include <qapplication.h>
+#include <qaccel.h>
+#include <qtextstream.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qwhatsthis.h>
+#include <qaction.h>
+#include <qsimplerichtext.h>
+
+#include "filesave.xpm"
+#include "fileopen.xpm"
+#include "fileprint.xpm"
+
+
+ApplicationWindow::ApplicationWindow()
+ : TQMainWindow( 0, "example application main window", WDestructiveClose )
+{
+ printer = new TQPrinter( TQPrinter::HighResolution );
+
+ TQAction * fileNewAction;
+ TQAction * fileOpenAction;
+ TQAction * fileSaveAction, * fileSaveAsAction, * filePrintAction;
+ TQAction * fileCloseAction, * fileQuitAction;
+
+ fileNewAction = new TQAction( "&New", CTRL+Key_N, this, "new" );
+ connect( fileNewAction, SIGNAL( activated() ) , this,
+ SLOT( newDoc() ) );
+
+ fileOpenAction = new TQAction( TQPixmap( fileopen ), "&Open...",
+ CTRL+Key_O, this, "open" );
+ connect( fileOpenAction, SIGNAL( activated() ) , this, SLOT( choose() ) );
+
+ const char * fileOpenText = "<p><img source=\"fileopen\"> "
+ "Click this button to open a <em>new file</em>. <br>"
+ "You can also select the <b>Open</b> command "
+ "from the <b>File</b> menu.</p>";
+ TQMimeSourceFactory::defaultFactory()->setPixmap( "fileopen",
+ fileOpenAction->iconSet().pixmap() );
+ fileOpenAction->setWhatsThis( fileOpenText );
+
+ fileSaveAction = new TQAction( TQPixmap( filesave ),
+ "&Save", CTRL+Key_S, this, "save" );
+ connect( fileSaveAction, SIGNAL( activated() ) , this, SLOT( save() ) );
+
+ const char * fileSaveText = "<p>Click this button to save the file you "
+ "are editing. You will be prompted for a file name.\n"
+ "You can also select the <b>Save</b> command "
+ "from the <b>File</b> menu.</p>";
+ fileSaveAction->setWhatsThis( fileSaveText );
+
+ fileSaveAsAction = new TQAction( "Save File As", "Save &As...", 0, this,
+ "save as" );
+ connect( fileSaveAsAction, SIGNAL( activated() ) , this,
+ SLOT( saveAs() ) );
+ fileSaveAsAction->setWhatsThis( fileSaveText );
+
+ filePrintAction = new TQAction( "Print File", TQPixmap( fileprint ),
+ "&Print...", CTRL+Key_P, this, "print" );
+ connect( filePrintAction, SIGNAL( activated() ) , this,
+ SLOT( print() ) );
+
+ const char * filePrintText = "Click this button to print the file you "
+ "are editing.\n You can also select the Print "
+ "command from the File menu.";
+ filePrintAction->setWhatsThis( filePrintText );
+
+ fileCloseAction = new TQAction( "Close", "&Close", CTRL+Key_W, this,
+ "close" );
+ connect( fileCloseAction, SIGNAL( activated() ) , this,
+ SLOT( close() ) );
+
+ fileQuitAction = new TQAction( "Quit", "&Quit", CTRL+Key_Q, this,
+ "tquit" );
+ connect( fileQuitAction, SIGNAL( activated() ) , qApp,
+ SLOT( closeAllWindows() ) );
+
+ // populate a tool bar with some actions
+
+ TQToolBar * fileTools = new TQToolBar( this, "file operations" );
+ fileTools->setLabel( "File Operations" );
+ fileOpenAction->addTo( fileTools );
+ fileSaveAction->addTo( fileTools );
+ filePrintAction->addTo( fileTools );
+ (void)TQWhatsThis::whatsThisButton( fileTools );
+
+
+ // populate a menu with all actions
+
+ TQPopupMenu * file = new TQPopupMenu( this );
+ menuBar()->insertItem( "&File", file );
+ fileNewAction->addTo( file );
+ fileOpenAction->addTo( file );
+ fileSaveAction->addTo( file );
+ fileSaveAsAction->addTo( file );
+ file->insertSeparator();
+ filePrintAction->addTo( file );
+ file->insertSeparator();
+ fileCloseAction->addTo( file );
+ fileQuitAction->addTo( file );
+
+
+ menuBar()->insertSeparator();
+
+ // add a help menu
+
+ TQPopupMenu * help = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Help", help );
+ help->insertItem( "&About", this, SLOT(about()), Key_F1 );
+ help->insertItem( "About &TQt", this, SLOT(aboutTQt()) );
+ help->insertSeparator();
+ help->insertItem( "What's &This", this, SLOT(whatsThis()),
+ SHIFT+Key_F1 );
+
+
+ // create and define the central widget
+
+ e = new TQTextEdit( this, "editor" );
+ e->setFocus();
+ setCentralWidget( e );
+ statusBar()->message( "Ready", 2000 );
+
+ resize( 450, 600 );
+}
+
+
+ApplicationWindow::~ApplicationWindow()
+{
+ delete printer;
+}
+
+
+
+void ApplicationWindow::newDoc()
+{
+ ApplicationWindow *ed = new ApplicationWindow;
+ ed->show();
+}
+
+void ApplicationWindow::choose()
+{
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null,
+ this);
+ if ( !fn.isEmpty() )
+ load( fn );
+ else
+ statusBar()->message( "Loading aborted", 2000 );
+}
+
+
+void ApplicationWindow::load( const TQString &fileName )
+{
+ TQFile f( fileName );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ TQTextStream ts( &f );
+ e->setText( ts.read() );
+ e->setModified( FALSE );
+ setCaption( fileName );
+ statusBar()->message( "Loaded document " + fileName, 2000 );
+}
+
+
+void ApplicationWindow::save()
+{
+ if ( filename.isEmpty() ) {
+ saveAs();
+ return;
+ }
+
+ TQString text = e->text();
+ TQFile f( filename );
+ if ( !f.open( IO_WriteOnly ) ) {
+ statusBar()->message( TQString("Could not write to %1").arg(filename),
+ 2000 );
+ return;
+ }
+
+ TQTextStream t( &f );
+ t << text;
+ f.close();
+
+ e->setModified( FALSE );
+
+ setCaption( filename );
+
+ statusBar()->message( TQString( "File %1 saved" ).arg( filename ), 2000 );
+}
+
+
+void ApplicationWindow::saveAs()
+{
+ TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null,
+ this );
+ if ( !fn.isEmpty() ) {
+ filename = fn;
+ save();
+ } else {
+ statusBar()->message( "Saving aborted", 2000 );
+ }
+}
+
+
+void ApplicationWindow::print()
+{
+ printer->setFullPage( TRUE );
+ if ( printer->setup(this) ) { // printer dialog
+ statusBar()->message( "Printing..." );
+ TQPainter p;
+ if( !p.begin( printer ) ) { // paint on printer
+ statusBar()->message( "Printing aborted", 2000 );
+ return;
+ }
+
+ TQPaintDeviceMetrics metrics( p.device() );
+ int dpiy = metrics.logicalDpiY();
+ int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins
+ TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );
+ TQSimpleRichText richText( TQStyleSheet::convertFromPlainText(e->text()),
+ TQFont(),
+ e->context(),
+ e->styleSheet(),
+ e->mimeSourceFactory(),
+ view.height() );
+ richText.setWidth( &p, view.width() );
+ int page = 1;
+ do {
+ richText.draw( &p, margin, margin, view, colorGroup() );
+ view.moveBy( 0, view.height() );
+ p.translate( 0 , -view.height() );
+ p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) );
+ if ( view.top() - margin >= richText.height() )
+ break;
+ printer->newPage();
+ page++;
+ } while (TRUE);
+
+ statusBar()->message( "Printing completed", 2000 );
+ } else {
+ statusBar()->message( "Printing aborted", 2000 );
+ }
+}
+
+void ApplicationWindow::closeEvent( TQCloseEvent* ce )
+{
+ if ( !e->isModified() ) {
+ ce->accept();
+ return;
+ }
+
+ switch( TQMessageBox::information( this, "TQt Application Example",
+ "The document has been changed since "
+ "the last save.",
+ "Save Now", "Cancel", "Leave Anyway",
+ 0, 1 ) ) {
+ case 0:
+ save();
+ ce->accept();
+ break;
+ case 1:
+ default: // just for sanity
+ ce->ignore();
+ break;
+ case 2:
+ ce->accept();
+ break;
+ }
+}
+
+
+void ApplicationWindow::about()
+{
+ TQMessageBox::about( this, "TQt Application Example",
+ "This example demonstrates simple use of "
+ "TQMainWindow,\nTQMenuBar and TQToolBar.");
+}
+
+
+void ApplicationWindow::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQt Application Example" );
+}
diff --git a/examples/action/application.doc b/examples/action/application.doc
new file mode 100644
index 000000000..f4eaaae44
--- /dev/null
+++ b/examples/action/application.doc
@@ -0,0 +1,36 @@
+/*
+*/
+
+/*! \page qaction-application-example.html
+
+ \ingroup qaction-examples
+
+
+ \title A Complete Application Window with Actions
+
+ The QAction class provides a way of associating user input from different
+ user interface elements with abstract high level actions. This approach makes
+ it easy to customize applications for different types of users.
+
+ This example program is just like the
+ <a href="simple-application-example.html">application example</a>,
+ but uses QAction to build the menu and the toolbar.
+
+ <hr>
+
+ Header file:
+
+ \include action/application.h
+
+ <hr>
+
+ Implementation:
+
+ \include action/application.cpp
+
+ <hr>
+
+ Main:
+
+ \include action/main.cpp
+*/
diff --git a/examples/action/application.h b/examples/action/application.h
new file mode 100644
index 000000000..7b772728e
--- /dev/null
+++ b/examples/action/application.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef APPLICATION_H
+#define APPLICATION_H
+
+#include <qmainwindow.h>
+
+class TQTextEdit;
+
+class ApplicationWindow: public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ ApplicationWindow();
+ ~ApplicationWindow();
+
+protected:
+ void closeEvent( TQCloseEvent* );
+
+private slots:
+ void newDoc();
+ void choose();
+ void load( const TQString &fileName );
+ void save();
+ void saveAs();
+ void print();
+
+ void about();
+ void aboutTQt();
+
+private:
+ TQPrinter *printer;
+ TQTextEdit *e;
+ TQString filename;
+};
+
+
+#endif
diff --git a/examples/action/fileopen.xpm b/examples/action/fileopen.xpm
new file mode 100644
index 000000000..880417eee
--- /dev/null
+++ b/examples/action/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/examples/action/fileprint.xpm b/examples/action/fileprint.xpm
new file mode 100644
index 000000000..6ada912fa
--- /dev/null
+++ b/examples/action/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/examples/action/filesave.xpm b/examples/action/filesave.xpm
new file mode 100644
index 000000000..bd6870f47
--- /dev/null
+++ b/examples/action/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/examples/action/main.cpp b/examples/action/main.cpp
new file mode 100644
index 000000000..215211630
--- /dev/null
+++ b/examples/action/main.cpp
@@ -0,0 +1,20 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "application.h"
+
+int main( int argc, char ** argv ) {
+ TQApplication a( argc, argv );
+ ApplicationWindow * mw = new ApplicationWindow();
+ mw->setCaption( "Document 1" );
+ mw->show();
+ a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) );
+ return a.exec();
+}
diff --git a/examples/action/toggleaction/labelonoff.xpm b/examples/action/toggleaction/labelonoff.xpm
new file mode 100644
index 000000000..87696d158
--- /dev/null
+++ b/examples/action/toggleaction/labelonoff.xpm
@@ -0,0 +1,169 @@
+/* XPM */
+static const char * labelonoff_xpm[] = {
+"32 32 134 2",
+" c None",
+". c #FFFFFF",
+"+ c #DEDEDE",
+"@ c #E7E7DE",
+"# c #E7E7E7",
+"$ c #EFEFDE",
+"% c #EFEFE7",
+"& c #F7F7DE",
+"* c #F7F7E7",
+"= c #DEDEE7",
+"- c #C6CEEF",
+"; c #B5B5E7",
+"> c #A5ADF7",
+", c #9CA5F7",
+"' c #8C94F7",
+") c #9C9CEF",
+"! c #BDBDE7",
+"~ c #8C8CEF",
+"{ c #7B7BEF",
+"] c #6B6BF7",
+"^ c #7373F7",
+"/ c #9494EF",
+"( c #DEDEEF",
+"_ c #A5ADFF",
+": c #6B7BFF",
+"< c #4A5AFF",
+"[ c #394AFF",
+"} c #424AF7",
+"| c #3142F7",
+"1 c #4252FF",
+"2 c #5A63F7",
+"3 c #3939F7",
+"4 c #0000FF",
+"5 c #E7E7EF",
+"6 c #9CA5FF",
+"7 c #3139E7",
+"8 c #424AD6",
+"9 c #7373D6",
+"0 c #8C8CCE",
+"a c #8C94CE",
+"b c #9494CE",
+"c c #8C8CD6",
+"d c #8484D6",
+"e c #6B6BD6",
+"f c #2121F7",
+"g c #4A52EF",
+"h c #5252EF",
+"i c #1818F7",
+"j c #C6CEFF",
+"k c #5A5AEF",
+"l c #0810FF",
+"m c #EFE7E7",
+"n c #7B84E7",
+"o c #3131F7",
+"p c #5263FF",
+"q c #7B84F7",
+"r c #1818FF",
+"s c #DEDED6",
+"t c #A5B5FF",
+"u c #848CF7",
+"v c #3939FF",
+"w c #3139EF",
+"x c #8C94EF",
+"y c #A5A5EF",
+"z c #D6D6D6",
+"A c #ADB5F7",
+"B c #7384FF",
+"C c #D6D6E7",
+"D c #2931FF",
+"E c #BDBDEF",
+"F c #C6CEE7",
+"G c #C6C6E7",
+"H c #525AF7",
+"I c #6B73EF",
+"J c #5A6BFF",
+"K c #949CF7",
+"L c #7B84FF",
+"M c #2129F7",
+"N c #0000EF",
+"O c #0808FF",
+"P c #1010FF",
+"Q c #6B6BEF",
+"R c #CECECE",
+"S c #BDBDDE",
+"T c #6B6BDE",
+"U c #4A52E7",
+"V c #2931EF",
+"W c #3942DE",
+"X c #8484EF",
+"Y c #A5A5E7",
+"Z c #CECEDE",
+"` c #A5A5D6",
+" . c #BDBDBD",
+".. c #EFEFEF",
+"+. c #F7F7EF",
+"@. c #8C8C94",
+"#. c #080821",
+"$. c #000008",
+"%. c #181818",
+"&. c #212129",
+"*. c #313131",
+"=. c #393939",
+"-. c #393942",
+";. c #424242",
+">. c #4A4A4A",
+",. c #4A4A52",
+"'. c #42424A",
+"). c #313139",
+"!. c #292931",
+"~. c #000000",
+"{. c #848484",
+"]. c #A5A5AD",
+"^. c #8C8C8C",
+"/. c #ADADAD",
+"(. c #B5B5BD",
+"_. c #7B7B7B",
+":. c #5A5A63",
+"<. c #292929",
+"[. c #6B6B6B",
+"}. c #949494",
+"|. c #F7F7F7",
+"1. c #A5A5A5",
+"2. c #5A5A5A",
+"3. c #636363",
+"4. c #7B7B84",
+"5. c #737373",
+"6. c #101010",
+"7. c #212121",
+"8. c #525252",
+"9. c #080808",
+"0. c #BDBDC6",
+"a. c #C6C6C6",
+"b. c #9C9C9C",
+"c. c #B5B5B5",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . . + @ # # @ @ $ # # # % $ # @ # @ % $ & $ $ * % % # # . . . ",
+". . . + = @ = - ; > , ' ' ' ) ! @ # ! ) ~ { ] ^ { / ! # @ . . . ",
+". . . + @ ( _ : < [ } } | | [ 1 2 3 4 4 4 4 4 4 4 4 4 3 ! . . . ",
+". . . + 5 6 7 8 9 0 a b c d e 7 4 4 4 f 3 g h g 3 f 4 4 i . . . ",
+". . . @ j g 0 @ $ % % % % $ & k 4 l { @ @ # $ m @ = ; h 4 . . . ",
+". . . + 6 n @ # + # + # # # # o f p q * # # # # # @ * % r . . . ",
+". . . s t u @ @ # @ # # # @ # v w ] x & @ # # @ # & % y 4 . . . ",
+". . . z A B / C = # # @ # # % ^ < D k E F = C C G ) H 4 4 . . . ",
+". . . s G I J : ' ' K , ' u L < M N N 4 4 O P O 4 4 4 4 Q . . . ",
+". . . R $ S T U } } } } | V V W 0 X 3 P 4 4 4 4 P f h Y % . . . ",
+". . . R # # @ Z ` a d d a ` S @ % % # = F ! ; G = = % % # . . . ",
+". . . ...# # # % * % * +.* % # # % # % % % * % % # % # # . . . ",
+". . . @.. . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
+". . #.$.%.&.*.=.-.-.;.;.;.>.>.>.,.>.>.>.>.'.;.;.;.-.-.).!.&.$.. ",
+". . ~.{.R R z z z z + + + + + + + + + + + + + + + s z z s z ].. ",
+". . ).z ^./.# # # # # + + + + # + + + # + + + @ + = # % (._.... ",
+". . :.^.~.^...+ + + + # # # + + # + # + # # @ = # @ # + *.<.... ",
+". . [.^.~.}.. # # # ....# ....+ # + ..|.# + = # ....# ..<.*.. . ",
+". . -.;.~.=._.+ # # 1.2.;.3./.# # # _.[.R # # + 4.5.R [.6.6.[.. ",
+". . <.%.~.%.;.+ # 2.~.7.>.%.~.{...# 5.~.8...+._.~.2.+ ;.~.9.=.. ",
+". . 5.}.~.^.|...{.~.[.....+ 8.~. ...# 8.~./.0.~.;.# % + 7.=.|.. ",
+". . 5.}.~.{.|.# =.9.+ ..# ..a.~.5.....z %.7.<.%.R ..# = %.=.|.. ",
+". . 5.}.~.{...+ 7.~.*.*.*.*.*.~.>.# # ../.~.~.1...# # @ %.=.|.. ",
+". . 5.b.~.{.|.+ %.6.8.8.8.8.8.2.^.+ # ..b.~.~.^...# # + %.=.|.. ",
+". . 5.b.~._.|.+ *.%...|.......a.+ # ..a.6.=.>.~.c...# + 6.;.. . ",
+". . 5./.~.5.. ..[.~.{.|...|.^.~.{...+ *.9.a.z 6.<.z ..+ 7.=.. . ",
+". . [.a.~.%.2.z + 7.~.2.}.3.~.7.z ..[.~._...|.{.~.8...# =.~.>.. ",
+". . 3.# {.<.%.c...z [.7.9.%.3.R ..R ;.2.+ # # # 3.;.a.../.;.<.. ",
+". . 3.= ..+ + # # # ..# s + ..# # + # # # + # # # # + # ....|.. ",
+". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "};
diff --git a/examples/action/toggleaction/toggleaction.cpp b/examples/action/toggleaction/toggleaction.cpp
new file mode 100644
index 000000000..e9fcc5c49
--- /dev/null
+++ b/examples/action/toggleaction/toggleaction.cpp
@@ -0,0 +1,31 @@
+#include <qapplication.h>
+#include <qmainwindow.h>
+#include <qtoolbar.h>
+#include <qaction.h>
+
+#include "labelonoff.xpm"
+
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+ TQMainWindow * window = new TQMainWindow;
+ window->setCaption("TQt Example - Toggleaction");
+ TQToolBar * toolbar = new TQToolBar( window );
+
+ TQAction * labelonoffaction = new TQAction( window, "labelonoff" );
+ labelonoffaction->setToggleAction( TRUE );
+
+ labelonoffaction->setText( "labels on/off" );
+ labelonoffaction->setAccel( TQt::ALT+TQt::Key_L );
+ labelonoffaction->setIconSet( (TQPixmap) labelonoff_xpm );
+
+ TQObject::connect( labelonoffaction, SIGNAL( toggled( bool ) ),
+ window, SLOT( setUsesTextLabel( bool ) ) );
+
+ labelonoffaction->addTo( toolbar );
+
+ app.setMainWidget( window );
+ window->show();
+ return app.exec();
+}
+
diff --git a/examples/action/toggleaction/toggleaction.doc b/examples/action/toggleaction/toggleaction.doc
new file mode 100644
index 000000000..7924a2631
--- /dev/null
+++ b/examples/action/toggleaction/toggleaction.doc
@@ -0,0 +1,15 @@
+/*! \page toggleaction-example.html
+
+ \ingroup qaction-examples
+
+ \title A Tiny Example Featuring a Toggle Action
+
+ This example program demonstrates the use of QAction
+ in its incarnation as a toggle action.
+
+ <hr>
+
+ Main:
+
+ \include action/toggleaction/toggleaction.cpp
+*/
diff --git a/examples/action/toggleaction/toggleaction.pro b/examples/action/toggleaction/toggleaction.pro
new file mode 100644
index 000000000..697d7cd76
--- /dev/null
+++ b/examples/action/toggleaction/toggleaction.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = toggleaction
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = toggleaction.cpp
diff --git a/examples/addressbook/addressbook.doc b/examples/addressbook/addressbook.doc
new file mode 100644
index 000000000..3abc3c9ca
--- /dev/null
+++ b/examples/addressbook/addressbook.doc
@@ -0,0 +1,41 @@
+/*
+*/
+/*! \page addressbook-example.html
+
+ \ingroup examples
+ \title Simple Addressbook
+
+ This examples shows how to write a very simple, but complete application
+ using an addressbook as the example.
+
+ <hr>
+
+ Header file of the mainwindow:
+
+ \include addressbook/mainwindow.h
+
+ <hr>
+
+ Implementation of the mainwindow:
+
+ \include addressbook/mainwindow.cpp
+
+ <hr>
+
+ Header file of the centralwidget:
+
+ \include addressbook/centralwidget.h
+
+ <hr>
+
+ Implementation of the centralwidget:
+
+ \include addressbook/centralwidget.cpp
+
+ <hr>
+
+ Main:
+
+ \include addressbook/main.cpp
+*/
+
diff --git a/examples/addressbook/addressbook.pro b/examples/addressbook/addressbook.pro
new file mode 100644
index 000000000..f15ad9a1c
--- /dev/null
+++ b/examples/addressbook/addressbook.pro
@@ -0,0 +1,13 @@
+TEMPLATE = app
+TARGET = addressbook
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = centralwidget.h \
+ mainwindow.h
+SOURCES = centralwidget.cpp \
+ main.cpp \
+ mainwindow.cpp
diff --git a/examples/addressbook/centralwidget.cpp b/examples/addressbook/centralwidget.cpp
new file mode 100644
index 000000000..86edc9c52
--- /dev/null
+++ b/examples/addressbook/centralwidget.cpp
@@ -0,0 +1,351 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "centralwidget.h"
+
+#include <qtabwidget.h>
+#include <qlistview.h>
+#include <qlayout.h>
+#include <qwidget.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+ABCentralWidget::ABCentralWidget( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ mainGrid = new TQGridLayout( this, 2, 1, 5, 5 );
+
+ setupTabWidget();
+ setupListView();
+
+ mainGrid->setRowStretch( 0, 0 );
+ mainGrid->setRowStretch( 1, 1 );
+}
+
+void ABCentralWidget::save( const TQString &filename )
+{
+ if ( !listView->firstChild() )
+ return;
+
+ TQFile f( filename );
+ if ( !f.open( IO_WriteOnly ) )
+ return;
+
+ TQTextStream t( &f );
+ t.setEncoding(TQTextStream::UnicodeUTF8);
+
+ TQListViewItemIterator it( listView );
+
+ for ( ; it.current(); ++it )
+ for ( unsigned int i = 0; i < 4; i++ )
+ t << it.current()->text( i ) << "\n";
+
+ f.close();
+}
+
+void ABCentralWidget::load( const TQString &filename )
+{
+ listView->clear();
+
+ TQFile f( filename );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ TQTextStream t( &f );
+ t.setEncoding(TQTextStream::UnicodeUTF8);
+
+ while ( !t.atEnd() ) {
+ TQListViewItem *item = new TQListViewItem( listView );
+ for ( unsigned int i = 0; i < 4; i++ )
+ item->setText( i, t.readLine() );
+ }
+
+ f.close();
+}
+
+void ABCentralWidget::setupTabWidget()
+{
+ tabWidget = new TQTabWidget( this );
+
+ TQWidget *input = new TQWidget( tabWidget );
+ TQGridLayout *grid1 = new TQGridLayout( input, 2, 5, 5, 5 );
+
+ TQLabel *liFirstName = new TQLabel( "First &Name", input );
+ liFirstName->resize( liFirstName->sizeHint() );
+ grid1->addWidget( liFirstName, 0, 0 );
+
+ TQLabel *liLastName = new TQLabel( "&Last Name", input );
+ liLastName->resize( liLastName->sizeHint() );
+ grid1->addWidget( liLastName, 0, 1 );
+
+ TQLabel *liAddress = new TQLabel( "Add&ress", input );
+ liAddress->resize( liAddress->sizeHint() );
+ grid1->addWidget( liAddress, 0, 2 );
+
+ TQLabel *liEMail = new TQLabel( "&E-Mail", input );
+ liEMail->resize( liEMail->sizeHint() );
+ grid1->addWidget( liEMail, 0, 3 );
+
+ add = new TQPushButton( "A&dd", input );
+ add->resize( add->sizeHint() );
+ grid1->addWidget( add, 0, 4 );
+ connect( add, SIGNAL( clicked() ), this, SLOT( addEntry() ) );
+
+ iFirstName = new TQLineEdit( input );
+ iFirstName->resize( iFirstName->sizeHint() );
+ grid1->addWidget( iFirstName, 1, 0 );
+ liFirstName->setBuddy( iFirstName );
+
+ iLastName = new TQLineEdit( input );
+ iLastName->resize( iLastName->sizeHint() );
+ grid1->addWidget( iLastName, 1, 1 );
+ liLastName->setBuddy( iLastName );
+
+ iAddress = new TQLineEdit( input );
+ iAddress->resize( iAddress->sizeHint() );
+ grid1->addWidget( iAddress, 1, 2 );
+ liAddress->setBuddy( iAddress );
+
+ iEMail = new TQLineEdit( input );
+ iEMail->resize( iEMail->sizeHint() );
+ grid1->addWidget( iEMail, 1, 3 );
+ liEMail->setBuddy( iEMail );
+
+ change = new TQPushButton( "&Change", input );
+ change->resize( change->sizeHint() );
+ grid1->addWidget( change, 1, 4 );
+ connect( change, SIGNAL( clicked() ), this, SLOT( changeEntry() ) );
+
+ tabWidget->addTab( input, "&Add/Change Entry" );
+
+ // --------------------------------------
+
+ TQWidget *search = new TQWidget( this );
+ TQGridLayout *grid2 = new TQGridLayout( search, 2, 5, 5, 5 );
+
+ cFirstName = new TQCheckBox( "First &Name", search );
+ cFirstName->resize( cFirstName->sizeHint() );
+ grid2->addWidget( cFirstName, 0, 0 );
+ connect( cFirstName, SIGNAL( clicked() ), this, SLOT( toggleFirstName() ) );
+
+ cLastName = new TQCheckBox( "&Last Name", search );
+ cLastName->resize( cLastName->sizeHint() );
+ grid2->addWidget( cLastName, 0, 1 );
+ connect( cLastName, SIGNAL( clicked() ), this, SLOT( toggleLastName() ) );
+
+ cAddress = new TQCheckBox( "Add&ress", search );
+ cAddress->resize( cAddress->sizeHint() );
+ grid2->addWidget( cAddress, 0, 2 );
+ connect( cAddress, SIGNAL( clicked() ), this, SLOT( toggleAddress() ) );
+
+ cEMail = new TQCheckBox( "&E-Mail", search );
+ cEMail->resize( cEMail->sizeHint() );
+ grid2->addWidget( cEMail, 0, 3 );
+ connect( cEMail, SIGNAL( clicked() ), this, SLOT( toggleEMail() ) );
+
+ sFirstName = new TQLineEdit( search );
+ sFirstName->resize( sFirstName->sizeHint() );
+ grid2->addWidget( sFirstName, 1, 0 );
+
+ sLastName = new TQLineEdit( search );
+ sLastName->resize( sLastName->sizeHint() );
+ grid2->addWidget( sLastName, 1, 1 );
+
+ sAddress = new TQLineEdit( search );
+ sAddress->resize( sAddress->sizeHint() );
+ grid2->addWidget( sAddress, 1, 2 );
+
+ sEMail = new TQLineEdit( search );
+ sEMail->resize( sEMail->sizeHint() );
+ grid2->addWidget( sEMail, 1, 3 );
+
+ find = new TQPushButton( "F&ind", search );
+ find->resize( find->sizeHint() );
+ grid2->addWidget( find, 1, 4 );
+ connect( find, SIGNAL( clicked() ), this, SLOT( findEntries() ) );
+
+ cFirstName->setChecked( TRUE );
+ sFirstName->setEnabled( TRUE );
+ sLastName->setEnabled( FALSE );
+ sAddress->setEnabled( FALSE );
+ sEMail->setEnabled( FALSE );
+
+ tabWidget->addTab( search, "&Search" );
+
+ mainGrid->addWidget( tabWidget, 0, 0 );
+}
+
+void ABCentralWidget::setupListView()
+{
+ listView = new TQListView( this );
+ listView->addColumn( "First Name" );
+ listView->addColumn( "Last Name" );
+ listView->addColumn( "Address" );
+ listView->addColumn( "E-Mail" );
+
+ listView->setSelectionMode( TQListView::Single );
+
+ connect( listView, SIGNAL( clicked( TQListViewItem* ) ), this, SLOT( itemSelected( TQListViewItem* ) ) );
+
+ mainGrid->addWidget( listView, 1, 0 );
+ listView->setAllColumnsShowFocus( TRUE );
+}
+
+void ABCentralWidget::addEntry()
+{
+ if ( !iFirstName->text().isEmpty() || !iLastName->text().isEmpty() ||
+ !iAddress->text().isEmpty() || !iEMail->text().isEmpty() ) {
+ TQListViewItem *item = new TQListViewItem( listView );
+ item->setText( 0, iFirstName->text() );
+ item->setText( 1, iLastName->text() );
+ item->setText( 2, iAddress->text() );
+ item->setText( 3, iEMail->text() );
+ }
+
+ iFirstName->setText( "" );
+ iLastName->setText( "" );
+ iAddress->setText( "" );
+ iEMail->setText( "" );
+}
+
+void ABCentralWidget::changeEntry()
+{
+ TQListViewItem *item = listView->currentItem();
+
+ if ( item &&
+ ( !iFirstName->text().isEmpty() || !iLastName->text().isEmpty() ||
+ !iAddress->text().isEmpty() || !iEMail->text().isEmpty() ) ) {
+ item->setText( 0, iFirstName->text() );
+ item->setText( 1, iLastName->text() );
+ item->setText( 2, iAddress->text() );
+ item->setText( 3, iEMail->text() );
+ }
+}
+
+void ABCentralWidget::selectionChanged()
+{
+ iFirstName->setText( "" );
+ iLastName->setText( "" );
+ iAddress->setText( "" );
+ iEMail->setText( "" );
+}
+
+void ABCentralWidget::itemSelected( TQListViewItem *item )
+{
+ if ( !item )
+ return;
+ item->setSelected( TRUE );
+ item->repaint();
+
+ iFirstName->setText( item->text( 0 ) );
+ iLastName->setText( item->text( 1 ) );
+ iAddress->setText( item->text( 2 ) );
+ iEMail->setText( item->text( 3 ) );
+}
+
+void ABCentralWidget::toggleFirstName()
+{
+ sFirstName->setText( "" );
+
+ if ( cFirstName->isChecked() ) {
+ sFirstName->setEnabled( TRUE );
+ sFirstName->setFocus();
+ }
+ else
+ sFirstName->setEnabled( FALSE );
+}
+
+void ABCentralWidget::toggleLastName()
+{
+ sLastName->setText( "" );
+
+ if ( cLastName->isChecked() ) {
+ sLastName->setEnabled( TRUE );
+ sLastName->setFocus();
+ }
+ else
+ sLastName->setEnabled( FALSE );
+}
+
+void ABCentralWidget::toggleAddress()
+{
+ sAddress->setText( "" );
+
+ if ( cAddress->isChecked() ) {
+ sAddress->setEnabled( TRUE );
+ sAddress->setFocus();
+ }
+ else
+ sAddress->setEnabled( FALSE );
+}
+
+void ABCentralWidget::toggleEMail()
+{
+ sEMail->setText( "" );
+
+ if ( cEMail->isChecked() ) {
+ sEMail->setEnabled( TRUE );
+ sEMail->setFocus();
+ }
+ else
+ sEMail->setEnabled( FALSE );
+}
+
+void ABCentralWidget::findEntries()
+{
+ if ( !cFirstName->isChecked() &&
+ !cLastName->isChecked() &&
+ !cAddress->isChecked() &&
+ !cEMail->isChecked() ) {
+ listView->clearSelection();
+ return;
+ }
+
+ TQListViewItemIterator it( listView );
+
+ for ( ; it.current(); ++it ) {
+ bool select = TRUE;
+
+ if ( cFirstName->isChecked() ) {
+ if ( select && it.current()->text( 0 ).contains( sFirstName->text() ) )
+ select = TRUE;
+ else
+ select = FALSE;
+ }
+ if ( cLastName->isChecked() ) {
+ if ( select && it.current()->text( 1 ).contains( sLastName->text() ) )
+ select = TRUE;
+ else
+ select = FALSE;
+ }
+ if ( cAddress->isChecked() ) {
+ if ( select && it.current()->text( 2 ).contains( sAddress->text() ) )
+ select = TRUE;
+ else
+ select = FALSE;
+ }
+ if ( cEMail->isChecked() ) {
+ if ( select && it.current()->text( 3 ).contains( sEMail->text() ) )
+ select = TRUE;
+ else
+ select = FALSE;
+ }
+
+ if ( select )
+ it.current()->setSelected( TRUE );
+ else
+ it.current()->setSelected( FALSE );
+ it.current()->repaint();
+ }
+}
diff --git a/examples/addressbook/centralwidget.h b/examples/addressbook/centralwidget.h
new file mode 100644
index 000000000..66e44a332
--- /dev/null
+++ b/examples/addressbook/centralwidget.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef AB_CENTRALWIDGET_H
+#define AB_CENTRALWIDGET_H
+
+#include <qwidget.h>
+#include <qstring.h>
+
+class TQTabWidget;
+class TQListView;
+class TQGridLayout;
+class TQLineEdit;
+class TQPushButton;
+class TQListViewItem;
+class TQCheckBox;
+
+class ABCentralWidget : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ ABCentralWidget( TQWidget *parent, const char *name = 0 );
+
+ void save( const TQString &filename );
+ void load( const TQString &filename );
+
+protected slots:
+ void addEntry();
+ void changeEntry();
+ void itemSelected( TQListViewItem* );
+ void selectionChanged();
+ void toggleFirstName();
+ void toggleLastName();
+ void toggleAddress();
+ void toggleEMail();
+ void findEntries();
+
+protected:
+ void setupTabWidget();
+ void setupListView();
+
+ TQGridLayout *mainGrid;
+ TQTabWidget *tabWidget;
+ TQListView *listView;
+ TQPushButton *add, *change, *find;
+ TQLineEdit *iFirstName, *iLastName, *iAddress, *iEMail,
+ *sFirstName, *sLastName, *sAddress, *sEMail;
+ TQCheckBox *cFirstName, *cLastName, *cAddress, *cEMail;
+
+};
+
+#endif
diff --git a/examples/addressbook/fileopen.xpm b/examples/addressbook/fileopen.xpm
new file mode 100644
index 000000000..880417eee
--- /dev/null
+++ b/examples/addressbook/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/examples/addressbook/fileprint.xpm b/examples/addressbook/fileprint.xpm
new file mode 100644
index 000000000..6ada912fa
--- /dev/null
+++ b/examples/addressbook/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/examples/addressbook/filesave.xpm b/examples/addressbook/filesave.xpm
new file mode 100644
index 000000000..bd6870f47
--- /dev/null
+++ b/examples/addressbook/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/examples/addressbook/main.cpp b/examples/addressbook/main.cpp
new file mode 100644
index 000000000..33b69833e
--- /dev/null
+++ b/examples/addressbook/main.cpp
@@ -0,0 +1,27 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+
+#include "mainwindow.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+
+ ABMainWindow *mw = new ABMainWindow();
+ mw->setCaption( "TQt Example - Addressbook" );
+ a.setMainWidget( mw );
+ mw->show();
+
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) );
+ int result = a.exec();
+ delete mw;
+ return result;
+}
diff --git a/examples/addressbook/mainwindow.cpp b/examples/addressbook/mainwindow.cpp
new file mode 100644
index 000000000..e6f705b57
--- /dev/null
+++ b/examples/addressbook/mainwindow.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "mainwindow.h"
+#include "centralwidget.h"
+
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qstatusbar.h>
+#include <qapplication.h>
+#include <qfiledialog.h>
+
+ABMainWindow::ABMainWindow()
+ : TQMainWindow( 0, "example addressbook application" ),
+ filename( TQString::null )
+{
+ setupMenuBar();
+ setupFileTools();
+ setupStatusBar();
+ setupCentralWidget();
+}
+
+
+ABMainWindow::~ABMainWindow()
+{
+}
+
+void ABMainWindow::setupMenuBar()
+{
+ TQPopupMenu *file = new TQPopupMenu( this );
+ menuBar()->insertItem( "&File", file );
+
+ file->insertItem( "New", this, SLOT( fileNew() ), CTRL + Key_N );
+ file->insertItem( TQPixmap( "fileopen.xpm" ), "Open", this, SLOT( fileOpen() ), CTRL + Key_O );
+ file->insertSeparator();
+ file->insertItem( TQPixmap( "filesave.xpm" ), "Save", this, SLOT( fileSave() ), CTRL + Key_S );
+ file->insertItem( "Save As...", this, SLOT( fileSaveAs() ) );
+ file->insertSeparator();
+ file->insertItem( TQPixmap( "fileprint.xpm" ), "Print...", this, SLOT( filePrint() ), CTRL + Key_P );
+ file->insertSeparator();
+ file->insertItem( "Close", this, SLOT( closeWindow() ), CTRL + Key_W );
+ file->insertItem( "Quit", qApp, SLOT( tquit() ), CTRL + Key_Q );
+}
+
+void ABMainWindow::setupFileTools()
+{
+ //fileTools = new TQToolBar( this, "file operations" );
+}
+
+void ABMainWindow::setupStatusBar()
+{
+ //statusBar()->message( "Ready", 2000 );
+}
+
+void ABMainWindow::setupCentralWidget()
+{
+ view = new ABCentralWidget( this );
+ setCentralWidget( view );
+}
+
+void ABMainWindow::closeWindow()
+{
+ close();
+}
+
+void ABMainWindow::fileNew()
+{
+}
+
+void ABMainWindow::fileOpen()
+{
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
+ if ( !fn.isEmpty() ) {
+ filename = fn;
+ view->load( filename );
+ }
+}
+
+void ABMainWindow::fileSave()
+{
+ if ( filename.isEmpty() ) {
+ fileSaveAs();
+ return;
+ }
+
+ view->save( filename );
+}
+
+void ABMainWindow::fileSaveAs()
+{
+ TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, this );
+ if ( !fn.isEmpty() ) {
+ filename = fn;
+ fileSave();
+ }
+}
+
+void ABMainWindow::filePrint()
+{
+}
diff --git a/examples/addressbook/mainwindow.h b/examples/addressbook/mainwindow.h
new file mode 100644
index 000000000..e7ae62d8d
--- /dev/null
+++ b/examples/addressbook/mainwindow.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef AB_MAINWINDOW_H
+#define AB_MAINWINDOW_H
+
+#include <qmainwindow.h>
+#include <qstring.h>
+
+class TQToolBar;
+class TQPopupMenu;
+class ABCentralWidget;
+
+class ABMainWindow: public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ ABMainWindow();
+ ~ABMainWindow();
+
+protected slots:
+ void fileNew();
+ void fileOpen();
+ void fileSave();
+ void fileSaveAs();
+ void filePrint();
+ void closeWindow();
+
+protected:
+ void setupMenuBar();
+ void setupFileTools();
+ void setupStatusBar();
+ void setupCentralWidget();
+
+ TQToolBar *fileTools;
+ TQString filename;
+ ABCentralWidget *view;
+
+};
+
+
+#endif
diff --git a/examples/application/application.cpp b/examples/application/application.cpp
new file mode 100644
index 000000000..e2a690e30
--- /dev/null
+++ b/examples/application/application.cpp
@@ -0,0 +1,294 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "application.h"
+
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qtextedit.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qprinter.h>
+#include <qapplication.h>
+#include <qaccel.h>
+#include <qtextstream.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qwhatsthis.h>
+#include <qsimplerichtext.h>
+
+#include "filesave.xpm"
+#include "fileopen.xpm"
+#include "fileprint.xpm"
+
+ApplicationWindow::ApplicationWindow()
+ : TQMainWindow( 0, "example application main window", WDestructiveClose | WGroupLeader )
+{
+ printer = new TQPrinter( TQPrinter::HighResolution );
+ TQPixmap openIcon, saveIcon, printIcon;
+
+ TQToolBar * fileTools = new TQToolBar( this, "file operations" );
+ fileTools->setLabel( "File Operations" );
+
+ openIcon = TQPixmap( fileopen );
+ TQToolButton * fileOpen
+ = new TQToolButton( openIcon, "Open File", TQString::null,
+ this, SLOT(choose()), fileTools, "open file" );
+
+ saveIcon = TQPixmap( filesave );
+ TQToolButton * fileSave
+ = new TQToolButton( saveIcon, "Save File", TQString::null,
+ this, SLOT(save()), fileTools, "save file" );
+
+ printIcon = TQPixmap( fileprint );
+ TQToolButton * filePrint
+ = new TQToolButton( printIcon, "Print File", TQString::null,
+ this, SLOT(print()), fileTools, "print file" );
+
+
+ (void)TQWhatsThis::whatsThisButton( fileTools );
+
+ const char * fileOpenText = "<p><img source=\"fileopen\"> "
+ "Click this button to open a <em>new file</em>.<br>"
+ "You can also select the <b>Open</b> command "
+ "from the <b>File</b> menu.</p>";
+
+ TQWhatsThis::add( fileOpen, fileOpenText );
+
+ TQMimeSourceFactory::defaultFactory()->setPixmap( "fileopen", openIcon );
+
+ const char * fileSaveText = "<p>Click this button to save the file you "
+ "are editing. You will be prompted for a file name.\n"
+ "You can also select the <b>Save</b> command "
+ "from the <b>File</b> menu.</p>";
+
+ TQWhatsThis::add( fileSave, fileSaveText );
+
+ const char * filePrintText = "Click this button to print the file you "
+ "are editing.\n"
+ "You can also select the Print command "
+ "from the File menu.";
+
+ TQWhatsThis::add( filePrint, filePrintText );
+
+
+ TQPopupMenu * file = new TQPopupMenu( this );
+ menuBar()->insertItem( "&File", file );
+
+
+ file->insertItem( "&New", this, SLOT(newDoc()), CTRL+Key_N );
+
+ int id;
+ id = file->insertItem( openIcon, "&Open...",
+ this, SLOT(choose()), CTRL+Key_O );
+ file->setWhatsThis( id, fileOpenText );
+
+ id = file->insertItem( saveIcon, "&Save",
+ this, SLOT(save()), CTRL+Key_S );
+ file->setWhatsThis( id, fileSaveText );
+
+ id = file->insertItem( "Save &As...", this, SLOT(saveAs()) );
+ file->setWhatsThis( id, fileSaveText );
+
+ file->insertSeparator();
+
+ id = file->insertItem( printIcon, "&Print...",
+ this, SLOT(print()), CTRL+Key_P );
+ file->setWhatsThis( id, filePrintText );
+
+ file->insertSeparator();
+
+ file->insertItem( "&Close", this, SLOT(close()), CTRL+Key_W );
+
+ file->insertItem( "&Quit", qApp, SLOT( closeAllWindows() ), CTRL+Key_Q );
+
+ menuBar()->insertSeparator();
+
+ TQPopupMenu * help = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Help", help );
+
+ help->insertItem( "&About", this, SLOT(about()), Key_F1 );
+ help->insertItem( "About &TQt", this, SLOT(aboutTQt()) );
+ help->insertSeparator();
+ help->insertItem( "What's &This", this, SLOT(whatsThis()), SHIFT+Key_F1 );
+
+ e = new TQTextEdit( this, "editor" );
+ e->setFocus();
+ setCentralWidget( e );
+ statusBar()->message( "Ready", 2000 );
+
+ resize( 450, 600 );
+}
+
+
+ApplicationWindow::~ApplicationWindow()
+{
+ delete printer;
+}
+
+
+
+void ApplicationWindow::newDoc()
+{
+ ApplicationWindow *ed = new ApplicationWindow;
+ ed->setCaption("TQt Example - Application");
+ ed->show();
+}
+
+void ApplicationWindow::choose()
+{
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null,
+ this);
+ if ( !fn.isEmpty() )
+ load( fn );
+ else
+ statusBar()->message( "Loading aborted", 2000 );
+}
+
+
+void ApplicationWindow::load( const TQString &fileName )
+{
+ TQFile f( fileName );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ TQTextStream ts( &f );
+ e->setText( ts.read() );
+ e->setModified( FALSE );
+ setCaption( fileName );
+ statusBar()->message( "Loaded document " + fileName, 2000 );
+}
+
+
+void ApplicationWindow::save()
+{
+ if ( filename.isEmpty() ) {
+ saveAs();
+ return;
+ }
+
+ TQString text = e->text();
+ TQFile f( filename );
+ if ( !f.open( IO_WriteOnly ) ) {
+ statusBar()->message( TQString("Could not write to %1").arg(filename),
+ 2000 );
+ return;
+ }
+
+ TQTextStream t( &f );
+ t << text;
+ f.close();
+
+ e->setModified( FALSE );
+
+ setCaption( filename );
+
+ statusBar()->message( TQString( "File %1 saved" ).arg( filename ), 2000 );
+}
+
+
+void ApplicationWindow::saveAs()
+{
+ TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null,
+ this );
+ if ( !fn.isEmpty() ) {
+ filename = fn;
+ save();
+ } else {
+ statusBar()->message( "Saving aborted", 2000 );
+ }
+}
+
+
+void ApplicationWindow::print()
+{
+ printer->setFullPage( TRUE );
+ if ( printer->setup(this) ) { // printer dialog
+ statusBar()->message( "Printing..." );
+ TQPainter p;
+ if( !p.begin( printer ) ) { // paint on printer
+ statusBar()->message( "Printing aborted", 2000 );
+ return;
+ }
+
+ TQPaintDeviceMetrics metrics( p.device() );
+ int dpiy = metrics.logicalDpiY();
+ int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins
+ TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );
+ TQSimpleRichText richText( TQStyleSheet::convertFromPlainText(e->text()),
+ TQFont(),
+ e->context(),
+ e->styleSheet(),
+ e->mimeSourceFactory(),
+ view.height() );
+ richText.setWidth( &p, view.width() );
+ int page = 1;
+ do {
+ richText.draw( &p, margin, margin, view, colorGroup() );
+ view.moveBy( 0, view.height() );
+ p.translate( 0 , -view.height() );
+ p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) );
+ if ( view.top() - margin >= richText.height() )
+ break;
+ printer->newPage();
+ page++;
+ } while (TRUE);
+
+ statusBar()->message( "Printing completed", 2000 );
+ } else {
+ statusBar()->message( "Printing aborted", 2000 );
+ }
+}
+
+void ApplicationWindow::closeEvent( TQCloseEvent* ce )
+{
+ if ( !e->isModified() ) {
+ ce->accept();
+ return;
+ }
+
+ switch( TQMessageBox::information( this, "TQt Application Example",
+ "Do you want to save the changes"
+ " to the document?",
+ "Yes", "No", "Cancel",
+ 0, 1 ) ) {
+ case 0:
+ save();
+ ce->accept();
+ break;
+ case 1:
+ ce->accept();
+ break;
+ case 2:
+ default: // just for sanity
+ ce->ignore();
+ break;
+ }
+}
+
+
+void ApplicationWindow::about()
+{
+ TQMessageBox::about( this, "TQt Application Example",
+ "This example demonstrates simple use of "
+ "TQMainWindow,\nTQMenuBar and TQToolBar.");
+}
+
+
+void ApplicationWindow::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQt Application Example" );
+}
diff --git a/examples/application/application.doc b/examples/application/application.doc
new file mode 100644
index 000000000..731bda020
--- /dev/null
+++ b/examples/application/application.doc
@@ -0,0 +1,34 @@
+/*
+*/
+
+/*! \page simple-application-example.html
+
+ \ingroup examples
+
+ \title A Complete Application Window
+
+ This example program looks like a complete modern application. It
+ has a menu bar, it has a tool bar, it has a status bar and works
+ like a simple text editor.
+
+ There is a <a href="simple-application.html">walkthrough</a> of
+ this example.
+
+ <hr>
+
+ Header file:
+
+ \include application/application.h
+
+ <hr>
+
+ Implementation:
+
+ \include application/application.cpp
+
+ <hr>
+
+ Main:
+
+ \include application/main.cpp
+*/
diff --git a/examples/application/application.h b/examples/application/application.h
new file mode 100644
index 000000000..7b772728e
--- /dev/null
+++ b/examples/application/application.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef APPLICATION_H
+#define APPLICATION_H
+
+#include <qmainwindow.h>
+
+class TQTextEdit;
+
+class ApplicationWindow: public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ ApplicationWindow();
+ ~ApplicationWindow();
+
+protected:
+ void closeEvent( TQCloseEvent* );
+
+private slots:
+ void newDoc();
+ void choose();
+ void load( const TQString &fileName );
+ void save();
+ void saveAs();
+ void print();
+
+ void about();
+ void aboutTQt();
+
+private:
+ TQPrinter *printer;
+ TQTextEdit *e;
+ TQString filename;
+};
+
+
+#endif
diff --git a/examples/application/application.pro b/examples/application/application.pro
new file mode 100644
index 000000000..7f109124a
--- /dev/null
+++ b/examples/application/application.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = application
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = application.h
+SOURCES = application.cpp \
+ main.cpp
diff --git a/examples/application/fileopen.xpm b/examples/application/fileopen.xpm
new file mode 100644
index 000000000..880417eee
--- /dev/null
+++ b/examples/application/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/examples/application/fileprint.xpm b/examples/application/fileprint.xpm
new file mode 100644
index 000000000..6ada912fa
--- /dev/null
+++ b/examples/application/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/examples/application/filesave.xpm b/examples/application/filesave.xpm
new file mode 100644
index 000000000..bd6870f47
--- /dev/null
+++ b/examples/application/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/examples/application/main.cpp b/examples/application/main.cpp
new file mode 100644
index 000000000..f6a4ae3fb
--- /dev/null
+++ b/examples/application/main.cpp
@@ -0,0 +1,20 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "application.h"
+
+int main( int argc, char ** argv ) {
+ TQApplication a( argc, argv );
+ ApplicationWindow *mw = new ApplicationWindow();
+ mw->setCaption( "TQt Example - Application" );
+ mw->show();
+ a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) );
+ return a.exec();
+}
diff --git a/examples/biff/biff.cpp b/examples/biff/biff.cpp
new file mode 100644
index 000000000..34382403a
--- /dev/null
+++ b/examples/biff/biff.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "biff.h"
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <qpainter.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "bmp.cpp"
+
+
+Biff::Biff( TQWidget *parent, const char *name )
+ : TQWidget( parent, name, WShowModal | WType_Dialog )
+{
+ TQFileInfo fi = TQString(getenv( "MAIL" ));
+ if ( !fi.exists() ) {
+ TQString s( "/var/spool/mail/" );
+ s += getlogin();
+ fi.setFile( s );
+ }
+
+ if ( fi.exists() ) {
+ mailbox = fi.absFilePath();
+ startTimer( 1000 );
+ }
+
+ setMinimumSize( 48, 48 );
+ setMaximumSize( 48, 48 );
+ resize( 48, 48 );
+
+ hasNewMail.loadFromData( hasmail_bmp_data, hasmail_bmp_len );
+ noNewMail.loadFromData( nomail_bmp_data, nomail_bmp_len );
+
+ gotMail = FALSE;
+ lastModified = fi.lastModified();
+}
+
+
+void Biff::timerEvent( TQTimerEvent * )
+{
+ TQFileInfo fi( mailbox );
+ bool newState = ( fi.lastModified() != lastModified &&
+ fi.lastModified() > fi.lastRead() );
+ if ( newState != gotMail ) {
+ if ( gotMail )
+ lastModified = fi.lastModified();
+ gotMail = newState;
+ repaint( FALSE );
+ }
+}
+
+
+void Biff::paintEvent( TQPaintEvent * )
+{
+ if ( gotMail )
+ bitBlt( this, 0, 0, &hasNewMail );
+ else
+ bitBlt( this, 0, 0, &noNewMail );
+}
+
+
+void Biff::mousePressEvent( TQMouseEvent * )
+{
+ TQFileInfo fi( mailbox );
+ lastModified = fi.lastModified();
+}
diff --git a/examples/biff/biff.doc b/examples/biff/biff.doc
new file mode 100644
index 000000000..d16216825
--- /dev/null
+++ b/examples/biff/biff.doc
@@ -0,0 +1,31 @@
+/*
+*/
+/*! \page biff-example.html
+
+ \ingroup examples
+ \title Biff (UNIX only)
+
+ Biff is a simple graphical program to indicate whether there is new
+ mail; it looks exactly like xbiff but is much shorter.
+
+ <hr>
+
+ Header file:
+
+ \include biff/biff.h
+
+ <hr>
+
+ \e biff.cpp implements this custom widget. Note in particular
+ how two images (\e hasmail_bmp_data and \e nomail_bmp_data, both from
+ \e bmp.cpp) are included into the executable.
+
+ \include biff/biff.cpp
+
+ <hr>
+
+ Main:
+
+ \include biff/main.cpp
+*/
+
diff --git a/examples/biff/biff.h b/examples/biff/biff.h
new file mode 100644
index 000000000..e35114ad3
--- /dev/null
+++ b/examples/biff/biff.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef BIFF_H
+#define BIFF_H
+
+#include <qwidget.h>
+#include <qdatetime.h>
+#include <qpixmap.h>
+
+
+class Biff : public TQWidget
+{
+ Q_OBJECT
+public:
+ Biff( TQWidget *parent=0, const char *name=0 );
+
+protected:
+ void timerEvent( TQTimerEvent * );
+ void paintEvent( TQPaintEvent * );
+ void mousePressEvent( TQMouseEvent * );
+
+private:
+ TQDateTime lastModified;
+ TQPixmap hasNewMail;
+ TQPixmap noNewMail;
+ TQString mailbox;
+ bool gotMail;
+};
+
+
+#endif // BIFF_H
diff --git a/examples/biff/biff.pro b/examples/biff/biff.pro
new file mode 100644
index 000000000..45f16f246
--- /dev/null
+++ b/examples/biff/biff.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = biff
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = biff.h
+SOURCES = biff.cpp \
+ main.cpp
diff --git a/examples/biff/bmp.cpp b/examples/biff/bmp.cpp
new file mode 100644
index 000000000..60eff58ea
--- /dev/null
+++ b/examples/biff/bmp.cpp
@@ -0,0 +1,191 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+static const unsigned int hasmail_bmp_len = 1218;
+static const unsigned char hasmail_bmp_data[] = {
+ 0x42,0x4d,0xc2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,
+ 0x28,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x6d,0x0b,0x00,0x00,
+ 0x6d,0x0b,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0xff,0xff,0x00,0x51,0x61,0x30,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+ 0x10,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,
+ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x00,0x10,0x10,0x10,
+ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,
+ 0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+ 0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,
+ 0x00,0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x00,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10,
+ 0x10,0x10,0x10,0x10,0x10,0x11,0x00,0x01,0x00,0x00,0x01,0x10,0x10,0x10,
+ 0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+ 0x01,0x01,0x00,0x01,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+ 0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x00,0x01,
+ 0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x00,0x00,0x01,0x01,
+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10,0x10,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10,
+ 0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x00,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
+ 0x00,0x10,0x10,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,
+ 0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x01,0x01,0x01,
+ 0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,0x10,0x10,0x01,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x10,0x11,0x00,0x10,0x10,0x10,0x10,0x10,0x10,
+ 0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x10,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,
+ 0x10,0x10,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x11,
+ 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x01,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x01,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10,
+ 0x10,0x11,0x01,0x10,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x10,
+ 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x01,0x10,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x11,0x10,
+ 0x10,0x10,0x10,0x10,0x01,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x11,0x11,0x11,0x10,0x01,0x10,0x10,0x10,0x01,0x00,0x10,0x10,
+ 0x01,0x10,0x00,0x00,0x00,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x00,0x00,
+ 0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x01,0x10,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x01,0x11,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x01,0x10,0x01,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x10,
+ 0x01,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x10,0x00,0x01,0x11,0x11,0x10,0x00,0x01,0x11,0x01,0x11,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x11,0x00,0x10,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x11,0x01,0x11,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x11,0x11,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x11,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x01,0x11,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,
+ 0x01,0x11,0x00,0x00,0x01,0x11,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10,0x00,0x00,
+ 0x01,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x11,0x11,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x01,0x10,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,
+ 0x00,0x00,0x01,0x11,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x01,0x11,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x10,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,
+ 0x01,0x10,0x10,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x11,0x01,0x01,
+ 0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x11,0x11,0x01,0x11,0x10,0x10,0x10,0x11,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x11,0x11,0x01,0x11,0x01,0x01,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,
+ 0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+static const unsigned int nomail_bmp_len = 1222;
+static const unsigned char nomail_bmp_data[] = {
+ 0x42,0x4d,0xc6,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,
+ 0x28,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x6d,0x0b,0x00,0x00,
+ 0x6d,0x0b,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0xff,0xff,0x00,0x38,0x30,0x61,0x00,0xa6,0x8a,0xff,0x00,
+ 0x01,0x01,0x01,0x01,0x11,0x01,0x11,0x10,0x11,0x10,0x11,0x01,0x01,0x11,
+ 0x01,0x11,0x11,0x01,0x11,0x10,0x01,0x10,0x01,0x11,0x10,0x01,0x11,0x01,
+ 0x11,0x11,0x00,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x01,0x11,
+ 0x10,0x00,0x00,0x01,0x11,0x01,0x01,0x00,0x01,0x10,0x00,0x10,0x10,0x00,
+ 0x00,0x10,0x01,0x10,0x10,0x01,0x00,0x01,0x10,0x11,0x01,0x00,0x10,0x10,
+ 0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x11,0x10,
+ 0x11,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x11,0x10,0x00,0x00,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,
+ 0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,
+ 0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,
+ 0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x10,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,
+ 0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x00,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x10,0x01,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x10,0x01,0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x10,
+ 0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x00,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x10,0x01,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,
+ 0x11,0x11,0x11,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x01,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x10,0x01,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x01,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x10,0x01,0x11,0x11,0x11,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x00,
+ 0x11,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x00,0x01,0x01,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x10,0x01,
+ 0x11,0x11,0x10,0x01,0x11,0x00,0x01,0x01,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x10,0x00,0x00,0x01,0x11,0x10,0x00,
+ 0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x01,0x11,0x00,0x00,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x00,0x10,0x00,0x11,0x10,0x00,0x01,0x11,0x00,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x10,
+ 0x01,0x11,0x00,0x01,0x11,0x00,0x00,0x11,0x00,0x01,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x10,0x00,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x10,0x00,
+ 0x11,0x01,0x00,0x01,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x00,0x01,0x11,0x11,0x10,0x00,0x11,0x11,0x11,0x00,0x01,0x01,0x10,0x00,
+ 0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00,
+ 0x00,0x01,0x11,0x11,0x11,0x10,0x00,0x01,0x11,0x00,0x00,0x01,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x11,0x11,
+ 0x11,0x11,0x00,0x01,0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,
+ 0x11,0x11,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x10,0x01,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x01,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x00,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x00,0x01,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x01,0x11,
+ 0x10,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
+ 0x11,0x11,0x11,0x11
+};
diff --git a/examples/biff/main.cpp b/examples/biff/main.cpp
new file mode 100644
index 000000000..33faa7b9d
--- /dev/null
+++ b/examples/biff/main.cpp
@@ -0,0 +1,21 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "biff.h"
+
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ Biff b;
+ a.setMainWidget( &b );
+ b.show();
+ return a.exec();
+}
diff --git a/examples/buttongroups/README b/examples/buttongroups/README
new file mode 100644
index 000000000..f97539602
--- /dev/null
+++ b/examples/buttongroups/README
@@ -0,0 +1,13 @@
+This example program shows how to use
+
+ - different types of buttons
+ - different types of groupboxes
+
+The buttons which are used are radiobuttons, checkboxes (also tristate
+checkboxes), normal pusbuttons and toggleable pushbuttons. These
+buttons are seperated in four groups using groupboxes. The example
+shows how to make a buttongroup totally exclusive (only one button can
+be checked), exclusive for radiobuttons only or non-exclusive. It
+also demonstrates how buttons (and other widgets) can be laid out
+in rows and columns using a groupbox.
+
diff --git a/examples/buttongroups/buttongroups.cpp b/examples/buttongroups/buttongroups.cpp
new file mode 100644
index 000000000..f9859d3e2
--- /dev/null
+++ b/examples/buttongroups/buttongroups.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "buttongroups.h"
+
+#include <qpopupmenu.h>
+#include <qbuttongroup.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+
+/*
+ * Constructor
+ *
+ * Creates all child widgets of the ButtonGroups window
+ */
+
+ButtonsGroups::ButtonsGroups( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ // Create Widgets which allow easy layouting
+ TQVBoxLayout *vbox = new TQVBoxLayout( this, 11, 6 );
+ TQHBoxLayout *box1 = new TQHBoxLayout( vbox );
+ TQHBoxLayout *box2 = new TQHBoxLayout( vbox );
+
+ // ------- first group
+
+ // Create an exclusive button group
+ TQButtonGroup *bgrp1 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Button Group 1 (exclusive)", this);
+ box1->addWidget( bgrp1 );
+ bgrp1->setExclusive( TRUE );
+
+ // insert 3 radiobuttons
+ TQRadioButton *rb11 = new TQRadioButton( "&Radiobutton 1", bgrp1 );
+ rb11->setChecked( TRUE );
+ (void)new TQRadioButton( "R&adiobutton 2", bgrp1 );
+ (void)new TQRadioButton( "Ra&diobutton 3", bgrp1 );
+
+ // ------- second group
+
+ // Create a non-exclusive buttongroup
+ TQButtonGroup *bgrp2 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Button Group 2 (non-exclusive)", this );
+ box1->addWidget( bgrp2 );
+ bgrp2->setExclusive( FALSE );
+
+ // insert 3 checkboxes
+ (void)new TQCheckBox( "&Checkbox 1", bgrp2 );
+ TQCheckBox *cb12 = new TQCheckBox( "C&heckbox 2", bgrp2 );
+ cb12->setChecked( TRUE );
+ TQCheckBox *cb13 = new TQCheckBox( "Triple &State Button", bgrp2 );
+ cb13->setTristate( TRUE );
+ cb13->setChecked( TRUE );
+
+ // ------------ third group
+
+ // create a buttongroup which is exclusive for radiobuttons and non-exclusive for all other buttons
+ TQButtonGroup *bgrp3 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Button Group 3 (Radiobutton-exclusive)", this );
+ box2->addWidget( bgrp3 );
+ bgrp3->setRadioButtonExclusive( TRUE );
+
+ // insert three radiobuttons
+ rb21 = new TQRadioButton( "Rad&iobutton 1", bgrp3 );
+ rb22 = new TQRadioButton( "Radi&obutton 2", bgrp3 );
+ rb23 = new TQRadioButton( "Radio&button 3", bgrp3 );
+ rb23->setChecked( TRUE );
+
+ // insert a checkbox...
+ state = new TQCheckBox( "E&nable Radiobuttons", bgrp3 );
+ state->setChecked( TRUE );
+ // ...and connect its SIGNAL clicked() with the SLOT slotChangeGrp3State()
+ connect( state, SIGNAL( clicked() ), this, SLOT( slotChangeGrp3State() ) );
+
+ // ------------ fourth group
+
+ // create a groupbox which layouts its childs in a columns
+ TQGroupBox *bgrp4 = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Groupbox with normal buttons", this );
+ box2->addWidget( bgrp4 );
+
+ // insert four pushbuttons...
+ (void)new TQPushButton( "&Push Button", bgrp4, "push" );
+
+ // now make the second one a toggle button
+ TQPushButton *tb2 = new TQPushButton( "&Toggle Button", bgrp4, "toggle" );
+ tb2->setToggleButton( TRUE );
+ tb2->setOn( TRUE );
+
+ // ... and make the third one a flat button
+ TQPushButton *tb3 = new TQPushButton( "&Flat Button", bgrp4, "flat" );
+ tb3->setFlat(TRUE);
+
+ // .. and the fourth a button with a menu
+ TQPushButton *tb4 = new TQPushButton( "Popup Button", bgrp4, "popup" );
+ TQPopupMenu *menu = new TQPopupMenu(tb4);
+ menu->insertItem("Item1", 0);
+ menu->insertItem("Item2", 1);
+ menu->insertItem("Item3", 2);
+ menu->insertItem("Item4", 3);
+ tb4->setPopup(menu);
+}
+
+/*
+ * SLOT slotChangeGrp3State()
+ *
+ * enables/disables the radiobuttons of the third buttongroup
+ */
+
+void ButtonsGroups::slotChangeGrp3State()
+{
+ rb21->setEnabled( state->isChecked() );
+ rb22->setEnabled( state->isChecked() );
+ rb23->setEnabled( state->isChecked() );
+}
diff --git a/examples/buttongroups/buttongroups.doc b/examples/buttongroups/buttongroups.doc
new file mode 100644
index 000000000..439cce7b1
--- /dev/null
+++ b/examples/buttongroups/buttongroups.doc
@@ -0,0 +1,27 @@
+/*
+*/
+/*! \page buttongroups-example.html
+
+ \ingroup examples
+ \title Buttons and Groupboxes
+
+ This example shows different types of groupboxes (buttongroups, etc.) and
+ different kinds of buttons (checkboxes, radiobuttons, pushbuttons, etc.).
+
+ <hr>
+
+ Header file:
+
+ \include buttongroups/buttongroups.h
+
+ <hr>
+
+ Implementation:
+
+ \include buttongroups/buttongroups.cpp
+
+ <hr>
+
+ Main:
+ \include buttongroups/main.cpp
+*/
diff --git a/examples/buttongroups/buttongroups.h b/examples/buttongroups/buttongroups.h
new file mode 100644
index 000000000..3c498a3ce
--- /dev/null
+++ b/examples/buttongroups/buttongroups.h
@@ -0,0 +1,34 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef BUTTONS_GROUPS_H
+#define BUTTONS_GROUPS_H
+
+#include <qwidget.h>
+
+class TQCheckBox;
+class TQRadioButton;
+
+class ButtonsGroups : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ ButtonsGroups( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ TQCheckBox *state;
+ TQRadioButton *rb21, *rb22, *rb23;
+
+protected slots:
+ void slotChangeGrp3State();
+
+};
+
+#endif
diff --git a/examples/buttongroups/buttongroups.pro b/examples/buttongroups/buttongroups.pro
new file mode 100644
index 000000000..cfad62e15
--- /dev/null
+++ b/examples/buttongroups/buttongroups.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = buttongroups
+
+CONFIG += qt warn_on release
+
+REQUIRES = small-config
+
+HEADERS = buttongroups.h
+SOURCES = buttongroups.cpp \
+ main.cpp
diff --git a/examples/buttongroups/main.cpp b/examples/buttongroups/main.cpp
new file mode 100644
index 000000000..771dd35b8
--- /dev/null
+++ b/examples/buttongroups/main.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "buttongroups.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ ButtonsGroups buttonsgroups;
+ buttonsgroups.resize( 500, 250 );
+ buttonsgroups.setCaption( "TQt Example - Buttongroups" );
+ a.setMainWidget( &buttonsgroups );
+ buttonsgroups.show();
+
+ return a.exec();
+}
diff --git a/examples/canvas/blendshadow.cpp b/examples/canvas/blendshadow.cpp
new file mode 100644
index 000000000..deb18a4a1
--- /dev/null
+++ b/examples/canvas/blendshadow.cpp
@@ -0,0 +1,53 @@
+#include <qimage.h>
+#include <qcolor.h>
+
+static inline int blendComponent( int v, int av, int s, int as )
+{
+ return as*s + av*v -(av*as*s)/255;
+}
+
+static inline TQRgb blendShade( TQRgb v, TQRgb s )
+{
+ //shadow image is already reduced and blurred
+ int as = qAlpha(s);
+ int av = qAlpha(v);
+ if ( as == 0 || av == 255 )
+ return v;
+
+ int a = as + av -(as*av)/255;
+
+ int r = blendComponent( qRed(v),av, qRed(s), as)/a;
+ int g = blendComponent( qGreen(v),av, qGreen(s), as)/a;
+ int b = blendComponent( qBlue(v),av, qBlue(s), as)/a;
+
+ return qRgba(r,g,b,a);
+}
+
+
+
+int main( int*, char**)
+{
+ TQImage image( "out.png" );
+ image.convertDepth( 32 );
+ TQImage shade( "outshade.png" );
+ shade.convertDepth( 32 );
+ int dx = 10;
+ int dy = 5;
+
+ int w = image.width();
+ int h = image.height();
+
+ TQImage img( w+dx, h+dy, 32 );
+ img.setAlphaBuffer( TRUE );
+
+ for ( int y = 0; y < h+dy; y++ ) {
+ for ( int x = 0; x < w+dx; x++ ) {
+ TQRgb sh = (x<dx||y<dy) ? 0 : shade.pixel( x-dx, y-dy );
+ TQRgb pixel = (x<w&y<h) ? image.pixel( x, y ) : 0;
+ img.setPixel( x, y, blendShade( pixel, sh ) );
+ }
+ }
+ img.save("blend.png", "PNG" );
+}
+
+
diff --git a/examples/canvas/butterfly.png b/examples/canvas/butterfly.png
new file mode 100644
index 000000000..619f25306
--- /dev/null
+++ b/examples/canvas/butterfly.png
Binary files differ
diff --git a/examples/canvas/canvas.cpp b/examples/canvas/canvas.cpp
new file mode 100644
index 000000000..0be872859
--- /dev/null
+++ b/examples/canvas/canvas.cpp
@@ -0,0 +1,747 @@
+#include <qdatetime.h>
+#include <qmainwindow.h>
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qmenubar.h>
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qprinter.h>
+#include <qlabel.h>
+#include <qimage.h>
+#include <qprogressdialog.h>
+#include "canvas.h"
+
+#include <stdlib.h>
+
+// We use a global variable to save memory - all the brushes and pens in
+// the mesh are shared.
+static TQBrush *tb = 0;
+static TQPen *tp = 0;
+
+class EdgeItem;
+class NodeItem;
+
+class EdgeItem: public TQCanvasLine
+{
+public:
+ EdgeItem( NodeItem*, NodeItem*, TQCanvas *canvas );
+ void setFromPoint( int x, int y ) ;
+ void setToPoint( int x, int y );
+ static int count() { return c; }
+ void moveBy(double dx, double dy);
+private:
+ static int c;
+};
+
+static const int imageRTTI = 984376;
+
+
+class ImageItem: public TQCanvasRectangle
+{
+public:
+ ImageItem( TQImage img, TQCanvas *canvas );
+ int rtti () const { return imageRTTI; }
+ bool hit( const TQPoint&) const;
+protected:
+ void drawShape( TQPainter & );
+private:
+ TQImage image;
+ TQPixmap pixmap;
+};
+
+
+ImageItem::ImageItem( TQImage img, TQCanvas *canvas )
+ : TQCanvasRectangle( canvas ), image(img)
+{
+ setSize( image.width(), image.height() );
+
+#if !defined(Q_WS_QWS)
+ pixmap.convertFromImage(image, OrderedAlphaDither);
+#endif
+}
+
+
+void ImageItem::drawShape( TQPainter &p )
+{
+// On TQt/Embedded, we can paint a TQImage as fast as a TQPixmap,
+// but on other platforms, we need to use a TQPixmap.
+#if defined(Q_WS_QWS)
+ p.drawImage( int(x()), int(y()), image, 0, 0, -1, -1, OrderedAlphaDither );
+#else
+ p.drawPixmap( int(x()), int(y()), pixmap );
+#endif
+}
+
+bool ImageItem::hit( const TQPoint &p ) const
+{
+ int ix = p.x()-int(x());
+ int iy = p.y()-int(y());
+ if ( !image.valid( ix , iy ) )
+ return FALSE;
+ TQRgb pixel = image.pixel( ix, iy );
+ return qAlpha( pixel ) != 0;
+}
+
+class NodeItem: public TQCanvasEllipse
+{
+public:
+ NodeItem( TQCanvas *canvas );
+ ~NodeItem() {}
+
+ void addInEdge( EdgeItem *edge ) { inList.append( edge ); }
+ void addOutEdge( EdgeItem *edge ) { outList.append( edge ); }
+
+ void moveBy(double dx, double dy);
+
+ // TQPoint center() { return boundingRect().center(); }
+private:
+ TQPtrList<EdgeItem> inList;
+ TQPtrList<EdgeItem> outList;
+};
+
+
+int EdgeItem::c = 0;
+
+
+void EdgeItem::moveBy(double, double)
+{
+ //nothing
+}
+
+EdgeItem::EdgeItem( NodeItem *from, NodeItem *to, TQCanvas *canvas )
+ : TQCanvasLine( canvas )
+{
+ c++;
+ 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)
+{
+ TQCanvasEllipse::moveBy( dx, dy );
+
+ TQPtrListIterator<EdgeItem> it1( inList );
+ EdgeItem *edge;
+ while (( edge = it1.current() )) {
+ ++it1;
+ edge->setToPoint( int(x()), int(y()) );
+ }
+ TQPtrListIterator<EdgeItem> it2( outList );
+ while (( edge = it2.current() )) {
+ ++it2;
+ edge->setFromPoint( int(x()), int(y()) );
+ }
+}
+
+NodeItem::NodeItem( TQCanvas *canvas )
+ : TQCanvasEllipse( 6, 6, canvas )
+{
+ setPen( *tp );
+ setBrush( *tb );
+ setZ( 128 );
+}
+
+FigureEditor::FigureEditor(
+ TQCanvas& c, TQWidget* parent,
+ const char* name, WFlags f) :
+ TQCanvasView(&c,parent,name,f)
+{
+}
+
+void FigureEditor::contentsMousePressEvent(TQMouseEvent* e)
+{
+ TQPoint p = inverseWorldMatrix().map(e->pos());
+ TQCanvasItemList l=canvas()->collisions(p);
+ for (TQCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) {
+ if ( (*it)->rtti() == imageRTTI ) {
+ ImageItem *item= (ImageItem*)(*it);
+ if ( !item->hit( p ) )
+ continue;
+ }
+ moving = *it;
+ moving_start = p;
+ return;
+ }
+ moving = 0;
+}
+
+void FigureEditor::clear()
+{
+ TQCanvasItemList list = canvas()->allItems();
+ TQCanvasItemList::Iterator it = list.begin();
+ for (; it != list.end(); ++it) {
+ if ( *it )
+ delete *it;
+ }
+}
+
+void FigureEditor::contentsMouseMoveEvent(TQMouseEvent* e)
+{
+ if ( moving ) {
+ TQPoint p = inverseWorldMatrix().map(e->pos());
+ moving->moveBy(p.x() - moving_start.x(),
+ p.y() - moving_start.y());
+ moving_start = p;
+ canvas()->update();
+ }
+}
+
+
+
+BouncyLogo::BouncyLogo(TQCanvas* canvas) :
+ TQCanvasSprite(0,canvas)
+{
+ static TQCanvasPixmapArray logo("qt-trans.xpm");
+ setSequence(&logo);
+ setAnimated(TRUE);
+ initPos();
+}
+
+
+const int logo_rtti = 1234;
+
+int BouncyLogo::rtti() const
+{
+ return logo_rtti;
+}
+
+void BouncyLogo::initPos()
+{
+ initSpeed();
+ int trial=1000;
+ do {
+ move(rand()%canvas()->width(),rand()%canvas()->height());
+ advance(0);
+ } while (trial-- && xVelocity()==0.0 && yVelocity()==0.0);
+}
+
+void BouncyLogo::initSpeed()
+{
+ const double speed = 4.0;
+ double d = (double)(rand()%1024) / 1024.0;
+ setVelocity( d*speed*2-speed, (1-d)*speed*2-speed );
+}
+
+void BouncyLogo::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();
+ }
+
+ double nx = x() + vx;
+ double ny = y() + vy;
+
+ if ( nx < 0 || nx >= canvas()->width() )
+ vx = -vx;
+ if ( ny < 0 || ny >= canvas()->height() )
+ vy = -vy;
+
+ for (int bounce=0; bounce<4; bounce++) {
+ TQCanvasItemList l=collisions(FALSE);
+ for (TQCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) {
+ TQCanvasItem *hit = *it;
+ if ( hit->rtti()==logo_rtti && hit->collidesWith(this) ) {
+ switch ( bounce ) {
+ case 0:
+ vx = -vx;
+ break;
+ case 1:
+ vy = -vy;
+ vx = -vx;
+ break;
+ case 2:
+ vx = -vx;
+ break;
+ case 3:
+ // Stop for this turn
+ vx = 0;
+ vy = 0;
+ break;
+ }
+ setVelocity(vx,vy);
+ break;
+ }
+ }
+ }
+
+ if ( x()+vx < 0 || x()+vx >= canvas()->width() )
+ vx = 0;
+ if ( y()+vy < 0 || y()+vy >= canvas()->height() )
+ vy = 0;
+
+ setVelocity(vx,vy);
+ } break;
+ case 1:
+ TQCanvasItem::advance(stage);
+ break;
+ }
+}
+
+static uint mainCount = 0;
+static TQImage *butterflyimg;
+static TQImage *logoimg;
+
+Main::Main(TQCanvas& c, TQWidget* parent, const char* name, WFlags f) :
+ TQMainWindow(parent,name,f),
+ canvas(c)
+{
+ editor = new FigureEditor(canvas,this);
+ TQMenuBar* menu = menuBar();
+
+ TQPopupMenu* file = new TQPopupMenu( menu );
+ file->insertItem("&Fill canvas", this, SLOT(init()), CTRL+Key_F);
+ file->insertItem("&Erase canvas", this, SLOT(clear()), CTRL+Key_E);
+ file->insertItem("&New view", this, SLOT(newView()), CTRL+Key_N);
+ file->insertSeparator();
+ file->insertItem("&Print...", this, SLOT(print()), CTRL+Key_P);
+ file->insertSeparator();
+ file->insertItem("E&xit", qApp, SLOT(tquit()), CTRL+Key_Q);
+ menu->insertItem("&File", file);
+
+ TQPopupMenu* edit = new TQPopupMenu( menu );
+ edit->insertItem("Add &Circle", this, SLOT(addCircle()), ALT+Key_C);
+ edit->insertItem("Add &Hexagon", this, SLOT(addHexagon()), ALT+Key_H);
+ edit->insertItem("Add &Polygon", this, SLOT(addPolygon()), ALT+Key_P);
+ edit->insertItem("Add Spl&ine", this, SLOT(addSpline()), ALT+Key_I);
+ edit->insertItem("Add &Text", this, SLOT(addText()), ALT+Key_T);
+ edit->insertItem("Add &Line", this, SLOT(addLine()), ALT+Key_L);
+ edit->insertItem("Add &Rectangle", this, SLOT(addRectangle()), ALT+Key_R);
+ edit->insertItem("Add &Sprite", this, SLOT(addSprite()), ALT+Key_S);
+ edit->insertItem("Create &Mesh", this, SLOT(addMesh()), ALT+Key_M );
+ edit->insertItem("Add &Alpha-blended image", this, SLOT(addButterfly()), ALT+Key_A);
+ menu->insertItem("&Edit", edit);
+
+ TQPopupMenu* view = new TQPopupMenu( menu );
+ view->insertItem("&Enlarge", this, SLOT(enlarge()), SHIFT+CTRL+Key_Plus);
+ view->insertItem("Shr&ink", this, SLOT(shrink()), SHIFT+CTRL+Key_Minus);
+ view->insertSeparator();
+ view->insertItem("&Rotate clockwise", this, SLOT(rotateClockwise()), CTRL+Key_PageDown);
+ view->insertItem("Rotate &counterclockwise", this, SLOT(rotateCounterClockwise()), CTRL+Key_PageUp);
+ view->insertItem("&Zoom in", this, SLOT(zoomIn()), CTRL+Key_Plus);
+ view->insertItem("Zoom &out", this, SLOT(zoomOut()), CTRL+Key_Minus);
+ view->insertItem("Translate left", this, SLOT(moveL()), CTRL+Key_Left);
+ view->insertItem("Translate right", this, SLOT(moveR()), CTRL+Key_Right);
+ view->insertItem("Translate up", this, SLOT(moveU()), CTRL+Key_Up);
+ view->insertItem("Translate down", this, SLOT(moveD()), CTRL+Key_Down);
+ view->insertItem("&Mirror", this, SLOT(mirror()), CTRL+Key_Home);
+ menu->insertItem("&View", view);
+
+ options = new TQPopupMenu( menu );
+ dbf_id = options->insertItem("Double buffer", this, SLOT(toggleDoubleBuffer()));
+ options->setItemChecked(dbf_id, TRUE);
+ menu->insertItem("&Options",options);
+
+ menu->insertSeparator();
+
+ TQPopupMenu* help = new TQPopupMenu( menu );
+ help->insertItem("&About", this, SLOT(help()), Key_F1);
+ help->setItemChecked(dbf_id, TRUE);
+ menu->insertItem("&Help",help);
+
+ statusBar();
+
+ setCentralWidget(editor);
+
+ printer = 0;
+
+ init();
+}
+
+void Main::init()
+{
+ clear();
+
+ static int r=24;
+ srand(++r);
+
+ mainCount++;
+ butterflyimg = 0;
+ logoimg = 0;
+
+ int i;
+ for ( i=0; i<canvas.width() / 56; i++) {
+ addButterfly();
+ }
+ for ( i=0; i<canvas.width() / 85; i++) {
+ addHexagon();
+ }
+ for ( i=0; i<canvas.width() / 128; i++) {
+ addLogo();
+ }
+}
+
+Main::~Main()
+{
+ delete printer;
+ if ( !--mainCount ) {
+ delete[] butterflyimg;
+ butterflyimg = 0;
+ delete[] logoimg;
+ logoimg = 0;
+ }
+}
+
+void Main::newView()
+{
+ // Open a new view... have it delete when closed.
+ Main *m = new Main(canvas, 0, 0, WDestructiveClose);
+ qApp->setMainWidget(m);
+ m->show();
+ qApp->setMainWidget(0);
+}
+
+void Main::clear()
+{
+ editor->clear();
+}
+
+void Main::help()
+{
+ static TQMessageBox* about = new TQMessageBox( "TQt Canvas Example",
+ "<h3>The TQCanvas classes example</h3>"
+ "<ul>"
+ "<li> Press ALT-S for some sprites."
+ "<li> Press ALT-C for some circles."
+ "<li> Press ALT-L for some lines."
+ "<li> Drag the objects around."
+ "<li> Read the code!"
+ "</ul>", TQMessageBox::Information, 1, 0, 0, this, 0, FALSE );
+ about->setButtonText( 1, "Dismiss" );
+ about->show();
+}
+
+void Main::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQt Canvas Example" );
+}
+
+void Main::toggleDoubleBuffer()
+{
+ bool s = !options->isItemChecked(dbf_id);
+ options->setItemChecked(dbf_id,s);
+ canvas.setDoubleBuffering(s);
+}
+
+void Main::enlarge()
+{
+ canvas.resize(canvas.width()*4/3, canvas.height()*4/3);
+}
+
+void Main::shrink()
+{
+ canvas.resize(canvas.width()*3/4, canvas.height()*3/4);
+}
+
+void Main::rotateClockwise()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.rotate( 22.5 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::rotateCounterClockwise()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.rotate( -22.5 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::zoomIn()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.scale( 2.0, 2.0 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::zoomOut()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.scale( 0.5, 0.5 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::mirror()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.scale( -1, 1 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::moveL()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.translate( -16, 0 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::moveR()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.translate( +16, 0 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::moveU()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.translate( 0, -16 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::moveD()
+{
+ TQWMatrix m = editor->worldMatrix();
+ m.translate( 0, +16 );
+ editor->setWorldMatrix( m );
+}
+
+void Main::print()
+{
+ if ( !printer ) printer = new TQPrinter;
+ if ( printer->setup(this) ) {
+ TQPainter pp(printer);
+ canvas.drawArea(TQRect(0,0,canvas.width(),canvas.height()),&pp,FALSE);
+ }
+}
+
+
+void Main::addSprite()
+{
+ TQCanvasItem* i = new BouncyLogo(&canvas);
+ i->setZ(rand()%256);
+ i->show();
+}
+
+TQString butterfly_fn;
+TQString logo_fn;
+
+
+void Main::addButterfly()
+{
+ if ( butterfly_fn.isEmpty() )
+ return;
+ if ( !butterflyimg ) {
+ butterflyimg = new TQImage[4];
+ butterflyimg[0].load( butterfly_fn );
+ butterflyimg[1] = butterflyimg[0].smoothScale( int(butterflyimg[0].width()*0.75),
+ int(butterflyimg[0].height()*0.75) );
+ butterflyimg[2] = butterflyimg[0].smoothScale( int(butterflyimg[0].width()*0.5),
+ int(butterflyimg[0].height()*0.5) );
+ butterflyimg[3] = butterflyimg[0].smoothScale( int(butterflyimg[0].width()*0.25),
+ int(butterflyimg[0].height()*0.25) );
+ }
+ TQCanvasPolygonalItem* i = new ImageItem(butterflyimg[rand()%4],&canvas);
+ i->move(rand()%(canvas.width()-butterflyimg->width()),
+ rand()%(canvas.height()-butterflyimg->height()));
+ i->setZ(rand()%256+250);
+ i->show();
+}
+
+void Main::addLogo()
+{
+ if ( logo_fn.isEmpty() )
+ return;
+ if ( !logoimg ) {
+ logoimg = new TQImage[4];
+ logoimg[0].load( logo_fn );
+ logoimg[1] = logoimg[0].smoothScale( int(logoimg[0].width()*0.75),
+ int(logoimg[0].height()*0.75) );
+ logoimg[2] = logoimg[0].smoothScale( int(logoimg[0].width()*0.5),
+ int(logoimg[0].height()*0.5) );
+ logoimg[3] = logoimg[0].smoothScale( int(logoimg[0].width()*0.25),
+ int(logoimg[0].height()*0.25) );
+ }
+ TQCanvasPolygonalItem* i = new ImageItem(logoimg[rand()%4],&canvas);
+ i->move(rand()%(canvas.width()-logoimg->width()),
+ rand()%(canvas.height()-logoimg->width()));
+ i->setZ(rand()%256+256);
+ i->show();
+}
+
+
+
+void Main::addCircle()
+{
+ TQCanvasPolygonalItem* i = new TQCanvasEllipse(50,50,&canvas);
+ i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) );
+ i->move(rand()%canvas.width(),rand()%canvas.height());
+ i->setZ(rand()%256);
+ i->show();
+}
+
+void Main::addHexagon()
+{
+ TQCanvasPolygon* i = new TQCanvasPolygon(&canvas);
+ const int size = canvas.width() / 25;
+ TQPointArray pa(6);
+ pa[0] = TQPoint(2*size,0);
+ pa[1] = TQPoint(size,-size*173/100);
+ pa[2] = TQPoint(-size,-size*173/100);
+ pa[3] = TQPoint(-2*size,0);
+ pa[4] = TQPoint(-size,size*173/100);
+ pa[5] = TQPoint(size,size*173/100);
+ i->setPoints(pa);
+ i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) );
+ i->move(rand()%canvas.width(),rand()%canvas.height());
+ i->setZ(rand()%256);
+ i->show();
+}
+
+void Main::addPolygon()
+{
+ TQCanvasPolygon* i = new TQCanvasPolygon(&canvas);
+ const int size = canvas.width()/2;
+ TQPointArray pa(6);
+ pa[0] = TQPoint(0,0);
+ pa[1] = TQPoint(size,size/5);
+ pa[2] = TQPoint(size*4/5,size);
+ pa[3] = TQPoint(size/6,size*5/4);
+ pa[4] = TQPoint(size*3/4,size*3/4);
+ pa[5] = TQPoint(size*3/4,size/4);
+ i->setPoints(pa);
+ i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) );
+ i->move(rand()%canvas.width(),rand()%canvas.height());
+ i->setZ(rand()%256);
+ i->show();
+}
+
+void Main::addSpline()
+{
+ TQCanvasSpline* i = new TQCanvasSpline(&canvas);
+ const int size = canvas.width()/6;
+ TQPointArray pa(12);
+ pa[0] = TQPoint(0,0);
+ pa[1] = TQPoint(size/2,0);
+ pa[2] = TQPoint(size,size/2);
+ pa[3] = TQPoint(size,size);
+ pa[4] = TQPoint(size,size*3/2);
+ pa[5] = TQPoint(size/2,size*2);
+ pa[6] = TQPoint(0,size*2);
+ pa[7] = TQPoint(-size/2,size*2);
+ pa[8] = TQPoint(size/4,size*3/2);
+ pa[9] = TQPoint(0,size);
+ pa[10]= TQPoint(-size/4,size/2);
+ pa[11]= TQPoint(-size/2,0);
+ i->setControlPoints(pa);
+ i->setBrush( TQColor(rand()%32*8,rand()%32*8,rand()%32*8) );
+ i->move(rand()%canvas.width(),rand()%canvas.height());
+ i->setZ(rand()%256);
+ i->show();
+}
+
+void Main::addText()
+{
+ TQCanvasText* i = new TQCanvasText(&canvas);
+ i->setText("TQCanvasText");
+ i->move(rand()%canvas.width(),rand()%canvas.height());
+ i->setZ(rand()%256);
+ i->show();
+}
+
+void Main::addLine()
+{
+ TQCanvasLine* i = new TQCanvasLine(&canvas);
+ i->setPoints( rand()%canvas.width(), rand()%canvas.height(),
+ rand()%canvas.width(), rand()%canvas.height() );
+ i->setPen( TQPen(TQColor(rand()%32*8,rand()%32*8,rand()%32*8), 6) );
+ i->setZ(rand()%256);
+ i->show();
+}
+
+void Main::addMesh()
+{
+ int x0 = 0;
+ int y0 = 0;
+
+ if ( !tb ) tb = new TQBrush( TQt::red );
+ if ( !tp ) tp = new TQPen( TQt::black );
+
+ int nodecount = 0;
+
+ int w = canvas.width();
+ int h = canvas.height();
+
+ const int dist = 30;
+ int rows = h / dist;
+ int cols = w / dist;
+
+#ifndef QT_NO_PROGRESSDIALOG
+ TQProgressDialog progress( "Creating mesh...", "Abort", rows,
+ this, "progress", TRUE );
+#endif
+
+ TQMemArray<NodeItem*> lastRow(cols);
+ for ( int j = 0; j < rows; j++ ) {
+ int n = j%2 ? cols-1 : cols;
+ NodeItem *prev = 0;
+ for ( int i = 0; i < n; i++ ) {
+ NodeItem *el = new NodeItem( &canvas );
+ nodecount++;
+ int r = rand();
+ int xrand = r %20;
+ int yrand = (r/20) %20;
+ el->move( xrand + x0 + i*dist + (j%2 ? dist/2 : 0 ),
+ yrand + y0 + j*dist );
+
+ if ( j > 0 ) {
+ if ( i < cols-1 )
+ (new EdgeItem( lastRow[i], el, &canvas ))->show();
+ if ( j%2 )
+ (new EdgeItem( lastRow[i+1], el, &canvas ))->show();
+ else if ( i > 0 )
+ (new EdgeItem( lastRow[i-1], el, &canvas ))->show();
+ }
+ if ( prev ) {
+ (new EdgeItem( prev, el, &canvas ))->show();
+ }
+ if ( i > 0 ) lastRow[i-1] = prev;
+ prev = el;
+ el->show();
+ }
+ lastRow[n-1]=prev;
+#ifndef QT_NO_PROGRESSDIALOG
+ progress.setProgress( j );
+ if ( progress.wasCancelled() )
+ break;
+#endif
+ }
+#ifndef QT_NO_PROGRESSDIALOG
+ progress.setProgress( rows );
+#endif
+ // qDebug( "%d nodes, %d edges", nodecount, EdgeItem::count() );
+}
+
+void Main::addRectangle()
+{
+ TQCanvasPolygonalItem *i = new TQCanvasRectangle( rand()%canvas.width(),rand()%canvas.height(),
+ canvas.width()/5,canvas.width()/5,&canvas);
+ int z = rand()%256;
+ i->setBrush( TQColor(z,z,z) );
+ i->setPen( TQPen(TQColor(rand()%32*8,rand()%32*8,rand()%32*8), 6) );
+ i->setZ(z);
+ i->show();
+}
diff --git a/examples/canvas/canvas.doc b/examples/canvas/canvas.doc
new file mode 100644
index 000000000..f6d77ad68
--- /dev/null
+++ b/examples/canvas/canvas.doc
@@ -0,0 +1,29 @@
+/*! \page canvas-example.html
+
+ \ingroup examples
+ \title Canvas Example
+
+ This example shows a QCanvas and some \l{QCanvasItem}s in action.
+ You can do a lot more with QCanvas than we show here, but the
+ example provides a taste of what can be done.
+
+ <hr>
+
+ Header file:
+
+ \include canvas/canvas.h
+
+ <hr>
+
+ Implementation:
+
+ \include canvas/canvas.cpp
+
+ <hr>
+
+ Main:
+
+ \include canvas/main.cpp
+*/
+
+
diff --git a/examples/canvas/canvas.h b/examples/canvas/canvas.h
new file mode 100644
index 000000000..178e5c0c3
--- /dev/null
+++ b/examples/canvas/canvas.h
@@ -0,0 +1,91 @@
+#ifndef EXAMPLE_H
+#define EXAMPLE_H
+
+#include <qpopupmenu.h>
+#include <qmainwindow.h>
+#include <qintdict.h>
+#include <qcanvas.h>
+
+class BouncyLogo : public TQCanvasSprite {
+ void initPos();
+ void initSpeed();
+public:
+ BouncyLogo(TQCanvas*);
+ void advance(int);
+ int rtti() const;
+};
+
+
+class FigureEditor : public TQCanvasView {
+ Q_OBJECT
+
+public:
+ FigureEditor(TQCanvas&, TQWidget* parent=0, const char* name=0, WFlags f=0);
+ void clear();
+
+protected:
+ void contentsMousePressEvent(TQMouseEvent*);
+ void contentsMouseMoveEvent(TQMouseEvent*);
+
+signals:
+ void status(const TQString&);
+
+private:
+ TQCanvasItem* moving;
+ TQPoint moving_start;
+};
+
+class Main : public TQMainWindow {
+ Q_OBJECT
+
+public:
+ Main(TQCanvas&, TQWidget* parent=0, const char* name=0, WFlags f=0);
+ ~Main();
+
+public slots:
+ void help();
+
+private slots:
+ void aboutTQt();
+ void newView();
+ void clear();
+ void init();
+
+ void addSprite();
+ void addCircle();
+ void addHexagon();
+ void addPolygon();
+ void addSpline();
+ void addText();
+ void addLine();
+ void addRectangle();
+ void addMesh();
+ void addLogo();
+ void addButterfly();
+
+ void enlarge();
+ void shrink();
+ void rotateClockwise();
+ void rotateCounterClockwise();
+ void zoomIn();
+ void zoomOut();
+ void mirror();
+ void moveL();
+ void moveR();
+ void moveU();
+ void moveD();
+
+ void print();
+
+ void toggleDoubleBuffer();
+
+private:
+ TQCanvas& canvas;
+ FigureEditor *editor;
+
+ TQPopupMenu* options;
+ TQPrinter* printer;
+ int dbf_id;
+};
+
+#endif
diff --git a/examples/canvas/canvas.pro b/examples/canvas/canvas.pro
new file mode 100644
index 000000000..68c368da1
--- /dev/null
+++ b/examples/canvas/canvas.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = canvas
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = canvas full-config
+
+HEADERS = canvas.h
+SOURCES = canvas.cpp main.cpp
diff --git a/examples/canvas/main.cpp b/examples/canvas/main.cpp
new file mode 100644
index 000000000..3666ae95a
--- /dev/null
+++ b/examples/canvas/main.cpp
@@ -0,0 +1,43 @@
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qmenubar.h>
+#include <qapplication.h>
+#include <qimage.h>
+
+#include "canvas.h"
+
+#include <stdlib.h>
+
+extern TQString butterfly_fn;
+extern TQString logo_fn;
+
+int main(int argc, char** argv)
+{
+ TQApplication app(argc,argv);
+
+ if ( argc > 1 )
+ butterfly_fn = argv[1];
+ else
+ butterfly_fn = "butterfly.png";
+
+ if ( argc > 2 )
+ logo_fn = argv[2];
+ else
+ logo_fn = "qtlogo.png";
+
+ TQCanvas canvas(800,600);
+ canvas.setAdvancePeriod(30);
+ Main m(canvas);
+ m.resize(m.sizeHint());
+ m.setCaption("TQt Example - Canvas");
+ if ( TQApplication::desktop()->width() > m.width() + 10
+ && TQApplication::desktop()->height() > m.height() +30 )
+ m.show();
+ else
+ m.showMaximized();
+
+ TQObject::connect( qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit()) );
+
+ return app.exec();
+}
+
diff --git a/examples/canvas/makeimg.cpp b/examples/canvas/makeimg.cpp
new file mode 100644
index 000000000..23f3c6acc
--- /dev/null
+++ b/examples/canvas/makeimg.cpp
@@ -0,0 +1,92 @@
+#include <qimage.h>
+#include <qcolor.h>
+
+static inline int blendComponent( int v, int av, int s, int as )
+{
+ //shadow gets a color inversely proportional to the
+ //alpha value
+ s = (s*(255-as))/255;
+ //then do standard blending
+ return as*s + av*v -(av*as*s)/255;
+}
+
+static inline TQRgb blendShade( TQRgb v, TQRgb s )
+{
+ //pick a number: shadow is 1/3 of object
+ int as = qAlpha(s)/3;
+ int av = qAlpha(v);
+ if ( as == 0 || av == 255 )
+ return v;
+
+ int a = as + av -(as*av)/255;
+
+
+ int r = blendComponent( qRed(v),av, qRed(s), as)/a;
+ int g = blendComponent( qGreen(v),av, qGreen(s), as)/a;
+ int b = blendComponent( qBlue(v),av, qBlue(s), as)/a;
+
+ return qRgba(r,g,b,a);
+}
+
+int main( int*, char**)
+{
+ TQImage *img;
+
+ img = new TQImage( "in.png" );
+ int w,h;
+ int y;
+ img->setAlphaBuffer( TRUE );
+ *img = img->convertDepth( 32 );
+ w = img->width();
+ h = img->height();
+#if 0
+ for ( y = 0; y < h; y ++ ) {
+ uint *line = (uint*)img->scanLine( y );
+ for ( int x = 0; x < w; x++ ) {
+ uint pixel = line[x];
+ int r = qRed(pixel);
+ int g = qGreen(pixel);
+ int b = qBlue(pixel);
+ int min = TQMIN( r, TQMIN( g, b ) );
+ int max = TQMAX( r, TQMAX( g, b ) );
+ r -= min;
+ g -= min;
+ b -= min;
+ if ( max !=min ) {
+ r = (r*255)/(max-min);
+ g = (g*255)/(max-min);
+ b = (b*255)/(max-min);
+ }
+ int a = 255-min;
+ a -= (max-min)/3; //hack more transparency for colors.
+ line[x] = qRgba( r, g, b, a );
+ }
+ }
+#endif
+ *img = img->smoothScale( w/2, h/2 );
+
+ qDebug( "saving out.png");
+ img->save( "out.png", "PNG" );
+
+ w = img->width();
+ h = img->height();
+
+ TQImage *img2 = new TQImage( w, h, 32 );
+ img2->setAlphaBuffer( TRUE );
+ for ( y = 0; y < h; y++ ) {
+ for ( int x = 0; x < w; x++ ) {
+ TQRgb shader = img->pixel( x, y );
+
+ int as = qAlpha(shader)/3;
+
+ int r = (qRed(shader)*(255-as))/255;
+ int g = (qGreen(shader)*(255-as))/255;
+ int b = (qBlue(shader)*(255-as))/255;
+
+ img2->setPixel( x, y, qRgba(r,g,b,as) );
+ }
+ }
+
+ img2->save( "outshade.png", "PNG" );
+
+}
diff --git a/examples/canvas/qt-trans.xpm b/examples/canvas/qt-trans.xpm
new file mode 100644
index 000000000..225f684fd
--- /dev/null
+++ b/examples/canvas/qt-trans.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char *qtlogo_xpm[] = {
+/* width height ncolors chars_per_pixel */
+"54 34 13 1",
+/* colors */
+" c #000000",
+". c #999999",
+"X c #333366",
+"o c #6666CC",
+"O c #333333",
+"@ c #666699",
+"# c #000066",
+"$ c #666666",
+"% c #3333CC",
+"& c #000033",
+"* c #9999CC",
+"= c #333399",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++.$OOO$.++++++++++++++++++++++++++++",
+"+++++++++++++++++$ O.+++++++++++++++++++++++++",
+"+++++++++++++++.O $++++++++++++++++++++++++",
+"++++++++++++++. $.++.$ O+++++++++++++++++++++++",
+"+++++++++++++. O.+++++++$ O++++++++++++++++++++++",
+"+++++++++++++O ++++++++++$ $+++++++++++++++++++++",
+"++++++++++++$ .+++++++++++O .++++++++++++++++++++",
+"+++++++++++. O+++++++++++++ O++++++.+++++++++++++",
+"+++++++++++$ .+++++++++++++$ .+++.O +++++++++++++",
+"+++++++++++ +++++++++++++++ O+++. +++++++++++++",
+"++++++++++. &Xoooo*++++++++++$ +++. +++++++++++++",
+"++++++++++@=%%%%%%%%%%*+++++++. .++. +++++++++++++",
+"+++++++**oooooo**++*o%%%%o+++++ $++O +++++++++++++",
+"+++++*****$OOX@oooo*++*%%%%%*++O $+. OOO$++++++++*",
+"++..+.++....$O$+*ooooo*+*o%%%%%O O+$ $$O.++++++**+",
+"***+*+++++$$....+++*oooo**+*o%%# O++O ++++++***o*++",
+"*+++++++++O $.....++**oooo**+*X &o*O ++++*ooo*++++",
+"++++++++++$ O++.....++**oooo*X &%%& ..*o%%*++++++",
+"++++++++++$ ++++.....+++**ooO $*o& @oo*+++++++++",
+"++++++++++. .++++++.....+++*O Xo*O .++++++++++++",
+"+++++++++++ O+++++++++...... .++O +++++++++++++",
+"+++++++++++O +++.$$$.++++++. O+++O +++++++++++++",
+"+++++++++++. $$OO O.++++O .+++O +++++++++++++",
+"++++++++++++O .+++.O $++. O++++O +++++++++++++",
+"++++++++++++. O+++++O $+O +++++O +++++++++++++",
+"+++++++++++++. O+++++O O .+++++O .++++++++++++",
+"++++++++++++++$ .++++O .++++.+$ O+.$.++++++++",
+"+++++++++++++++. O$$O .+++++... +++++++++",
+"+++++++++++++++++$ O+++++$$+.O O$.+++++++++",
+"+++++++++++++++++++$OO O$.O O.++. .++++++++++++++++",
+"+++++++++++++++++++++++++++. OO .++++++++++++++++",
+"++++++++++++++++++++++++++++. O+++++++++++++++++",
+"+++++++++++++++++++++++++++++. .+++++++++++++++++",
+"++++++++++++++++++++++++++++++.O O.++++++++++++++++++"
+};
diff --git a/examples/canvas/qtlogo.png b/examples/canvas/qtlogo.png
new file mode 100644
index 000000000..68cb8bfd1
--- /dev/null
+++ b/examples/canvas/qtlogo.png
Binary files differ
diff --git a/examples/chart/canvastext.h b/examples/chart/canvastext.h
new file mode 100644
index 000000000..095aa15f4
--- /dev/null
+++ b/examples/chart/canvastext.h
@@ -0,0 +1,31 @@
+#ifndef CANVASTEXT_H
+#define CANVASTEXT_H
+
+#include <qcanvas.h>
+
+class TQFont;
+
+
+class CanvasText : public TQCanvasText
+{
+public:
+ enum { CANVAS_TEXT = 1100 };
+
+ CanvasText( int index, TQCanvas *canvas )
+ : TQCanvasText( canvas ), m_index( index ) {}
+ CanvasText( int index, const TQString& text, TQCanvas *canvas )
+ : TQCanvasText( text, canvas ), m_index( index ) {}
+ CanvasText( int index, const TQString& text, TQFont font, TQCanvas *canvas )
+ : TQCanvasText( text, font, canvas ), m_index( index ) {}
+
+ int index() const { return m_index; }
+ void setIndex( int index ) { m_index = index; }
+
+ int rtti() const { return CANVAS_TEXT; }
+
+private:
+ int m_index;
+};
+
+#endif
+
diff --git a/examples/chart/canvasview.cpp b/examples/chart/canvasview.cpp
new file mode 100644
index 000000000..17acfe883
--- /dev/null
+++ b/examples/chart/canvasview.cpp
@@ -0,0 +1,55 @@
+#include "canvasview.h"
+#include "chartform.h"
+
+#include <qcursor.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qstatusbar.h>
+
+
+void CanvasView::contentsContextMenuEvent( TQContextMenuEvent * )
+{
+ ((ChartForm*)parent())->optionsMenu->exec( TQCursor::pos() );
+}
+
+
+void CanvasView::viewportResizeEvent( TQResizeEvent *e )
+{
+ canvas()->resize( e->size().width(), e->size().height() );
+ ((ChartForm*)parent())->drawElements();
+}
+
+
+void CanvasView::contentsMousePressEvent( TQMouseEvent *e )
+{
+ TQCanvasItemList list = canvas()->collisions( e->pos() );
+ for ( TQCanvasItemList::iterator it = list.begin(); it != list.end(); ++it )
+ if ( (*it)->rtti() == CanvasText::CANVAS_TEXT ) {
+ m_movingItem = *it;
+ m_pos = e->pos();
+ return;
+ }
+ m_movingItem = 0;
+}
+
+
+void CanvasView::contentsMouseMoveEvent( TQMouseEvent *e )
+{
+ if ( m_movingItem ) {
+ TQPoint offset = e->pos() - m_pos;
+ m_movingItem->moveBy( offset.x(), offset.y() );
+ m_pos = e->pos();
+ ChartForm *form = (ChartForm*)parent();
+ form->setChanged( TRUE );
+ int chartType = form->chartType();
+ CanvasText *item = (CanvasText*)m_movingItem;
+ int i = item->index();
+
+ (*m_elements)[i].setProX( chartType, item->x() / canvas()->width() );
+ (*m_elements)[i].setProY( chartType, item->y() / canvas()->height() );
+
+ canvas()->update();
+ }
+}
+
+
diff --git a/examples/chart/canvasview.h b/examples/chart/canvasview.h
new file mode 100644
index 000000000..55b5d25c0
--- /dev/null
+++ b/examples/chart/canvasview.h
@@ -0,0 +1,36 @@
+#ifndef CANVASVIEW_H
+#define CANVASVIEW_H
+
+#include "element.h"
+#include "canvastext.h"
+
+#include <qcanvas.h>
+
+
+class TQPoint;
+
+
+class CanvasView : public TQCanvasView
+{
+ Q_OBJECT
+public:
+ CanvasView( TQCanvas *canvas, ElementVector *elements,
+ TQWidget* parent = 0, const char* name = "canvas view",
+ WFlags f = 0 )
+ : TQCanvasView( canvas, parent, name, f ), m_movingItem(0),
+ m_elements( elements ) {}
+
+protected:
+ void viewportResizeEvent( TQResizeEvent *e );
+ void contentsMousePressEvent( TQMouseEvent *e );
+ void contentsMouseMoveEvent( TQMouseEvent *e );
+ void contentsContextMenuEvent( TQContextMenuEvent *e );
+
+private:
+ TQCanvasItem *m_movingItem;
+ TQPoint m_pos;
+ ElementVector *m_elements;
+};
+
+
+#endif
diff --git a/examples/chart/chart.doc b/examples/chart/chart.doc
new file mode 100644
index 000000000..c6c99f267
--- /dev/null
+++ b/examples/chart/chart.doc
@@ -0,0 +1,41 @@
+/*!
+ \page canvas-chart-example.html
+
+ \ingroup step-by-step-examples
+
+ \title A Complete Canvas Application
+
+ This is a complete example program with a main window, menus and
+ toolbars. The main widget is a QCanvas, and this example
+ demonstrates basic canvas usage.
+ \omit
+ This example is the subject of \link tutorial2.html Tutorial
+ #2\endlink.
+ \endomit
+
+ <hr>
+
+ Project file:
+
+ \include chart/chart.pro
+
+ <hr>
+
+ Header files:
+
+ \include chart/element.h
+ \include chart/chartform.h
+
+ <hr>
+
+ Implementation:
+
+ \include chart/chartform.cpp
+
+ <hr>
+
+ Main:
+
+ \include chart/main.cpp
+
+*/
diff --git a/examples/chart/chart.pro b/examples/chart/chart.pro
new file mode 100644
index 000000000..8c791e9ae
--- /dev/null
+++ b/examples/chart/chart.pro
@@ -0,0 +1,20 @@
+TEMPLATE = app
+
+CONFIG += warn_on
+
+REQUIRES = full-config
+
+HEADERS += element.h \
+ canvastext.h \
+ canvasview.h \
+ chartform.h \
+ optionsform.h \
+ setdataform.h
+SOURCES += element.cpp \
+ canvasview.cpp \
+ chartform.cpp \
+ chartform_canvas.cpp \
+ chartform_files.cpp \
+ optionsform.cpp \
+ setdataform.cpp \
+ main.cpp
diff --git a/examples/chart/chartform.cpp b/examples/chart/chartform.cpp
new file mode 100644
index 000000000..4317b8f0b
--- /dev/null
+++ b/examples/chart/chartform.cpp
@@ -0,0 +1,531 @@
+#include "canvasview.h"
+#include "chartform.h"
+#include "optionsform.h"
+#include "setdataform.h"
+
+#include <qaction.h>
+#include <qapplication.h>
+#include <qcombobox.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qfont.h>
+#include <qfontdialog.h>
+#include <qmenubar.h>
+#include <qmessagebox.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qprinter.h>
+#include <qradiobutton.h>
+#include <qsettings.h>
+#include <qspinbox.h>
+#include <qstatusbar.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+
+#include "images/file_new.xpm"
+#include "images/file_open.xpm"
+#include "images/file_save.xpm"
+#include "images/file_print.xpm"
+#include "images/options_setdata.xpm"
+#include "images/options_setfont.xpm"
+#include "images/options_setoptions.xpm"
+#include "images/options_horizontalbarchart.xpm"
+#include "images/options_piechart.xpm"
+#include "images/options_verticalbarchart.xpm"
+
+
+const TQString WINDOWS_REGISTRY = "/Trolltech/TQtExamples";
+const TQString APP_KEY = "/Chart/";
+
+
+ChartForm::ChartForm( const TQString& filename )
+ : TQMainWindow( 0, 0, WDestructiveClose )
+{
+ setIcon( TQPixmap( options_piechart ) );
+
+ TQAction *fileNewAction;
+ TQAction *fileOpenAction;
+ TQAction *fileSaveAction;
+ TQAction *fileSaveAsAction;
+ TQAction *fileSaveAsPixmapAction;
+ TQAction *filePrintAction;
+ TQAction *fileQuitAction;
+ TQAction *optionsSetDataAction;
+ TQAction *optionsSetFontAction;
+ TQAction *optionsSetOptionsAction;
+
+ fileNewAction = new TQAction(
+ "New Chart", TQPixmap( file_new ),
+ "&New", CTRL+Key_N, this, "new" );
+ connect( fileNewAction, SIGNAL( activated() ), this, SLOT( fileNew() ) );
+
+ fileOpenAction = new TQAction(
+ "Open Chart", TQPixmap( file_open ),
+ "&Open...", CTRL+Key_O, this, "open" );
+ connect( fileOpenAction, SIGNAL( activated() ), this, SLOT( fileOpen() ) );
+
+ fileSaveAction = new TQAction(
+ "Save Chart", TQPixmap( file_save ),
+ "&Save", CTRL+Key_S, this, "save" );
+ connect( fileSaveAction, SIGNAL( activated() ), this, SLOT( fileSave() ) );
+
+ fileSaveAsAction = new TQAction(
+ "Save Chart As", TQPixmap( file_save ),
+ "Save &As...", 0, this, "save as" );
+ connect( fileSaveAsAction, SIGNAL( activated() ),
+ this, SLOT( fileSaveAs() ) );
+
+ fileSaveAsPixmapAction = new TQAction(
+ "Save Chart As Bitmap", TQPixmap( file_save ),
+ "Save As &Bitmap...", CTRL+Key_B, this, "save as bitmap" );
+ connect( fileSaveAsPixmapAction, SIGNAL( activated() ),
+ this, SLOT( fileSaveAsPixmap() ) );
+
+ filePrintAction = new TQAction(
+ "Print Chart", TQPixmap( file_print ),
+ "&Print Chart...", CTRL+Key_P, this, "print chart" );
+ connect( filePrintAction, SIGNAL( activated() ),
+ this, SLOT( filePrint() ) );
+
+ optionsSetDataAction = new TQAction(
+ "Set Data", TQPixmap( options_setdata ),
+ "Set &Data...", CTRL+Key_D, this, "set data" );
+ connect( optionsSetDataAction, SIGNAL( activated() ),
+ this, SLOT( optionsSetData() ) );
+
+
+ TQActionGroup *chartGroup = new TQActionGroup( this ); // Connected later
+ chartGroup->setExclusive( TRUE );
+
+ optionsPieChartAction = new TQAction(
+ "Pie Chart", TQPixmap( options_piechart ),
+ "&Pie Chart", CTRL+Key_I, chartGroup, "pie chart" );
+ optionsPieChartAction->setToggleAction( TRUE );
+
+ optionsHorizontalBarChartAction = new TQAction(
+ "Horizontal Bar Chart", TQPixmap( options_horizontalbarchart ),
+ "&Horizontal Bar Chart", CTRL+Key_H, chartGroup,
+ "horizontal bar chart" );
+ optionsHorizontalBarChartAction->setToggleAction( TRUE );
+
+ optionsVerticalBarChartAction = new TQAction(
+ "Vertical Bar Chart", TQPixmap( options_verticalbarchart ),
+ "&Vertical Bar Chart", CTRL+Key_V, chartGroup, "Vertical bar chart" );
+ optionsVerticalBarChartAction->setToggleAction( TRUE );
+
+
+ optionsSetFontAction = new TQAction(
+ "Set Font", TQPixmap( options_setfont ),
+ "Set &Font...", CTRL+Key_F, this, "set font" );
+ connect( optionsSetFontAction, SIGNAL( activated() ),
+ this, SLOT( optionsSetFont() ) );
+
+ optionsSetOptionsAction = new TQAction(
+ "Set Options", TQPixmap( options_setoptions ),
+ "Set &Options...", 0, this, "set options" );
+ connect( optionsSetOptionsAction, SIGNAL( activated() ),
+ this, SLOT( optionsSetOptions() ) );
+
+ fileQuitAction = new TQAction( "Quit", "&Quit", CTRL+Key_Q, this, "tquit" );
+ connect( fileQuitAction, SIGNAL( activated() ), this, SLOT( fileQuit() ) );
+
+
+ TQToolBar* fileTools = new TQToolBar( this, "file operations" );
+ fileTools->setLabel( "File Operations" );
+ fileNewAction->addTo( fileTools );
+ fileOpenAction->addTo( fileTools );
+ fileSaveAction->addTo( fileTools );
+ fileTools->addSeparator();
+ filePrintAction->addTo( fileTools );
+
+ TQToolBar *optionsTools = new TQToolBar( this, "options operations" );
+ optionsTools->setLabel( "Options Operations" );
+ optionsSetDataAction->addTo( optionsTools );
+ optionsTools->addSeparator();
+ optionsPieChartAction->addTo( optionsTools );
+ optionsHorizontalBarChartAction->addTo( optionsTools );
+ optionsVerticalBarChartAction->addTo( optionsTools );
+ optionsTools->addSeparator();
+ optionsSetFontAction->addTo( optionsTools );
+ optionsTools->addSeparator();
+ optionsSetOptionsAction->addTo( optionsTools );
+
+ fileMenu = new TQPopupMenu( this );
+ menuBar()->insertItem( "&File", fileMenu );
+ fileNewAction->addTo( fileMenu );
+ fileOpenAction->addTo( fileMenu );
+ fileSaveAction->addTo( fileMenu );
+ fileSaveAsAction->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ fileSaveAsPixmapAction->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ filePrintAction->addTo( fileMenu );
+ fileMenu->insertSeparator();
+ fileQuitAction->addTo( fileMenu );
+
+ optionsMenu = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Options", optionsMenu );
+ optionsSetDataAction->addTo( optionsMenu );
+ optionsMenu->insertSeparator();
+ optionsPieChartAction->addTo( optionsMenu );
+ optionsHorizontalBarChartAction->addTo( optionsMenu );
+ optionsVerticalBarChartAction->addTo( optionsMenu );
+ optionsMenu->insertSeparator();
+ optionsSetFontAction->addTo( optionsMenu );
+ optionsMenu->insertSeparator();
+ optionsSetOptionsAction->addTo( optionsMenu );
+
+ menuBar()->insertSeparator();
+
+ TQPopupMenu *helpMenu = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Help", helpMenu );
+ helpMenu->insertItem( "&Help", this, SLOT(helpHelp()), Key_F1 );
+ helpMenu->insertItem( "&About", this, SLOT(helpAbout()) );
+ helpMenu->insertItem( "About &TQt", this, SLOT(helpAboutTQt()) );
+
+
+ m_printer = 0;
+ m_elements.resize( MAX_ELEMENTS );
+
+ TQSettings settings;
+ settings.insertSearchPath( TQSettings::Windows, WINDOWS_REGISTRY );
+ int windowWidth = settings.readNumEntry( APP_KEY + "WindowWidth", 460 );
+ int windowHeight = settings.readNumEntry( APP_KEY + "WindowHeight", 530 );
+ int windowX = settings.readNumEntry( APP_KEY + "WindowX", -1 );
+ int windowY = settings.readNumEntry( APP_KEY + "WindowY", -1 );
+ setChartType( ChartType(
+ settings.readNumEntry( APP_KEY + "ChartType", int(PIE) ) ) );
+ m_addValues = AddValuesType(
+ settings.readNumEntry( APP_KEY + "AddValues", int(NO) ));
+ m_decimalPlaces = settings.readNumEntry( APP_KEY + "Decimals", 2 );
+ m_font = TQFont( "Helvetica", 18, TQFont::Bold );
+ m_font.fromString(
+ settings.readEntry( APP_KEY + "Font", m_font.toString() ) );
+ for ( int i = 0; i < MAX_RECENTFILES; ++i ) {
+ TQString filename = settings.readEntry( APP_KEY + "File" +
+ TQString::number( i + 1 ) );
+ if ( !filename.isEmpty() )
+ m_recentFiles.push_back( filename );
+ }
+ if ( m_recentFiles.count() )
+ updateRecentFilesMenu();
+
+
+ // Connect *after* we've set the chart type on so we don't call
+ // drawElements() prematurely.
+ connect( chartGroup, SIGNAL( selected(TQAction*) ),
+ this, SLOT( updateChartType(TQAction*) ) );
+
+ resize( windowWidth, windowHeight );
+ if ( windowX != -1 || windowY != -1 )
+ move( windowX, windowY );
+
+ m_canvas = new TQCanvas( this );
+ m_canvas->resize( width(), height() );
+ m_canvasView = new CanvasView( m_canvas, &m_elements, this );
+ setCentralWidget( m_canvasView );
+ m_canvasView->show();
+
+ if ( !filename.isEmpty() )
+ load( filename );
+ else {
+ init();
+ m_elements[0].set( 20, red, 14, "Red" );
+ m_elements[1].set( 70, cyan, 2, "Cyan", darkGreen );
+ m_elements[2].set( 35, blue, 11, "Blue" );
+ m_elements[3].set( 55, yellow, 1, "Yellow", darkBlue );
+ m_elements[4].set( 80, magenta, 1, "Magenta" );
+ drawElements();
+ }
+
+ statusBar()->message( "Ready", 2000 );
+}
+
+
+ChartForm::~ChartForm()
+{
+ delete m_printer;
+}
+
+
+void ChartForm::init()
+{
+ setCaption( "Chart" );
+ m_filename = TQString::null;
+ m_changed = FALSE;
+
+ m_elements[0] = Element( Element::INVALID, red );
+ m_elements[1] = Element( Element::INVALID, cyan );
+ m_elements[2] = Element( Element::INVALID, blue );
+ m_elements[3] = Element( Element::INVALID, yellow );
+ m_elements[4] = Element( Element::INVALID, green );
+ m_elements[5] = Element( Element::INVALID, magenta );
+ m_elements[6] = Element( Element::INVALID, darkYellow );
+ m_elements[7] = Element( Element::INVALID, darkRed );
+ m_elements[8] = Element( Element::INVALID, darkCyan );
+ m_elements[9] = Element( Element::INVALID, darkGreen );
+ m_elements[10] = Element( Element::INVALID, darkMagenta );
+ m_elements[11] = Element( Element::INVALID, darkBlue );
+ for ( int i = 12; i < MAX_ELEMENTS; ++i ) {
+ double x = (double(i) / MAX_ELEMENTS) * 360;
+ int y = (int(x * 256) % 105) + 151;
+ int z = ((i * 17) % 105) + 151;
+ m_elements[i] = Element( Element::INVALID, TQColor( int(x), y, z, TQColor::Hsv ) );
+ }
+}
+
+void ChartForm::closeEvent( TQCloseEvent * )
+{
+ fileQuit();
+}
+
+
+void ChartForm::fileNew()
+{
+ if ( okToClear() ) {
+ init();
+ drawElements();
+ }
+}
+
+
+void ChartForm::fileOpen()
+{
+ if ( !okToClear() )
+ return;
+
+ TQString filename = TQFileDialog::getOpenFileName(
+ TQString::null, "Charts (*.cht)", this,
+ "file open", "Chart -- File Open" );
+ if ( !filename.isEmpty() )
+ load( filename );
+ else
+ statusBar()->message( "File Open abandoned", 2000 );
+}
+
+
+void ChartForm::fileSaveAs()
+{
+ TQString filename = TQFileDialog::getSaveFileName(
+ TQString::null, "Charts (*.cht)", this,
+ "file save as", "Chart -- File Save As" );
+ if ( !filename.isEmpty() ) {
+ int answer = 0;
+ if ( TQFile::exists( filename ) )
+ answer = TQMessageBox::warning(
+ this, "Chart -- Overwrite File",
+ TQString( "Overwrite\n\'%1\'?" ).
+ arg( filename ),
+ "&Yes", "&No", TQString::null, 1, 1 );
+ if ( answer == 0 ) {
+ m_filename = filename;
+ updateRecentFiles( filename );
+ fileSave();
+ return;
+ }
+ }
+ statusBar()->message( "Saving abandoned", 2000 );
+}
+
+
+void ChartForm::fileOpenRecent( int index )
+{
+ if ( !okToClear() )
+ return;
+
+ load( m_recentFiles[index] );
+}
+
+
+void ChartForm::updateRecentFiles( const TQString& filename )
+{
+ if ( m_recentFiles.find( filename ) != m_recentFiles.end() )
+ return;
+
+ m_recentFiles.push_back( filename );
+ if ( m_recentFiles.count() > MAX_RECENTFILES )
+ m_recentFiles.pop_front();
+
+ updateRecentFilesMenu();
+}
+
+
+void ChartForm::updateRecentFilesMenu()
+{
+ for ( int i = 0; i < MAX_RECENTFILES; ++i ) {
+ if ( fileMenu->findItem( i ) )
+ fileMenu->removeItem( i );
+ if ( i < int(m_recentFiles.count()) )
+ fileMenu->insertItem( TQString( "&%1 %2" ).
+ arg( i + 1 ).arg( m_recentFiles[i] ),
+ this, SLOT( fileOpenRecent(int) ),
+ 0, i );
+ }
+}
+
+
+void ChartForm::fileQuit()
+{
+ if ( okToClear() ) {
+ saveOptions();
+ qApp->exit( 0 );
+ }
+}
+
+
+bool ChartForm::okToClear()
+{
+ if ( m_changed ) {
+ TQString msg;
+ if ( m_filename.isEmpty() )
+ msg = "Unnamed chart ";
+ else
+ msg = TQString( "Chart '%1'\n" ).arg( m_filename );
+ msg += "has been changed.";
+
+ int x = TQMessageBox::information( this, "Chart -- Unsaved Changes",
+ msg, "&Save", "Cancel", "&Abandon",
+ 0, 1 );
+ switch( x ) {
+ case 0: // Save
+ fileSave();
+ break;
+ case 1: // Cancel
+ default:
+ return FALSE;
+ case 2: // Abandon
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+
+void ChartForm::saveOptions()
+{
+ TQSettings settings;
+ settings.insertSearchPath( TQSettings::Windows, WINDOWS_REGISTRY );
+ settings.writeEntry( APP_KEY + "WindowWidth", width() );
+ settings.writeEntry( APP_KEY + "WindowHeight", height() );
+ settings.writeEntry( APP_KEY + "WindowX", x() );
+ settings.writeEntry( APP_KEY + "WindowY", y() );
+ settings.writeEntry( APP_KEY + "ChartType", int(m_chartType) );
+ settings.writeEntry( APP_KEY + "AddValues", int(m_addValues) );
+ settings.writeEntry( APP_KEY + "Decimals", m_decimalPlaces );
+ settings.writeEntry( APP_KEY + "Font", m_font.toString() );
+ for ( int i = 0; i < int(m_recentFiles.count()); ++i )
+ settings.writeEntry( APP_KEY + "File" + TQString::number( i + 1 ),
+ m_recentFiles[i] );
+}
+
+
+void ChartForm::optionsSetData()
+{
+ SetDataForm *setDataForm = new SetDataForm( &m_elements, m_decimalPlaces, this );
+ if ( setDataForm->exec() ) {
+ m_changed = TRUE;
+ drawElements();
+ }
+ delete setDataForm;
+}
+
+
+void ChartForm::setChartType( ChartType chartType )
+{
+ m_chartType = chartType;
+ switch ( m_chartType ) {
+ case PIE:
+ optionsPieChartAction->setOn( TRUE );
+ break;
+ case VERTICAL_BAR:
+ optionsVerticalBarChartAction->setOn( TRUE );
+ break;
+ case HORIZONTAL_BAR:
+ optionsHorizontalBarChartAction->setOn( TRUE );
+ break;
+ }
+}
+
+
+void ChartForm::updateChartType( TQAction *action )
+{
+ if ( action == optionsPieChartAction ) {
+ m_chartType = PIE;
+ }
+ else if ( action == optionsHorizontalBarChartAction ) {
+ m_chartType = HORIZONTAL_BAR;
+ }
+ else if ( action == optionsVerticalBarChartAction ) {
+ m_chartType = VERTICAL_BAR;
+ }
+
+ drawElements();
+}
+
+
+void ChartForm::optionsSetFont()
+{
+ bool ok;
+ TQFont font = TQFontDialog::getFont( &ok, m_font, this );
+ if ( ok ) {
+ m_font = font;
+ drawElements();
+ }
+}
+
+
+void ChartForm::optionsSetOptions()
+{
+ OptionsForm *optionsForm = new OptionsForm( this );
+ optionsForm->chartTypeComboBox->setCurrentItem( m_chartType );
+ optionsForm->setFont( m_font );
+ switch ( m_addValues ) {
+ case NO:
+ optionsForm->noRadioButton->setChecked( TRUE );
+ break;
+ case YES:
+ optionsForm->yesRadioButton->setChecked( TRUE );
+ break;
+ case AS_PERCENTAGE:
+ optionsForm->asPercentageRadioButton->setChecked( TRUE );
+ break;
+ }
+ optionsForm->decimalPlacesSpinBox->setValue( m_decimalPlaces );
+ if ( optionsForm->exec() ) {
+ setChartType( ChartType(
+ optionsForm->chartTypeComboBox->currentItem()) );
+ m_font = optionsForm->font();
+ if ( optionsForm->noRadioButton->isChecked() )
+ m_addValues = NO;
+ else if ( optionsForm->yesRadioButton->isChecked() )
+ m_addValues = YES;
+ else if ( optionsForm->asPercentageRadioButton->isChecked() )
+ m_addValues = AS_PERCENTAGE;
+ m_decimalPlaces = optionsForm->decimalPlacesSpinBox->value();
+ drawElements();
+ }
+ delete optionsForm;
+}
+
+
+void ChartForm::helpHelp()
+{
+ statusBar()->message( "Help is not implemented yet", 2000 );
+}
+
+
+void ChartForm::helpAbout()
+{
+ TQMessageBox::about( this, "Chart -- About",
+ "<center><h1><font color=blue>Chart<font></h1></center>"
+ "<p>Chart your data with <i>chart</i>.</p>"
+ );
+}
+
+
+void ChartForm::helpAboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "Chart -- About TQt" );
+}
+
diff --git a/examples/chart/chartform.h b/examples/chart/chartform.h
new file mode 100644
index 000000000..7fdeea641
--- /dev/null
+++ b/examples/chart/chartform.h
@@ -0,0 +1,90 @@
+#ifndef CHARTFORM_H
+#define CHARTFORM_H
+
+#include "element.h"
+
+#include <qmainwindow.h>
+#include <qstringlist.h>
+
+
+class CanvasView;
+
+class TQAction;
+class TQCanvas;
+class TQFont;
+class TQPrinter;
+class TQString;
+
+
+class ChartForm: public TQMainWindow
+{
+ Q_OBJECT
+public:
+ enum { MAX_ELEMENTS = 100 };
+ enum { MAX_RECENTFILES = 9 }; // Must not exceed 9
+ enum ChartType { PIE, VERTICAL_BAR, HORIZONTAL_BAR };
+ enum AddValuesType { NO, YES, AS_PERCENTAGE };
+
+ ChartForm( const TQString& filename );
+ ~ChartForm();
+
+ int chartType() { return m_chartType; }
+ void setChanged( bool changed = TRUE ) { m_changed = changed; }
+ void drawElements();
+
+ TQPopupMenu *optionsMenu; // Why public? See canvasview.cpp
+
+protected:
+ virtual void closeEvent( TQCloseEvent * );
+
+private slots:
+ void fileNew();
+ void fileOpen();
+ void fileOpenRecent( int index );
+ void fileSave();
+ void fileSaveAs();
+ void fileSaveAsPixmap();
+ void filePrint();
+ void fileQuit();
+ void optionsSetData();
+ void updateChartType( TQAction *action );
+ void optionsSetFont();
+ void optionsSetOptions();
+ void helpHelp();
+ void helpAbout();
+ void helpAboutTQt();
+ void saveOptions();
+
+private:
+ void init();
+ void load( const TQString& filename );
+ bool okToClear();
+ void drawPieChart( const double scales[], double total, int count );
+ void drawVerticalBarChart( const double scales[], double total, int count );
+ void drawHorizontalBarChart( const double scales[], double total, int count );
+
+ TQString valueLabel( const TQString& label, double value, double total );
+ void updateRecentFiles( const TQString& filename );
+ void updateRecentFilesMenu();
+ void setChartType( ChartType chartType );
+
+ TQPopupMenu *fileMenu;
+ TQAction *optionsPieChartAction;
+ TQAction *optionsHorizontalBarChartAction;
+ TQAction *optionsVerticalBarChartAction;
+
+
+ TQString m_filename;
+ TQStringList m_recentFiles;
+ TQCanvas *m_canvas;
+ CanvasView *m_canvasView;
+ bool m_changed;
+ ElementVector m_elements;
+ TQPrinter *m_printer;
+ ChartType m_chartType;
+ AddValuesType m_addValues;
+ int m_decimalPlaces;
+ TQFont m_font;
+};
+
+#endif
diff --git a/examples/chart/chartform_canvas.cpp b/examples/chart/chartform_canvas.cpp
new file mode 100644
index 000000000..842c04e6f
--- /dev/null
+++ b/examples/chart/chartform_canvas.cpp
@@ -0,0 +1,226 @@
+#include "canvastext.h"
+#include "chartform.h"
+
+#include <qbrush.h>
+#include <qcanvas.h>
+
+#include <math.h> // sin, cos
+
+#ifndef M_PI
+#define M_PI 3.1415
+#endif
+
+void ChartForm::drawElements()
+{
+ TQCanvasItemList list = m_canvas->allItems();
+ for ( TQCanvasItemList::iterator it = list.begin(); it != list.end(); ++it )
+ delete *it;
+
+ // 360 * 16 for pies; TQt works with 16ths of degrees
+ int scaleFactor = m_chartType == PIE ? 5760 :
+ m_chartType == VERTICAL_BAR ? m_canvas->height() :
+ m_canvas->width();
+ double biggest = 0.0;
+ int count = 0;
+ double total = 0.0;
+ static double scales[MAX_ELEMENTS];
+
+ for ( int i = 0; i < MAX_ELEMENTS; ++i ) {
+ if ( m_elements[i].isValid() ) {
+ double value = m_elements[i].value();
+ count++;
+ total += value;
+ if ( value > biggest )
+ biggest = value;
+ scales[i] = m_elements[i].value() * scaleFactor;
+ }
+ }
+
+ if ( count ) {
+ // 2nd loop because of total and biggest
+ for ( int i = 0; i < MAX_ELEMENTS; ++i )
+ if ( m_elements[i].isValid() )
+ if ( m_chartType == PIE )
+ scales[i] = (m_elements[i].value() * scaleFactor) / total;
+ else
+ scales[i] = (m_elements[i].value() * scaleFactor) / biggest;
+
+ switch ( m_chartType ) {
+ case PIE:
+ drawPieChart( scales, total, count );
+ break;
+ case VERTICAL_BAR:
+ drawVerticalBarChart( scales, total, count );
+ break;
+ case HORIZONTAL_BAR:
+ drawHorizontalBarChart( scales, total, count );
+ break;
+ }
+ }
+
+ m_canvas->update();
+}
+
+
+void ChartForm::drawPieChart( const double scales[], double total, int )
+{
+ double width = m_canvas->width();
+ double height = m_canvas->height();
+ int size = int(width > height ? height : width);
+ int x = int(width / 2);
+ int y = int(height / 2);
+ int angle = 0;
+
+ for ( int i = 0; i < MAX_ELEMENTS; ++i ) {
+ if ( m_elements[i].isValid() ) {
+ int extent = int(scales[i]);
+ TQCanvasEllipse *arc = new TQCanvasEllipse(
+ size, size, angle, extent, m_canvas );
+ arc->setX( x );
+ arc->setY( y );
+ arc->setZ( 0 );
+ arc->setBrush( TQBrush( m_elements[i].valueColor(),
+ BrushStyle(m_elements[i].valuePattern()) ) );
+ arc->show();
+ angle += extent;
+ TQString label = m_elements[i].label();
+ if ( !label.isEmpty() || m_addValues != NO ) {
+ label = valueLabel( label, m_elements[i].value(), total );
+ CanvasText *text = new CanvasText( i, label, m_font, m_canvas );
+ double proX = m_elements[i].proX( PIE );
+ double proY = m_elements[i].proY( PIE );
+ if ( proX < 0 || proY < 0 ) {
+ // Find the centre of the pie segment
+ TQRect rect = arc->boundingRect();
+ proX = ( rect.width() / 2 ) + rect.x();
+ proY = ( rect.height() / 2 ) + rect.y();
+ // Centre text over the centre of the pie segment
+ rect = text->boundingRect();
+ proX -= ( rect.width() / 2 );
+ proY -= ( rect.height() / 2 );
+ // Make proportional
+ proX /= width;
+ proY /= height;
+ }
+ text->setColor( m_elements[i].labelColor() );
+ text->setX( proX * width );
+ text->setY( proY * height );
+ text->setZ( 1 );
+ text->show();
+ m_elements[i].setProX( PIE, proX );
+ m_elements[i].setProY( PIE, proY );
+ }
+ }
+ }
+}
+
+
+void ChartForm::drawVerticalBarChart(
+ const double scales[], double total, int count )
+{
+ double width = m_canvas->width();
+ double height = m_canvas->height();
+ int prowidth = int(width / count);
+ int x = 0;
+ TQPen pen;
+ pen.setStyle( NoPen );
+
+ for ( int i = 0; i < MAX_ELEMENTS; ++i ) {
+ if ( m_elements[i].isValid() ) {
+ int extent = int(scales[i]);
+ int y = int(height - extent);
+ TQCanvasRectangle *rect = new TQCanvasRectangle(
+ x, y, prowidth, extent, m_canvas );
+ rect->setBrush( TQBrush( m_elements[i].valueColor(),
+ BrushStyle(m_elements[i].valuePattern()) ) );
+ rect->setPen( pen );
+ rect->setZ( 0 );
+ rect->show();
+ TQString label = m_elements[i].label();
+ if ( !label.isEmpty() || m_addValues != NO ) {
+ double proX = m_elements[i].proX( VERTICAL_BAR );
+ double proY = m_elements[i].proY( VERTICAL_BAR );
+ if ( proX < 0 || proY < 0 ) {
+ proX = x / width;
+ proY = y / height;
+ }
+ label = valueLabel( label, m_elements[i].value(), total );
+ CanvasText *text = new CanvasText( i, label, m_font, m_canvas );
+ text->setColor( m_elements[i].labelColor() );
+ text->setX( proX * width );
+ text->setY( proY * height );
+ text->setZ( 1 );
+ text->show();
+ m_elements[i].setProX( VERTICAL_BAR, proX );
+ m_elements[i].setProY( VERTICAL_BAR, proY );
+ }
+ x += prowidth;
+ }
+ }
+}
+
+
+void ChartForm::drawHorizontalBarChart(
+ const double scales[], double total, int count )
+{
+ double width = m_canvas->width();
+ double height = m_canvas->height();
+ int proheight = int(height / count);
+ int y = 0;
+ TQPen pen;
+ pen.setStyle( NoPen );
+
+ for ( int i = 0; i < MAX_ELEMENTS; ++i ) {
+ if ( m_elements[i].isValid() ) {
+ int extent = int(scales[i]);
+ TQCanvasRectangle *rect = new TQCanvasRectangle(
+ 0, y, extent, proheight, m_canvas );
+ rect->setBrush( TQBrush( m_elements[i].valueColor(),
+ BrushStyle(m_elements[i].valuePattern()) ) );
+ rect->setPen( pen );
+ rect->setZ( 0 );
+ rect->show();
+ TQString label = m_elements[i].label();
+ if ( !label.isEmpty() || m_addValues != NO ) {
+ double proX = m_elements[i].proX( HORIZONTAL_BAR );
+ double proY = m_elements[i].proY( HORIZONTAL_BAR );
+ if ( proX < 0 || proY < 0 ) {
+ proX = 0;
+ proY = y / height;
+ }
+ label = valueLabel( label, m_elements[i].value(), total );
+ CanvasText *text = new CanvasText( i, label, m_font, m_canvas );
+ text->setColor( m_elements[i].labelColor() );
+ text->setX( proX * width );
+ text->setY( proY * height );
+ text->setZ( 1 );
+ text->show();
+ m_elements[i].setProX( HORIZONTAL_BAR, proX );
+ m_elements[i].setProY( HORIZONTAL_BAR, proY );
+ }
+ y += proheight;
+ }
+ }
+}
+
+
+TQString ChartForm::valueLabel(
+ const TQString& label, double value, double total )
+{
+ if ( m_addValues == NO )
+ return label;
+
+ TQString newLabel = label;
+ if ( !label.isEmpty() )
+ if ( m_chartType == VERTICAL_BAR )
+ newLabel += '\n';
+ else
+ newLabel += ' ';
+ if ( m_addValues == YES )
+ newLabel += TQString::number( value, 'f', m_decimalPlaces );
+ else if ( m_addValues == AS_PERCENTAGE )
+ newLabel += TQString::number( (value / total) * 100, 'f', m_decimalPlaces )
+ + '%';
+ return newLabel;
+}
+
diff --git a/examples/chart/chartform_files.cpp b/examples/chart/chartform_files.cpp
new file mode 100644
index 000000000..742dbeaa1
--- /dev/null
+++ b/examples/chart/chartform_files.cpp
@@ -0,0 +1,113 @@
+#include "canvasview.h"
+#include "chartform.h"
+
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qpainter.h>
+#include <qprinter.h>
+#include <qstatusbar.h>
+
+
+void ChartForm::load( const TQString& filename )
+{
+ TQFile file( filename );
+ if ( !file.open( IO_ReadOnly ) ) {
+ statusBar()->message( TQString( "Failed to load \'%1\'" ).
+ arg( filename ), 2000 );
+ return;
+ }
+
+ init(); // Make sure we have colours
+ m_filename = filename;
+ TQTextStream ts( &file );
+ Element element;
+ int errors = 0;
+ int i = 0;
+ while ( !ts.eof() ) {
+ ts >> element;
+ if ( element.isValid() )
+ m_elements[i++] = element;
+ else
+ errors++;
+ if ( i == MAX_ELEMENTS ) {
+ statusBar()->message(
+ TQString( "Read maximum number of elements (%1)"
+ " discarding others" ).arg( i ), 2000 );
+ break;
+ }
+ }
+
+ file.close();
+
+ TQString bad = "";
+ if ( errors ) {
+ bad = TQString( "; skipped " ) + TQString::number( errors ) + " bad record";
+ if ( errors > 1 )
+ bad += "s";
+ }
+ statusBar()->message( TQString( "Read %1 values from \'%2\'%3" ).
+ arg( i ).arg( filename ).arg( bad ), 3000 );
+
+ setCaption( TQString( "Chart -- %1" ).arg( filename ) );
+ updateRecentFiles( filename );
+
+ drawElements();
+ m_changed = FALSE;
+}
+
+
+void ChartForm::fileSave()
+{
+ if ( m_filename.isEmpty() ) {
+ fileSaveAs();
+ return;
+ }
+
+ TQFile file( m_filename );
+ if ( !file.open( IO_WriteOnly ) ) {
+ statusBar()->message( TQString( "Failed to save \'%1\'" ).
+ arg( m_filename ), 2000 );
+ return;
+ }
+ TQTextStream ts( &file );
+ for ( int i = 0; i < MAX_ELEMENTS; ++i )
+ if ( m_elements[i].isValid() )
+ ts << m_elements[i];
+
+ file.close();
+
+ setCaption( TQString( "Chart -- %1" ).arg( m_filename ) );
+ statusBar()->message( TQString( "Saved \'%1\'" ).arg( m_filename ), 2000 );
+ m_changed = FALSE;
+}
+
+
+void ChartForm::fileSaveAsPixmap()
+{
+ TQString filename = TQFileDialog::getSaveFileName(
+ TQString::null, "Images (*.png *.xpm *.jpg)",
+ this, "file save as bitmap",
+ "Chart -- File Save As Bitmap" );
+ if ( TQPixmap::grabWidget( m_canvasView ).
+ save( filename,
+ filename.mid( filename.findRev( '.' ) + 1 ).upper() ) )
+ statusBar()->message( TQString( "Wrote \'%1\'" ).arg( filename ), 2000 );
+ else
+ statusBar()->message( TQString( "Failed to write \'%1\'" ).
+ arg( filename ), 2000 );
+}
+
+void ChartForm::filePrint()
+{
+ if ( !m_printer )
+ m_printer = new TQPrinter;
+ if ( m_printer->setup() ) {
+ TQPainter painter( m_printer );
+ m_canvas->drawArea( TQRect( 0, 0, m_canvas->width(), m_canvas->height() ),
+ &painter, FALSE );
+ if ( !m_printer->outputFileName().isEmpty() )
+ statusBar()->message( TQString( "Printed \'%1\'" ).
+ arg( m_printer->outputFileName() ), 2000 );
+ }
+}
+
diff --git a/examples/chart/element.cpp b/examples/chart/element.cpp
new file mode 100644
index 000000000..570fccce8
--- /dev/null
+++ b/examples/chart/element.cpp
@@ -0,0 +1,127 @@
+#include "element.h"
+
+#include <qstringlist.h>
+#include <qtextstream.h>
+
+const char FIELD_SEP = ':';
+const char PROPOINT_SEP = ';';
+const char XY_SEP = ',';
+
+
+void Element::init( double value, TQColor valueColor, int valuePattern,
+ const TQString& label, TQColor labelColor )
+{
+ m_value = value;
+ m_valueColor = valueColor;
+ if ( valuePattern < TQt::SolidPattern || valuePattern > TQt::DiagCrossPattern )
+ valuePattern = TQt::SolidPattern;
+ m_valuePattern = valuePattern;
+ m_label = label;
+ m_labelColor = labelColor;
+}
+
+
+void Element::setValuePattern( int valuePattern )
+{
+ if ( valuePattern < TQt::SolidPattern || valuePattern > TQt::DiagCrossPattern )
+ valuePattern = TQt::SolidPattern;
+ m_valuePattern = valuePattern;
+}
+
+
+double Element::proX( int index ) const
+{
+ Q_ASSERT(index >= 0 && index < MAX_PROPOINTS);
+ return m_propoints[2 * index];
+}
+
+
+double Element::proY( int index ) const
+{
+ Q_ASSERT(index >= 0 && index < MAX_PROPOINTS);
+ return m_propoints[(2 * index) + 1];
+}
+
+
+void Element::setProX( int index, double value )
+{
+ Q_ASSERT(index >= 0 && index < MAX_PROPOINTS);
+ m_propoints[2 * index] = value;
+}
+
+
+void Element::setProY( int index, double value )
+{
+ Q_ASSERT(index >= 0 && index < MAX_PROPOINTS);
+ m_propoints[(2 * index) + 1] = value;
+}
+
+
+TQTextStream &operator<<( TQTextStream &s, const Element &element )
+{
+ s << element.value() << FIELD_SEP
+ << element.valueColor().name() << FIELD_SEP
+ << element.valuePattern() << FIELD_SEP
+ << element.labelColor().name() << FIELD_SEP;
+
+ for ( int i = 0; i < Element::MAX_PROPOINTS; ++i ) {
+ s << element.proX( i ) << XY_SEP << element.proY( i );
+ s << ( i == Element::MAX_PROPOINTS - 1 ? FIELD_SEP : PROPOINT_SEP );
+ }
+
+ s << element.label() << '\n';
+
+ return s;
+}
+
+
+TQTextStream &operator>>( TQTextStream &s, Element &element )
+{
+ TQString data = s.readLine();
+ element.setValue( Element::INVALID );
+
+ int errors = 0;
+ bool ok;
+
+ TQStringList fields = TQStringList::split( FIELD_SEP, data );
+ if ( fields.count() >= 4 ) {
+ double value = fields[0].toDouble( &ok );
+ if ( !ok )
+ errors++;
+ TQColor valueColor = TQColor( fields[1] );
+ if ( !valueColor.isValid() )
+ errors++;
+ int valuePattern = fields[2].toInt( &ok );
+ if ( !ok )
+ errors++;
+ TQColor labelColor = TQColor( fields[3] );
+ if ( !labelColor.isValid() )
+ errors++;
+ TQStringList propoints = TQStringList::split( PROPOINT_SEP, fields[4] );
+ TQString label = data.section( FIELD_SEP, 5 );
+
+ if ( !errors ) {
+ element.set( value, valueColor, valuePattern, label, labelColor );
+ int i = 0;
+ for ( TQStringList::iterator point = propoints.begin();
+ i < Element::MAX_PROPOINTS && point != propoints.end();
+ ++i, ++point ) {
+ errors = 0;
+ TQStringList xy = TQStringList::split( XY_SEP, *point );
+ double x = xy[0].toDouble( &ok );
+ if ( !ok || x <= 0.0 || x >= 1.0 )
+ errors++;
+ double y = xy[1].toDouble( &ok );
+ if ( !ok || y <= 0.0 || y >= 1.0 )
+ errors++;
+ if ( errors )
+ x = y = Element::NO_PROPORTION;
+ element.setProX( i, x );
+ element.setProY( i, y );
+ }
+ }
+ }
+
+ return s;
+}
+
diff --git a/examples/chart/element.h b/examples/chart/element.h
new file mode 100644
index 000000000..a166d207a
--- /dev/null
+++ b/examples/chart/element.h
@@ -0,0 +1,84 @@
+#ifndef ELEMENT_H
+#define ELEMENT_H
+
+#include <qcolor.h>
+#include <qnamespace.h>
+#include <qstring.h>
+#include <qvaluevector.h>
+
+class Element;
+
+typedef TQValueVector<Element> ElementVector;
+
+/*
+ Elements are valid if they have a value which is > EPSILON.
+*/
+const double EPSILON = 0.0000001; // Must be > INVALID.
+
+
+class Element
+{
+public:
+ enum { INVALID = -1 };
+ enum { NO_PROPORTION = -1 };
+ enum { MAX_PROPOINTS = 3 }; // One proportional point per chart type
+
+ Element( double value = INVALID, TQColor valueColor = TQt::gray,
+ int valuePattern = TQt::SolidPattern,
+ const TQString& label = TQString::null,
+ TQColor labelColor = TQt::black ) {
+ init( value, valueColor, valuePattern, label, labelColor );
+ for ( int i = 0; i < MAX_PROPOINTS * 2; ++i )
+ m_propoints[i] = NO_PROPORTION;
+ }
+ ~Element() {}
+
+ bool isValid() const { return m_value > EPSILON; }
+
+ double value() const { return m_value; }
+ TQColor valueColor() const { return m_valueColor; }
+ int valuePattern() const { return m_valuePattern; }
+ TQString label() const { return m_label; }
+ TQColor labelColor() const { return m_labelColor; }
+ double proX( int index ) const;
+ double proY( int index ) const;
+
+ void set( double value = INVALID, TQColor valueColor = TQt::gray,
+ int valuePattern = TQt::SolidPattern,
+ const TQString& label = TQString::null,
+ TQColor labelColor = TQt::black ) {
+ init( value, valueColor, valuePattern, label, labelColor );
+ }
+ void setValue( double value ) { m_value = value; }
+ void setValueColor( TQColor valueColor ) { m_valueColor = valueColor; }
+ void setValuePattern( int valuePattern );
+ void setLabel( const TQString& label ) { m_label = label; }
+ void setLabelColor( TQColor labelColor ) { m_labelColor = labelColor; }
+ void setProX( int index, double value );
+ void setProY( int index, double value );
+
+#ifdef Q_FULL_TEMPLATE_INSTANTIATION
+ // xlC 3.x workaround
+ Q_DUMMY_COMPARISON_OPERATOR(Element)
+ bool operator!=( const Element& e) const {
+ return ( !(e == *this) );
+ }
+#endif
+
+private:
+ void init( double value, TQColor valueColor, int valuePattern,
+ const TQString& label, TQColor labelColor );
+
+ double m_value;
+ TQColor m_valueColor;
+ int m_valuePattern;
+ TQString m_label;
+ TQColor m_labelColor;
+ double m_propoints[2 * MAX_PROPOINTS];
+};
+
+
+TQTextStream &operator<<( TQTextStream&, const Element& );
+TQTextStream &operator>>( TQTextStream&, Element& );
+
+#endif
diff --git a/examples/chart/images/chart-forms.sk b/examples/chart/images/chart-forms.sk
new file mode 100644
index 000000000..d9087b48d
--- /dev/null
+++ b/examples/chart/images/chart-forms.sk
@@ -0,0 +1,256 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(188.034,0,0,-149.201,526.688,-521.707)
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(128.762,0,0,-92.995,341.407,-572.49)
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(128.762,0,0,-92.995,768.68,-572.934)
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(31.6796,0,0,31.6796,635.564,-722.4)
+fp((0.8,0.8,0.8))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(188.034,0,0,-149.201,518.884,-513.603)
+fp((1,1,1))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(158.398,0,0,-106.28,533.702,-545.185)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow-Bold')
+Fs(18)
+txt('ChartForm',(575.182,-535.064))
+fp((0.8,0.8,0.8))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(128.762,0,0,-92.995,335.96,-566.743)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow-Bold')
+Fs(18)
+txt('OptionsForm',(354.009,-589.226))
+fp((0.8,0.8,0.8))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(128.762,0,0,-92.995,763.221,-566.743)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow-Bold')
+Fs(18)
+txt('SetDataForm',(781.675,-587.279))
+fp((1,0,1))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(31.6796,0,0,31.6796,631.296,-719.01)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow-BoldOblique')
+Fs(18)
+txt('chart',(613.251,-723.609))
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow-Bold')
+Fs(18)
+txt('CanvasView',(569.827,-575.941))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow-Bold')
+Fs(18)
+txt('depicting a',(573.94,-595.357))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow-Bold')
+Fs(18)
+txt('QCanvas',(580.906,-614.774))
+G_()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(662.975,-716.966,0)
+bc(669.107,-712.686,671.463,-709.765,672.485,-707.625,2)
+bc(673.507,-705.485,677.438,-697.225,677.438,-696.155,2)
+bc(677.438,-695.085,679.326,-682.725,679.326,-682.725,2)
+bc(679.326,-682.725,679.326,-670.955,679.326,-670.955,2)
+bc(679.326,-670.955,679.326,-665.605,679.326,-664.535,2)
+lw(1.41732)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(710.729,-618.861,0)
+bs(759.036,-618.861,0)
+lw(1.41732)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(515.603,-617.742,0)
+bs(467.885,-617.742,0)
+G()
+fp((0,0.392,0))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(29.7517,0,0,-7.65884,468.929,-768.389)
+fp((0,0.392,0))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(58.9143,0,0,-44.1857,439.032,-724.349)
+fp((0,0.392,0))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(29.7517,0,0,-7.65884,468.929,-722.581)
+G_()
+lw(1.41732)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(499.125,-739.077,0)
+bc(507.548,-735.049,508.671,-732.747,512.04,-728.144,2)
+bc(515.409,-723.54,519.901,-717.21,520.463,-716.059,2)
+bc(521.024,-714.909,531.132,-689.589,531.132,-689.589,2)
+bc(531.132,-689.589,533.378,-679.231,533.378,-679.231,2)
+bc(533.378,-679.231,535.062,-671.175,535.062,-671.175,2)
+bc(535.062,-671.175,535.062,-664.845,535.062,-664.845,2)
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica-Narrow-Bold')
+Fs(18)
+txt('disk',(453.761,-753.806))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow')
+Fs(18)
+txt('run',(681.17,-700.783))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow')
+Fs(18)
+txt('save',(524.007,-725.891))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow')
+Fs(18)
+txt('load',(494.295,-706.489))
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(143.737,0,0,-67.586,525.422,-405.581)
+fp((0.596,0.984,0.596))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(143.737,0,0,-67.586,519.327,-401.081)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow')
+Fs(18)
+txt('getOpenFileName()',(526.396,-420.297))
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(143.737,0,0,-67.586,704.655,-405.581)
+fp((0.596,0.984,0.596))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(143.737,0,0,-67.586,698.561,-401.081)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow')
+Fs(18)
+txt('getSaveFileName()',(706.863,-420.39))
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(100.503,0,0,-67.586,375.286,-429.722)
+fp((0.529,0.808,0.98))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(100.503,0,0,-67.586,371.024,-425.223)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow')
+Fs(18)
+txt('getFont()',(391.333,-444.571))
+fp((0.9,0.9,0.9))
+le()
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(100.503,0,0,-67.586,935.176,-580.856)
+fp((1,0.753,0.796))
+lw(1.41732)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(100.503,0,0,-67.586,930.915,-576.357)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Narrow')
+Fs(18)
+txt('getColor()',(948.361,-598.303))
+lw(1.41732)
+ld((1, 1))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(591.836,-511.466,0)
+bs(591.836,-471.702,0)
+lw(1.41732)
+ld((1, 1))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(674.96,-513.083,0)
+bs(749.29,-470.169,0)
+lw(1.41732)
+ld((1, 1))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(538.877,-513.083,0)
+bs(472.859,-474.968,0)
+lw(1.41732)
+ld((1, 1))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(410.746,-562.437,0)
+bs(410.746,-494.504,0)
+lw(1.41732)
+ld((1, 1))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(895.423,-617.315,0)
+bs(928.721,-617.315,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/examples/chart/images/file_new.xpm b/examples/chart/images/file_new.xpm
new file mode 100644
index 000000000..8537176cd
--- /dev/null
+++ b/examples/chart/images/file_new.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static const char *file_new[] = {
+"20 20 12 1",
+" c white",
+"! c None",
+"# c #000",
+"$ c #2e2e2e2e2e2e",
+"% c #ffffffffffff",
+"& c #5c5c5c5c5c5c",
+"( c #878787878787",
+") c #c2c2c2c2c2c2",
+"* c black",
+"+ c #00C900",
+", c #ffff00",
+"- c red",
+"!!!!!!!!!!!!!!!!!!!!",
+"!!##########$!!!!!!!",
+"!!#%%%%%%%%#&$!!!!!!",
+"!!#%%%%%%%%#(&$!!!!!",
+"!!#%%%%%%%%#)(&$!!!!",
+"!!#%%%%%%%%#%)(&$!!!",
+"!!#%%%%*****#####!!!",
+"!!#%%%*+++++*%%%#!!!",
+"!!#%%*,++++++*%%#!!!",
+"!!#%*,,,++++++*%#!!!",
+"!!#%*,,,,+++++*%#!!!",
+"!!#%*,,,,-++++*%#!!!",
+"!!#%*,,,---+++*%#!!!",
+"!!#%*,,-----++*%#!!!",
+"!!#%%*-------*%%#!!!",
+"!!#%%%*-----*%%%#!!!",
+"!!#%%%%*****%%%%#!!!",
+"!!#%%%%%%%%%%%%%#!!!",
+"!!###############!!!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
diff --git a/examples/chart/images/file_open.xpm b/examples/chart/images/file_open.xpm
new file mode 100644
index 000000000..7a7b681d7
--- /dev/null
+++ b/examples/chart/images/file_open.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char *file_open[] = {
+"20 20 9 1",
+" c white",
+"! c None",
+"# c #002EFF",
+"$ c #000",
+"% c #ffffffff0",
+"& c #ffffffffffff",
+"( c #00C900",
+") c #ffff00",
+"* c #A500FF",
+"!!!!!!!!!!####!!!!#!",
+"!!!!!!!!!#!!!!##!##!",
+"!!!!!!!!!!!!!!!!###!",
+"!!!!!!!!!!!!!!!####!",
+"!!!!!!!!!!!!!!#####!",
+"!$$$$!!!!!!!!!!!!!!!",
+"$%&%&$$$$$$$$!!!!!!!",
+"$&%&%&%&%&%&$!!!!!!!",
+"$%&&&$$$$$&&$!!!!!!!",
+"$&&&$((((($&$!!!!!!!",
+"$%&$)(($$$$$$$$$$$$$",
+"$&$)))$***********$$",
+"$%$))$***********$$!",
+"$&$)$***********$$!!",
+"$%$$***********$$!!!",
+"$&$***********$$!!!!",
+"$$***********$$!!!!!",
+"$$***********$!!!!!!",
+"$$$$$$$$$$$$$!!!!!!!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
diff --git a/examples/chart/images/file_print.xpm b/examples/chart/images/file_print.xpm
new file mode 100644
index 000000000..915f65bab
--- /dev/null
+++ b/examples/chart/images/file_print.xpm
@@ -0,0 +1,115 @@
+/* XPM */
+static const char *file_print[] = {
+/* columns rows colors chars-per-pixel */
+"20 20 89 1",
+" c Gray0",
+". c #101008081010",
+"X c #101010101010",
+"o c #101010101818",
+"O c #181810101818",
+"+ c #181818181818",
+"@ c #181818182121",
+"# c #212118182121",
+"$ c Gray13",
+"% c #212121212929",
+"& c #292921212929",
+"* c Gray16",
+"= c #292929293131",
+"- c #313129293131",
+"; c #313131313131",
+": c #313131313939",
+"> c #393931313939",
+", c #393939393939",
+"< c #393939394242",
+"1 c #424239394242",
+"2 c Gray26",
+"3 c #4a4a4a4a5252",
+"4 c #5a5a52525a5a",
+"5 c #5a5a5a5a6363",
+"6 c #6b6b63636b6b",
+"7 c Gray42",
+"8 c #6b6b6b6b7373",
+"9 c #73736b6b7373",
+"0 c #7b7b73737b7b",
+"q c #7b7b73738484",
+"w c #0808ffff0808",
+"e c #2929ffff2929",
+"r c #3131ffff3131",
+"t c #5a5acece5a5a",
+"y c #6b6bffff6363",
+"u c #7b7bffff7b7b",
+"i c #84847b7b8484",
+"p c #84847b7b8c8c",
+"a c #8c8c7b7b9494",
+"s c #848484848c8c",
+"d c #8c8c84848c8c",
+"f c Gray55",
+"g c #8c8c84849494",
+"h c #8c8c8c8c9494",
+"j c #94948c8c9494",
+"k c #94948c8c9c9c",
+"l c Gray58",
+"z c #949494949c9c",
+"x c #9c9c94949c9c",
+"c c Gray61",
+"v c #9c9c9494a5a5",
+"b c #9c9c9c9ca5a5",
+"n c #a5a59c9ca5a5",
+"m c #a5a59c9cadad",
+"M c #adad9c9cadad",
+"N c #a5a5a5a5a5a5",
+"B c #a5a5a5a5adad",
+"V c #adada5a5adad",
+"C c Gray68",
+"Z c #adadadadb5b5",
+"A c #b5b5adadb5b5",
+"S c Gray71",
+"D c Gray74",
+"F c #9494c6c69494",
+"G c #9c9ccecea5a5",
+"H c #bdbdd6d6bdbd",
+"J c #c0c0c0c0c0c0",
+"K c #c6c6c6c6c6c6",
+"L c #cecec6c6cece",
+"P c #cececececece",
+"I c #cecececed6d6",
+"U c #d6d6ceced6d6",
+"Y c #d6d6cecedede",
+"T c Gray84",
+"R c #d6d6d6d6dede",
+"E c #deded6d6dede",
+"W c Gray87",
+"Q c #deded6d6e7e7",
+"! c #dedededee7e7",
+"~ c #d6d6ffffd6d6",
+"^ c #e7e7dedee7e7",
+"/ c #e7e7e7e7e7e7",
+"( c #e7e7e7e7efef",
+") c #efefe7e7efef",
+"_ c #efefefefefef",
+"` c #e7e7ffffe7e7",
+"' c Gray97",
+"] c Gray100",
+"[ c None",
+/* pixels */
+"[[[[[[SDPPKKDDCD[[[[",
+"[[[[[[D_///___WD[[[[",
+"[[[[[[DKKPKKKKDK[[[[",
+"[[[[[[SDDSDDSSCD[[[[",
+"[[[[[KCKDKDDDKS[[[[[",
+"[[[[[KDDDDDDDDS[[[[[",
+"[[[[[CP/WWWWTWNNZ[[[",
+"[[[Dc9STPTPTWWj427S[",
+"[[Dziq00000pag8<%@2N",
+"[DcE(!ERRUYGtFn2##O<",
+"Db)]]]]]]]~ewePa;@X#",
+"V']]]]]]]]`yru]Q0@ #",
+"BRILITRRWE!RHUILhO @",
+"jAZVBmBnmmnmMvzh6o #",
+"jZZmBnnnbbbbvxxg6o +",
+"lmmnbnbbbvxxxvjs6O 3",
+"jBnnvcvxvxvxzjhd8o+C",
+"lsdgfgdhghjhjkhg6+l[",
+"S9%@$%&&&-::>>:-:l[[",
+"[[C511,:;**%++.2c[[["
+};
diff --git a/examples/chart/images/file_save.xpm b/examples/chart/images/file_save.xpm
new file mode 100644
index 000000000..616389921
--- /dev/null
+++ b/examples/chart/images/file_save.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static const char *file_save[] = {
+"20 20 9 1",
+" c white",
+"! c #000",
+"# c #002EFF",
+"$ c #999999999999",
+"% c None",
+"& c #00C900",
+"( c #ffff00",
+") c red1",
+"* c black",
+"!!!!!!!!!!!!!!!!!!!!",
+"!##!$$$!!!!!!$$$!%%!",
+"!##!$$!&&&&&&!$$!%%!",
+"!##!$!(&&&&&&&!$!!!!",
+"!##!!(((&&&&&&&!!##!",
+"!##!!((((&&&&&&!!##!",
+"!##!!((((()&&&&!!##!",
+"!##!!((())))&&&!!##!",
+"!##!!(())))))&&!!##!",
+"!##!$!))))))))!$!##!",
+"!###!$!))))))!$*###!",
+"!####***!!!!!***###!",
+"!##################!",
+"!###!!!!!!!!!!!!!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"!###!!!!!!!!!$$$!##!",
+"%!!!!!!!!!!!!!!!!!!%"
+};
diff --git a/examples/chart/images/file_saveaspostscript.xpm b/examples/chart/images/file_saveaspostscript.xpm
new file mode 100644
index 000000000..7dd75fcf7
--- /dev/null
+++ b/examples/chart/images/file_saveaspostscript.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static const char *file_saveaspostscript[] = {
+"20 20 10 1",
+" c white",
+"! c #000",
+"# c #002EFF",
+"$ c #999999999999",
+"% c None",
+"& c #00C900",
+"( c #ffff00",
+") c red1",
+"* c black",
+"+ c grey100",
+"!!!!!!!!!!!!!!!!!!!!",
+"!##!$$$!!!!!!$$$!%%!",
+"!##!$$!&&&&&&!$$!%%!",
+"!##!$!(&&&&&&&!$!!!!",
+"!##!!(((&&&&&&&!!##!",
+"!##!!((((&&&&&&!!##!",
+"!##!!((((()&&&&!!##!",
+"!##!!((())))&&&!!##!",
+"!##!!(())))))&&!!##!",
+"!##!$!))))))))!$!##!",
+"!###!$!))))))!$*###!",
+"!####***!!!!!***###!",
+"!##################!",
+"!###!!!!!!!!!!!!!##!",
+"!###!+++!+++!$$$!##!",
+"!###!+!+!+!!!$$$!##!",
+"!###!+++!+++!$$$!##!",
+"!###!+!!!!!+!$$$!##!",
+"!###!+!!!+++!$$$!##!",
+"%!!!!!!!!!!!!!!!!!!%"
+};
diff --git a/examples/chart/images/options_horizontalbarchart.xpm b/examples/chart/images/options_horizontalbarchart.xpm
new file mode 100644
index 000000000..afb06ffa9
--- /dev/null
+++ b/examples/chart/images/options_horizontalbarchart.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static const char *options_horizontalbarchart[] = {
+"20 20 7 1",
+"( c #A500FF",
+" c white",
+"! c red1",
+"# c None",
+"$ c #E9FF00",
+"% c #00C900",
+"& c #002EFF",
+"!!!!!!!!!!!!!!######",
+"!!!!!!!!!!!!!!######",
+"!!!!!!!!!!!!!!######",
+"!!!!!!!!!!!!!!######",
+"$$$$$$$$$$$$$$$$$###",
+"$$$$$$$$$$$$$$$$$###",
+"$$$$$$$$$$$$$$$$$###",
+"$$$$$$$$$$$$$$$$$###",
+"%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%",
+"&&&&&&&&&&&&&&######",
+"&&&&&&&&&&&&&&######",
+"&&&&&&&&&&&&&&######",
+"&&&&&&&&&&&&&&######",
+"(((((((((((#########",
+"(((((((((((#########",
+"(((((((((((#########",
+"(((((((((((#########"
+};
diff --git a/examples/chart/images/options_piechart.xpm b/examples/chart/images/options_piechart.xpm
new file mode 100644
index 000000000..221c78de1
--- /dev/null
+++ b/examples/chart/images/options_piechart.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static const char *options_piechart[] = {
+"20 20 6 1",
+" c white",
+"! c None",
+"# c black",
+"$ c #00C900",
+"% c #E9FF00",
+"& c red1",
+"!!!!!!#######!!!!!!!",
+"!!!!##$$$$$$$##!!!!!",
+"!!!#%$$$$$$$$$$#!!!!",
+"!!#%%%$$$$$$$$$$#!!!",
+"!#%%%%%$$$$$$$$$$#!!",
+"!#%%%%%$$$$$$$$$$#!!",
+"#%%%%%%%$$$$$$$$$$#!",
+"#%%%%%%%%$$$$$$$$$#!",
+"#%%%%%%%%$$$$$$$$$#!",
+"#%%%%%%%%%$$$$$$$$#!",
+"#%%%%%%%%&&$$$$$$$#!",
+"#%%%%%%%&&&&$$$$$$#!",
+"#%%%%%%&&&&&&&$$$$#!",
+"#%%%%%&&&&&&&&&$$$#!",
+"!#%%%&&&&&&&&&&&&#!!",
+"!#%%&&&&&&&&&&&&&#!!",
+"!!#&&&&&&&&&&&&&#!!!",
+"!!!#&&&&&&&&&&&#!!!!",
+"!!!!##&&&&&&&##!!!!!",
+"!!!!!!#######!!!!!!!"
+};
diff --git a/examples/chart/images/options_setdata.xpm b/examples/chart/images/options_setdata.xpm
new file mode 100644
index 000000000..4ff70a54b
--- /dev/null
+++ b/examples/chart/images/options_setdata.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static const char *options_setdata[] = {
+"20 20 10 1",
+" c white",
+"! c None",
+"# c grey40",
+"$ c #002EFF",
+"% c black",
+"& c red1",
+"( c #00C900",
+") c #A500FF",
+"* c #E9FF00",
+"+ c cyan1",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!$$!!#####!%%!",
+"!#####!$$!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!&&!!#####!%%!",
+"!#####!&&!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!((!!#####!%%!",
+"!#####!((!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!))!!#####!%%!",
+"!#####!))!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!**!!#####!%%!",
+"!#####!**!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#####!++!!#####!%%!",
+"!#####!++!!#####!%%!",
+"!!!!!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
diff --git a/examples/chart/images/options_setfont.xpm b/examples/chart/images/options_setfont.xpm
new file mode 100644
index 000000000..ab5522480
--- /dev/null
+++ b/examples/chart/images/options_setfont.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char *options_setfont[] = {
+"20 20 3 1",
+" c white",
+"! c None",
+"# c #002EFF",
+"!!!!!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!#####!!!",
+"!!!!!!!!!!!#######!!",
+"!!!!!!!!!!!##!!!!##!",
+"!!!!!!!!!!##!!!!###!",
+"!!!!!!!!!!##!!!!###!",
+"!!!!!!!!!###!!!!!!!!",
+"!!!!!!!!!##!!!!!!!!!",
+"!!!!!#############!!",
+"!!!!###!!########!!!",
+"!!!##!!!!##!!!!!!!!!",
+"!!!##!!!!#!!!!!!!!!!",
+"!!!!!!!!##!!!!!!!!!!",
+"!!!!!!!!##!!!!!!!!!!",
+"!!!!!!!###!!!!!!!!!!",
+"!!!!!!!##!!!!!!!!!!!",
+"!!!!!!##!!!!!!!!!!!!",
+"!#!!!###!!!!!!!!!!!!",
+"!######!!!!!!!!!!!!!",
+"!!####!!!!!!!!!!!!!!"
+};
diff --git a/examples/chart/images/options_setoptions.xpm b/examples/chart/images/options_setoptions.xpm
new file mode 100644
index 000000000..029cf47d1
--- /dev/null
+++ b/examples/chart/images/options_setoptions.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static const char *options_setoptions[] = {
+"20 20 8 1",
+"( c #A500FF",
+" c white",
+") c grey30",
+"! c None",
+"# c #000",
+"$ c grey60",
+"% c grey100",
+"& c black",
+"!!!!!!!!!!!!!!!!!!!!",
+"!#############$$$$$!",
+"!#%%%%%%%%%%%%&$$$$!",
+"!#%%%%%%%%%%%%%&$$$!",
+"!#%%%%%%%%%%%%%%&$$!",
+"!#%%%%%%%%%%%%%%%&$!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#(((((((%%%%%%%%%#!",
+"!#(((((((%%%%%%%%%#!",
+"!#%%((%%%%%)%))))%#!",
+"!#%%((%%%%%%%%%%%%#!",
+"!#%%((%)))%)))%))%#!",
+"!#%%%%%%%%%%%%%%%%#!",
+"!#%%))%)%))))%))%%#!",
+"!#%%%%%%%%%%%%%%%%#!",
+"!#%%%%%%%%%%%%%%%%#!",
+"!##################!",
+"!!!!!!!!!!!!!!!!!!!!"
+};
diff --git a/examples/chart/images/options_verticalbarchart.xpm b/examples/chart/images/options_verticalbarchart.xpm
new file mode 100644
index 000000000..e812f0f9e
--- /dev/null
+++ b/examples/chart/images/options_verticalbarchart.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static const char *options_verticalbarchart[] = {
+"20 20 7 1",
+"( c #A500FF",
+" c white",
+"! c None",
+"# c #00C900",
+"$ c #E9FF00",
+"% c red1",
+"& c #002EFF",
+"!!!!!!!!####!!!!!!!!",
+"!!!!!!!!####!!!!!!!!",
+"!!!!!!!!####!!!!!!!!",
+"!!!!$$$$####!!!!!!!!",
+"!!!!$$$$####!!!!!!!!",
+"!!!!$$$$####!!!!!!!!",
+"%%%%$$$$####&&&&!!!!",
+"%%%%$$$$####&&&&!!!!",
+"%%%%$$$$####&&&&!!!!",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&((((",
+"%%%%$$$$####&&&&(((("
+};
diff --git a/examples/chart/images/pattern01.xpm b/examples/chart/images/pattern01.xpm
new file mode 100644
index 000000000..26a70cbd8
--- /dev/null
+++ b/examples/chart/images/pattern01.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static const char *pattern01[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 1 1",
+" c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/examples/chart/images/pattern02.xpm b/examples/chart/images/pattern02.xpm
new file mode 100644
index 000000000..cc5b7948c
--- /dev/null
+++ b/examples/chart/images/pattern02.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern02[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+". . . . . . . . . . ",
+" ",
+" ",
+" ",
+". . . . . . . . . . ",
+" ",
+" ",
+" ",
+". . . . . . . . . . ",
+" ",
+" ",
+" ",
+". . . . . . . . . . ",
+" ",
+" ",
+" ",
+". . . . . . . . . . ",
+" ",
+" ",
+" "
+};
diff --git a/examples/chart/images/pattern03.xpm b/examples/chart/images/pattern03.xpm
new file mode 100644
index 000000000..d9fc57a94
--- /dev/null
+++ b/examples/chart/images/pattern03.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern03[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+" . . . . . . . . . . ",
+" ",
+". . . . . . . . . . ",
+" ",
+" . . . . . . . . . . ",
+" ",
+". . . . . . . . . . ",
+" ",
+" . . . . . . . . . . ",
+" ",
+". . . . . . . . . . ",
+" ",
+" . . . . . . . . . . ",
+" ",
+". . . . . . . . . . ",
+" ",
+" . . . . . . . . . . ",
+" ",
+". . . . . . . . . . ",
+" "
+};
diff --git a/examples/chart/images/pattern04.xpm b/examples/chart/images/pattern04.xpm
new file mode 100644
index 000000000..85b9223b6
--- /dev/null
+++ b/examples/chart/images/pattern04.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern04[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+". . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+" . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+" . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+" . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+" . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+" . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . ."
+};
diff --git a/examples/chart/images/pattern05.xpm b/examples/chart/images/pattern05.xpm
new file mode 100644
index 000000000..cc7beee90
--- /dev/null
+++ b/examples/chart/images/pattern05.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern05[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . .",
+". . . . . . . . . . . . . . . . . . . . "
+};
diff --git a/examples/chart/images/pattern06.xpm b/examples/chart/images/pattern06.xpm
new file mode 100644
index 000000000..ad8b05545
--- /dev/null
+++ b/examples/chart/images/pattern06.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern06[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . ",
+".. ... ... ... ... ... ... ... ... ... .",
+". . . . . . . . . . . . . . . . . . . . ",
+" ... ... ... ... ... ... ... ... ... ...",
+". . . . . . . . . . . . . . . . . . . . "
+};
diff --git a/examples/chart/images/pattern07.xpm b/examples/chart/images/pattern07.xpm
new file mode 100644
index 000000000..d01c55f9f
--- /dev/null
+++ b/examples/chart/images/pattern07.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern07[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................",
+" ... ... ... ... ... ... ... ... ... ...",
+"........................................",
+".. ... ... ... ... ... ... ... ... ... .",
+"........................................"
+};
diff --git a/examples/chart/images/pattern08.xpm b/examples/chart/images/pattern08.xpm
new file mode 100644
index 000000000..b0ce09fec
--- /dev/null
+++ b/examples/chart/images/pattern08.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern08[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................",
+"........................................",
+"........................................",
+"... ... ... ... ... ... ... ... ... ... ",
+"........................................"
+};
diff --git a/examples/chart/images/pattern09.xpm b/examples/chart/images/pattern09.xpm
new file mode 100644
index 000000000..7d34bc428
--- /dev/null
+++ b/examples/chart/images/pattern09.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern09[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+"........................................",
+" ",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+" ",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+" ",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+"........................................",
+" "
+};
diff --git a/examples/chart/images/pattern10.xpm b/examples/chart/images/pattern10.xpm
new file mode 100644
index 000000000..c908016d6
--- /dev/null
+++ b/examples/chart/images/pattern10.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern10[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... .",
+".. ..... ..... ..... ..... ..... ..... ."
+};
diff --git a/examples/chart/images/pattern11.xpm b/examples/chart/images/pattern11.xpm
new file mode 100644
index 000000000..8feda9a4f
--- /dev/null
+++ b/examples/chart/images/pattern11.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern11[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+" ",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+" ",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+" ",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... ..",
+". ..... ..... ..... ..... ..... ..... .."
+};
diff --git a/examples/chart/images/pattern12.xpm b/examples/chart/images/pattern12.xpm
new file mode 100644
index 000000000..a57233f25
--- /dev/null
+++ b/examples/chart/images/pattern12.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern12[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+"..... ....... ....... ....... ....... ..",
+".... ....... ....... ....... ....... ...",
+"... ....... ....... ....... ....... ....",
+".. ....... ....... ....... ....... .....",
+". ....... ....... ....... ....... ......",
+" ....... ....... ....... ....... .......",
+"....... ....... ....... ....... ....... ",
+"...... ....... ....... ....... ....... .",
+"..... ....... ....... ....... ....... ..",
+".... ....... ....... ....... ....... ...",
+"... ....... ....... ....... ....... ....",
+".. ....... ....... ....... ....... .....",
+". ....... ....... ....... ....... ......",
+" ....... ....... ....... ....... .......",
+"....... ....... ....... ....... ....... ",
+"...... ....... ....... ....... ....... .",
+"..... ....... ....... ....... ....... ..",
+".... ....... ....... ....... ....... ...",
+"... ....... ....... ....... ....... ....",
+".. ....... ....... ....... ....... ....."
+};
diff --git a/examples/chart/images/pattern13.xpm b/examples/chart/images/pattern13.xpm
new file mode 100644
index 000000000..97f874fef
--- /dev/null
+++ b/examples/chart/images/pattern13.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern13[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+" ....... ....... ....... ....... .......",
+". ....... ....... ....... ....... ......",
+".. ....... ....... ....... ....... .....",
+"... ....... ....... ....... ....... ....",
+".... ....... ....... ....... ....... ...",
+"..... ....... ....... ....... ....... ..",
+"...... ....... ....... ....... ....... .",
+"....... ....... ....... ....... ....... ",
+" ....... ....... ....... ....... .......",
+". ....... ....... ....... ....... ......",
+".. ....... ....... ....... ....... .....",
+"... ....... ....... ....... ....... ....",
+".... ....... ....... ....... ....... ...",
+"..... ....... ....... ....... ....... ..",
+"...... ....... ....... ....... ....... .",
+"....... ....... ....... ....... ....... ",
+" ....... ....... ....... ....... .......",
+". ....... ....... ....... ....... ......",
+".. ....... ....... ....... ....... .....",
+"... ....... ....... ....... ....... ...."
+};
diff --git a/examples/chart/images/pattern14.xpm b/examples/chart/images/pattern14.xpm
new file mode 100644
index 000000000..e9e68845c
--- /dev/null
+++ b/examples/chart/images/pattern14.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static const char *pattern14[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 2 1",
+" c black",
+". c white",
+/* pixels */
+"... . ..... . ..... . ..... . ..... . ..",
+".. ... ... ... ... ... ... ... ... ... .",
+". ..... . ..... . ..... . ..... . ..... ",
+" ....... ....... ....... ....... .......",
+". ..... . ..... . ..... . ..... . ..... ",
+".. ... ... ... ... ... ... ... ... ... .",
+"... . ..... . ..... . ..... . ..... . ..",
+".... ....... ....... ....... ....... ...",
+"... . ..... . ..... . ..... . ..... . ..",
+".. ... ... ... ... ... ... ... ... ... .",
+". ..... . ..... . ..... . ..... . ..... ",
+" ....... ....... ....... ....... .......",
+". ..... . ..... . ..... . ..... . ..... ",
+".. ... ... ... ... ... ... ... ... ... .",
+"... . ..... . ..... . ..... . ..... . ..",
+".... ....... ....... ....... ....... ...",
+"... . ..... . ..... . ..... . ..... . ..",
+".. ... ... ... ... ... ... ... ... ... .",
+". ..... . ..... . ..... . ..... . ..... ",
+" ....... ....... ....... ....... ......."
+};
diff --git a/examples/chart/main.cpp b/examples/chart/main.cpp
new file mode 100644
index 000000000..328e7fe54
--- /dev/null
+++ b/examples/chart/main.cpp
@@ -0,0 +1,21 @@
+#include <qapplication.h>
+#include "chartform.h"
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ TQString filename;
+ if ( app.argc() > 1 ) {
+ filename = app.argv()[1];
+ if ( !filename.endsWith( ".cht" ) )
+ filename = TQString::null;
+ }
+
+ ChartForm *cf = new ChartForm( filename );
+ app.setMainWidget( cf );
+ cf->show();
+
+ return app.exec();
+}
diff --git a/examples/chart/optionsform.cpp b/examples/chart/optionsform.cpp
new file mode 100644
index 000000000..c6e16af5d
--- /dev/null
+++ b/examples/chart/optionsform.cpp
@@ -0,0 +1,135 @@
+#include "optionsform.h"
+
+#include <qbuttongroup.h>
+#include <qcombobox.h>
+#include <qfontdialog.h>
+#include <qframe.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+
+#include "images/options_horizontalbarchart.xpm"
+#include "images/options_piechart.xpm"
+#include "images/options_verticalbarchart.xpm"
+
+
+OptionsForm::OptionsForm( TQWidget* parent, const char* name,
+ bool modal, WFlags f )
+ : TQDialog( parent, name, modal, f )
+{
+ setCaption( "Chart -- Options" );
+ resize( 320, 290 );
+
+ optionsFormLayout = new TQVBoxLayout( this, 11, 6 );
+
+ chartTypeLayout = new TQHBoxLayout( 0, 0, 6 );
+
+ chartTypeTextLabel = new TQLabel( "&Chart Type", this );
+ chartTypeLayout->addWidget( chartTypeTextLabel );
+
+ chartTypeComboBox = new TQComboBox( FALSE, this );
+ chartTypeComboBox->insertItem( TQPixmap( options_piechart ), "Pie Chart" );
+ chartTypeComboBox->insertItem( TQPixmap( options_verticalbarchart ),
+ "Vertical Bar Chart" );
+ chartTypeComboBox->insertItem( TQPixmap( options_horizontalbarchart ),
+ "Horizontal Bar Chart" );
+ chartTypeLayout->addWidget( chartTypeComboBox );
+ optionsFormLayout->addLayout( chartTypeLayout );
+
+ fontLayout = new TQHBoxLayout( 0, 0, 6 );
+
+ fontPushButton = new TQPushButton( "&Font...", this );
+ fontLayout->addWidget( fontPushButton );
+ TQSpacerItem* spacer = new TQSpacerItem( 0, 0,
+ TQSizePolicy::Expanding,
+ TQSizePolicy::Minimum );
+ fontLayout->addItem( spacer );
+
+ fontTextLabel = new TQLabel( this ); // Must be set by caller via setFont()
+ fontLayout->addWidget( fontTextLabel );
+ optionsFormLayout->addLayout( fontLayout );
+
+ addValuesFrame = new TQFrame( this );
+ addValuesFrame->setFrameShape( TQFrame::StyledPanel );
+ addValuesFrame->setFrameShadow( TQFrame::Sunken );
+ addValuesFrameLayout = new TQVBoxLayout( addValuesFrame, 11, 6 );
+
+ addValuesButtonGroup = new TQButtonGroup( "Show Values", addValuesFrame );
+ addValuesButtonGroup->setColumnLayout(0, TQt::Vertical );
+ addValuesButtonGroup->layout()->setSpacing( 6 );
+ addValuesButtonGroup->layout()->setMargin( 11 );
+ addValuesButtonGroupLayout = new TQVBoxLayout(
+ addValuesButtonGroup->layout() );
+ addValuesButtonGroupLayout->setAlignment( TQt::AlignTop );
+
+ noRadioButton = new TQRadioButton( "&No", addValuesButtonGroup );
+ noRadioButton->setChecked( TRUE );
+ addValuesButtonGroupLayout->addWidget( noRadioButton );
+
+ yesRadioButton = new TQRadioButton( "&Yes", addValuesButtonGroup );
+ addValuesButtonGroupLayout->addWidget( yesRadioButton );
+
+ asPercentageRadioButton = new TQRadioButton( "As &Percentage",
+ addValuesButtonGroup );
+ addValuesButtonGroupLayout->addWidget( asPercentageRadioButton );
+ addValuesFrameLayout->addWidget( addValuesButtonGroup );
+
+ decimalPlacesLayout = new TQHBoxLayout( 0, 0, 6 );
+
+ decimalPlacesTextLabel = new TQLabel( "&Decimal Places", addValuesFrame );
+ decimalPlacesLayout->addWidget( decimalPlacesTextLabel );
+
+ decimalPlacesSpinBox = new TQSpinBox( addValuesFrame );
+ decimalPlacesSpinBox->setMinValue( 0 );
+ decimalPlacesSpinBox->setMaxValue( 9 );
+ decimalPlacesLayout->addWidget( decimalPlacesSpinBox );
+
+ addValuesFrameLayout->addLayout( decimalPlacesLayout );
+
+ optionsFormLayout->addWidget( addValuesFrame );
+
+ buttonsLayout = new TQHBoxLayout( 0, 0, 6 );
+ spacer = new TQSpacerItem( 0, 0,
+ TQSizePolicy::Expanding, TQSizePolicy::Minimum );
+ buttonsLayout->addItem( spacer );
+
+ okPushButton = new TQPushButton( "OK", this );
+ okPushButton->setDefault( TRUE );
+ buttonsLayout->addWidget( okPushButton );
+
+ cancelPushButton = new TQPushButton( "Cancel", this );
+ buttonsLayout->addWidget( cancelPushButton );
+ optionsFormLayout->addLayout( buttonsLayout );
+
+ connect( fontPushButton, SIGNAL( clicked() ), this, SLOT( chooseFont() ) );
+ connect( okPushButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
+ connect( cancelPushButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
+
+ chartTypeTextLabel->setBuddy( chartTypeComboBox );
+ decimalPlacesTextLabel->setBuddy( decimalPlacesSpinBox );
+}
+
+
+void OptionsForm::chooseFont()
+{
+ bool ok;
+ TQFont font = TQFontDialog::getFont( &ok, m_font, this );
+ if ( ok )
+ setFont( font );
+}
+
+
+void OptionsForm::setFont( TQFont font )
+{
+ TQString label = font.family() + " " +
+ TQString::number( font.pointSize() ) + "pt";
+ if ( font.bold() )
+ label += " Bold";
+ if ( font.italic() )
+ label += " Italic";
+ fontTextLabel->setText( label );
+ m_font = font;
+}
diff --git a/examples/chart/optionsform.h b/examples/chart/optionsform.h
new file mode 100644
index 000000000..e9d07ad91
--- /dev/null
+++ b/examples/chart/optionsform.h
@@ -0,0 +1,60 @@
+#ifndef OPTIONSFORM_H
+#define OPTIONSFORM_H
+
+#include <qdialog.h>
+
+class TQButtonGroup;
+class TQComboBox;
+class TQFrame;
+class TQGridLayout;
+class TQHBoxLayout;
+class TQLabel;
+class TQPushButton;
+class TQRadioButton;
+class TQSpinBox;
+class TQVBoxLayout;
+
+
+class OptionsForm : public TQDialog
+{
+ Q_OBJECT
+public:
+ OptionsForm( TQWidget* parent = 0, const char* name = "options form",
+ bool modal = FALSE, WFlags f = 0 );
+ ~OptionsForm() {}
+
+ TQFont font() const { return m_font; }
+ void setFont( TQFont font );
+
+ TQLabel *chartTypeTextLabel;
+ TQComboBox *chartTypeComboBox;
+ TQPushButton *fontPushButton;
+ TQLabel *fontTextLabel;
+ TQFrame *addValuesFrame;
+ TQButtonGroup *addValuesButtonGroup;
+ TQRadioButton *noRadioButton;
+ TQRadioButton *yesRadioButton;
+ TQRadioButton *asPercentageRadioButton;
+ TQLabel *decimalPlacesTextLabel;
+ TQSpinBox *decimalPlacesSpinBox;
+ TQPushButton *okPushButton;
+ TQPushButton *cancelPushButton;
+
+protected slots:
+ void chooseFont();
+
+protected:
+ TQVBoxLayout *optionsFormLayout;
+ TQHBoxLayout *chartTypeLayout;
+ TQHBoxLayout *fontLayout;
+ TQVBoxLayout *addValuesFrameLayout;
+ TQVBoxLayout *addValuesButtonGroupLayout;
+ TQHBoxLayout *decimalPlacesLayout;
+ TQHBoxLayout *buttonsLayout;
+
+private:
+ TQFont m_font;
+};
+
+#endif
+
diff --git a/examples/chart/setdataform.cpp b/examples/chart/setdataform.cpp
new file mode 100644
index 000000000..d6c57e370
--- /dev/null
+++ b/examples/chart/setdataform.cpp
@@ -0,0 +1,208 @@
+#include "setdataform.h"
+#include "chartform.h"
+
+#include <qcolordialog.h>
+#include <qcombobox.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qtable.h>
+
+#include "images/pattern01.xpm"
+#include "images/pattern02.xpm"
+#include "images/pattern03.xpm"
+#include "images/pattern04.xpm"
+#include "images/pattern05.xpm"
+#include "images/pattern06.xpm"
+#include "images/pattern07.xpm"
+#include "images/pattern08.xpm"
+#include "images/pattern09.xpm"
+#include "images/pattern10.xpm"
+#include "images/pattern11.xpm"
+#include "images/pattern12.xpm"
+#include "images/pattern13.xpm"
+#include "images/pattern14.xpm"
+
+const int MAX_PATTERNS = 14;
+
+
+SetDataForm::SetDataForm( ElementVector *elements, int decimalPlaces,
+ TQWidget* parent, const char* name,
+ bool modal, WFlags f )
+ : TQDialog( parent, name, modal, f )
+
+{
+ m_elements = elements;
+ m_decimalPlaces = decimalPlaces;
+
+ setCaption( "Chart -- Set Data" );
+ resize( 540, 440 );
+
+ tableButtonBox = new TQVBoxLayout( this, 11, 6, "table button box layout" );
+
+ table = new TQTable( this, "data table" );
+ table->setNumCols( 5 );
+ table->setNumRows( ChartForm::MAX_ELEMENTS );
+ table->setColumnReadOnly( 1, TRUE );
+ table->setColumnReadOnly( 2, TRUE );
+ table->setColumnReadOnly( 4, TRUE );
+ table->setColumnWidth( 0, 80 );
+ table->setColumnWidth( 1, 60 ); // Columns 1 and 4 must be equal
+ table->setColumnWidth( 2, 60 );
+ table->setColumnWidth( 3, 200 );
+ table->setColumnWidth( 4, 60 );
+ TQHeader *th = table->horizontalHeader();
+ th->setLabel( 0, "Value" );
+ th->setLabel( 1, "Color" );
+ th->setLabel( 2, "Pattern" );
+ th->setLabel( 3, "Label" );
+ th->setLabel( 4, "Color" );
+ tableButtonBox->addWidget( table );
+
+ buttonBox = new TQHBoxLayout( 0, 0, 6, "button box layout" );
+
+ colorPushButton = new TQPushButton( this, "color button" );
+ colorPushButton->setText( "&Color..." );
+ colorPushButton->setEnabled( FALSE );
+ buttonBox->addWidget( colorPushButton );
+
+ TQSpacerItem *spacer = new TQSpacerItem( 0, 0, TQSizePolicy::Expanding,
+ TQSizePolicy::Minimum );
+ buttonBox->addItem( spacer );
+
+ okPushButton = new TQPushButton( this, "ok button" );
+ okPushButton->setText( "OK" );
+ okPushButton->setDefault( TRUE );
+ buttonBox->addWidget( okPushButton );
+
+ cancelPushButton = new TQPushButton( this, "cancel button" );
+ cancelPushButton->setText( "Cancel" );
+ cancelPushButton->setAccel( Key_Escape );
+ buttonBox->addWidget( cancelPushButton );
+
+ tableButtonBox->addLayout( buttonBox );
+
+ connect( table, SIGNAL( clicked(int,int,int,const TQPoint&) ),
+ this, SLOT( setColor(int,int) ) );
+ connect( table, SIGNAL( currentChanged(int,int) ),
+ this, SLOT( currentChanged(int,int) ) );
+ connect( table, SIGNAL( valueChanged(int,int) ),
+ this, SLOT( valueChanged(int,int) ) );
+ connect( colorPushButton, SIGNAL( clicked() ), this, SLOT( setColor() ) );
+ connect( okPushButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
+ connect( cancelPushButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
+
+ TQPixmap patterns[MAX_PATTERNS];
+ patterns[0] = TQPixmap( pattern01 );
+ patterns[1] = TQPixmap( pattern02 );
+ patterns[2] = TQPixmap( pattern03 );
+ patterns[3] = TQPixmap( pattern04 );
+ patterns[4] = TQPixmap( pattern05 );
+ patterns[5] = TQPixmap( pattern06 );
+ patterns[6] = TQPixmap( pattern07 );
+ patterns[7] = TQPixmap( pattern08 );
+ patterns[8] = TQPixmap( pattern09 );
+ patterns[9] = TQPixmap( pattern10 );
+ patterns[10] = TQPixmap( pattern11 );
+ patterns[11] = TQPixmap( pattern12 );
+ patterns[12] = TQPixmap( pattern13 );
+ patterns[13] = TQPixmap( pattern14 );
+
+ TQRect rect = table->cellRect( 0, 1 );
+ TQPixmap pix( rect.width(), rect.height() );
+
+ for ( int i = 0; i < ChartForm::MAX_ELEMENTS; ++i ) {
+ Element element = (*m_elements)[i];
+
+ if ( element.isValid() )
+ table->setText(
+ i, 0,
+ TQString( "%1" ).arg( element.value(), 0, 'f',
+ m_decimalPlaces ) );
+
+ TQColor color = element.valueColor();
+ pix.fill( color );
+ table->setPixmap( i, 1, pix );
+ table->setText( i, 1, color.name() );
+
+ TQComboBox *combobox = new TQComboBox;
+ for ( int j = 0; j < MAX_PATTERNS; ++j )
+ combobox->insertItem( patterns[j] );
+ combobox->setCurrentItem( element.valuePattern() - 1 );
+ table->setCellWidget( i, 2, combobox );
+
+ table->setText( i, 3, element.label() );
+
+ color = element.labelColor();
+ pix.fill( color );
+ table->setPixmap( i, 4, pix );
+ table->setText( i, 4, color.name() );
+ }
+
+}
+
+
+void SetDataForm::currentChanged( int, int col )
+{
+ colorPushButton->setEnabled( col == 1 || col == 4 );
+}
+
+
+void SetDataForm::valueChanged( int row, int col )
+{
+ if ( col == 0 ) {
+ bool ok;
+ double d = table->text( row, col ).toDouble( &ok );
+ if ( ok && d > EPSILON )
+ table->setText(
+ row, col, TQString( "%1" ).arg(
+ d, 0, 'f', m_decimalPlaces ) );
+ else if ( !table->text( row, col ).isEmpty() )
+ table->setText( row, col, table->text( row, col ) + "?" );
+ }
+}
+
+
+void SetDataForm::setColor()
+{
+ setColor( table->currentRow(), table->currentColumn() );
+ table->setFocus();
+}
+
+
+void SetDataForm::setColor( int row, int col )
+{
+ if ( !( col == 1 || col == 4 ) )
+ return;
+
+ TQColor color = TQColorDialog::getColor(
+ TQColor( table->text( row, col ) ),
+ this, "color dialog" );
+ if ( color.isValid() ) {
+ TQPixmap pix = table->pixmap( row, col );
+ pix.fill( color );
+ table->setPixmap( row, col, pix );
+ table->setText( row, col, color.name() );
+ }
+}
+
+
+void SetDataForm::accept()
+{
+ bool ok;
+ for ( int i = 0; i < ChartForm::MAX_ELEMENTS; ++i ) {
+ Element &element = (*m_elements)[i];
+ double d = table->text( i, 0 ).toDouble( &ok );
+ if ( ok )
+ element.setValue( d );
+ else
+ element.setValue( Element::INVALID );
+ element.setValueColor( TQColor( table->text( i, 1 ) ) );
+ element.setValuePattern(
+ ((TQComboBox*)table->cellWidget( i, 2 ))->currentItem() + 1 );
+ element.setLabel( table->text( i, 3 ) );
+ element.setLabelColor( TQColor( table->text( i, 4 ) ) );
+ }
+
+ TQDialog::accept();
+}
diff --git a/examples/chart/setdataform.h b/examples/chart/setdataform.h
new file mode 100644
index 000000000..e16dd784e
--- /dev/null
+++ b/examples/chart/setdataform.h
@@ -0,0 +1,47 @@
+#ifndef SETDATAFORM_H
+#define SETDATAFORM_H
+
+#include "element.h"
+
+#include <qdialog.h>
+
+class TQHBoxLayout;
+class TQPushButton;
+class TQTable;
+class TQVBoxLayout;
+
+
+class SetDataForm: public TQDialog
+{
+ Q_OBJECT
+public:
+ SetDataForm( ElementVector *elements, int decimalPlaces,
+ TQWidget *parent = 0, const char *name = "set data form",
+ bool modal = TRUE, WFlags f = 0 );
+ ~SetDataForm() {}
+
+public slots:
+ void setColor();
+ void setColor( int row, int col );
+ void currentChanged( int row, int col );
+ void valueChanged( int row, int col );
+
+protected slots:
+ void accept();
+
+private:
+ TQTable *table;
+ TQPushButton *colorPushButton;
+ TQPushButton *okPushButton;
+ TQPushButton *cancelPushButton;
+
+protected:
+ TQVBoxLayout *tableButtonBox;
+ TQHBoxLayout *buttonBox;
+
+private:
+ ElementVector *m_elements;
+ int m_decimalPlaces;
+};
+
+#endif
diff --git a/examples/checklists/checklists.cpp b/examples/checklists/checklists.cpp
new file mode 100644
index 000000000..b4f1e2353
--- /dev/null
+++ b/examples/checklists/checklists.cpp
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "checklists.h"
+
+#include <qlistview.h>
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qvaluelist.h>
+#include <qstring.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+
+/*
+ * Constructor
+ *
+ * Create all child widgets of the CheckList Widget
+ */
+
+CheckLists::CheckLists( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ TQHBoxLayout *lay = new TQHBoxLayout( this );
+ lay->setMargin( 5 );
+
+ // create a widget which layouts its childs in a column
+ TQVBoxLayout *vbox1 = new TQVBoxLayout( lay );
+ vbox1->setMargin( 5 );
+
+ // First child: a Label
+ vbox1->addWidget( new TQLabel( "Check some items!", this ) );
+
+ // Second child: the ListView
+ lv1 = new TQListView( this );
+ vbox1->addWidget( lv1 );
+ lv1->addColumn( "Items" );
+ lv1->setRootIsDecorated( TRUE );
+
+ // create a list with 4 ListViewItems which will be parent items of other ListViewItems
+ TQValueList<TQListViewItem *> parentList;
+
+ parentList.append( new TQCheckListItem( lv1, "Parent Item 1", TQCheckListItem::CheckBoxController ) );
+ parentList.append( new TQCheckListItem( lv1, "Parent Item 2", TQCheckListItem::CheckBoxController ) );
+ parentList.append( new TQCheckListItem( lv1, "Parent Item 3", TQCheckListItem::CheckBoxController ) );
+ parentList.append( new TQCheckListItem( lv1, "Parent Item 4", TQCheckListItem::CheckBoxController ) );
+
+ TQListViewItem *item = 0;
+ unsigned int num = 1;
+ // go through the list of parent items...
+ for ( TQValueList<TQListViewItem*>::Iterator it = parentList.begin(); it != parentList.end();
+ ( *it )->setOpen( TRUE ), ++it, num++ ) {
+ item = *it;
+ // ...and create 5 checkable child ListViewItems for each parent item
+ for ( unsigned int i = 1; i <= 5; i++ )
+ (void)new TQCheckListItem( item, TQString( "%1. Child of Parent %2" ).arg( i ).arg( num ), TQCheckListItem::CheckBox );
+ }
+
+ // Create another widget for layouting
+ TQVBoxLayout *tmp = new TQVBoxLayout( lay );
+ tmp->setMargin( 5 );
+
+ // create a pushbutton
+ TQPushButton *copy1 = new TQPushButton( " -> ", this );
+ tmp->addWidget( copy1 );
+ copy1->setMaximumWidth( copy1->sizeHint().width() );
+ // connect the SIGNAL clicked() of the pushbutton with the SLOT copy1to2()
+ connect( copy1, SIGNAL( clicked() ), this, SLOT( copy1to2() ) );
+
+ // another widget for layouting
+ TQVBoxLayout *vbox2 = new TQVBoxLayout( lay );
+ vbox2->setMargin( 5 );
+
+ // and another label
+ vbox2->addWidget( new TQLabel( "Check one item!", this ) );
+
+ // create the second listview
+ lv2 = new TQListView( this );
+ vbox2->addWidget( lv2 );
+ lv2->addColumn( "Items" );
+ lv2->setRootIsDecorated( TRUE );
+
+ // another widget needed for layouting only
+ tmp = new TQVBoxLayout( lay );
+ tmp->setMargin( 5 );
+
+ // create another pushbutton...
+ TQPushButton *copy2 = new TQPushButton( " -> ", this );
+ lay->addWidget( copy2 );
+ copy2->setMaximumWidth( copy2->sizeHint().width() );
+ // ...and connect its clicked() SIGNAL to the copy2to3() SLOT
+ connect( copy2, SIGNAL( clicked() ), this, SLOT( copy2to3() ) );
+
+ tmp = new TQVBoxLayout( lay );
+ tmp->setMargin( 5 );
+
+ // and create a label which will be at the right of the window
+ label = new TQLabel( "No Item yet...", this );
+ tmp->addWidget( label );
+}
+
+/*
+ * SLOT copy1to2()
+ *
+ * Copies all checked ListViewItems from the first ListView to
+ * the second one, and inserts them as Radio-ListViewItem.
+ */
+
+void CheckLists::copy1to2()
+{
+ // create an iterator which operates on the first ListView
+ TQListViewItemIterator it( lv1 );
+
+ lv2->clear();
+
+ // Insert first a controller Item into the second ListView. Always if Radio-ListViewItems
+ // are inserted into a Listview, the parent item of these MUST be a controller Item!
+ TQCheckListItem *item = new TQCheckListItem( lv2, "Controller", TQCheckListItem::Controller );
+ item->setOpen( TRUE );
+
+ // iterate through the first ListView...
+ for ( ; it.current(); ++it )
+ // ...check state of childs, and...
+ if ( it.current()->parent() )
+ // ...if the item is checked...
+ if ( ( (TQCheckListItem*)it.current() )->isOn() )
+ // ...insert a Radio-ListViewItem with the same text into the second ListView
+ (void)new TQCheckListItem( item, it.current()->text( 0 ), TQCheckListItem::RadioButton );
+
+ if ( item->firstChild() )
+ ( ( TQCheckListItem* )item->firstChild() )->setOn( TRUE );
+}
+
+/*
+ * SLOT copy2to3()
+ *
+ * Copies the checked item of the second ListView into the
+ * Label at the right.
+ */
+
+void CheckLists::copy2to3()
+{
+ // create an iterator which operates on the second ListView
+ TQListViewItemIterator it( lv2 );
+
+ label->setText( "No Item checked" );
+
+ // iterate through the second ListView...
+ for ( ; it.current(); ++it )
+ // ...check state of childs, and...
+ if ( it.current()->parent() )
+ // ...if the item is checked...
+ if ( ( (TQCheckListItem*)it.current() )->isOn() )
+ // ...set the text of the item to the label
+ label->setText( it.current()->text( 0 ) );
+}
+
diff --git a/examples/checklists/checklists.doc b/examples/checklists/checklists.doc
new file mode 100644
index 000000000..417afe6b7
--- /dev/null
+++ b/examples/checklists/checklists.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page checklists-example.html
+
+ \ingroup examples
+ \title Listviews with Checkable Items
+
+ This example program shows how to use listviews with different types of
+ checkable items.
+
+ <hr>
+
+ Header file:
+
+ \include checklists/checklists.h
+
+ <hr>
+
+ Implementation:
+
+ \include checklists/checklists.cpp
+
+ <hr>
+
+ Main:
+
+ \include checklists/main.cpp
+*/
+
diff --git a/examples/checklists/checklists.h b/examples/checklists/checklists.h
new file mode 100644
index 000000000..2de89bb2b
--- /dev/null
+++ b/examples/checklists/checklists.h
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef CHECKLISTS_H
+#define CHECKLISTS_H
+
+#include <qwidget.h>
+
+class TQListView;
+class TQLabel;
+
+class CheckLists : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ CheckLists( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ TQListView *lv1, *lv2;
+ TQLabel *label;
+
+protected slots:
+ void copy1to2();
+ void copy2to3();
+
+};
+
+#endif
diff --git a/examples/checklists/checklists.pro b/examples/checklists/checklists.pro
new file mode 100644
index 000000000..a1a6f12d8
--- /dev/null
+++ b/examples/checklists/checklists.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = checklists
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = checklists.h
+SOURCES = checklists.cpp \
+ main.cpp
diff --git a/examples/checklists/main.cpp b/examples/checklists/main.cpp
new file mode 100644
index 000000000..9da7ae1bd
--- /dev/null
+++ b/examples/checklists/main.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "checklists.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ CheckLists checklists;
+ checklists.resize( 650, 350 );
+ checklists.setCaption( "TQt Example - CheckLists" );
+ a.setMainWidget( &checklists );
+ checklists.show();
+
+ return a.exec();
+}
diff --git a/examples/cursor/README b/examples/cursor/README
new file mode 100644
index 000000000..c2040e5f0
--- /dev/null
+++ b/examples/cursor/README
@@ -0,0 +1,2 @@
+The cursor sample program displays the predefined cursors and
+creates a custom bitmap cursor.
diff --git a/examples/cursor/cursor.cpp b/examples/cursor/cursor.cpp
new file mode 100644
index 000000000..4252dc346
--- /dev/null
+++ b/examples/cursor/cursor.cpp
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qlabel.h>
+#include <qbitmap.h>
+#include <qapplication.h>
+#include <qlayout.h>
+#include <qcursor.h>
+
+// cb_bits and cm_bits were generated by X bitmap program.
+
+#define cb_width 32
+#define cb_height 32
+
+static unsigned char cb_bits[] = { // cursor bitmap
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00,
+ 0x00, 0x06, 0x30, 0x00, 0x80, 0x01, 0xc0, 0x00, 0x40, 0x00, 0x00, 0x01,
+ 0x20, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x04, 0x08, 0x3e, 0x3e, 0x08,
+ 0x08, 0x03, 0xe0, 0x08, 0xc4, 0x00, 0x00, 0x11, 0x04, 0x1e, 0x78, 0x10,
+ 0x02, 0x0c, 0x30, 0x20, 0x02, 0x40, 0x00, 0x20, 0x02, 0x40, 0x00, 0x20,
+ 0x02, 0x40, 0x00, 0x20, 0x02, 0x20, 0x04, 0x20, 0x02, 0x20, 0x04, 0x20,
+ 0x02, 0x10, 0x08, 0x20, 0x02, 0x08, 0x08, 0x20, 0x02, 0xf0, 0x07, 0x20,
+ 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, 0x08, 0x00, 0xc0, 0x08,
+ 0x08, 0x3c, 0x30, 0x08, 0x10, 0xe6, 0x19, 0x04, 0x20, 0x00, 0x0f, 0x02,
+ 0x40, 0x00, 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x00, 0x06, 0x30, 0x00,
+ 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+#define cm_width 32
+#define cm_height 32
+
+static unsigned char cm_bits[] = { // cursor bitmap mask
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xfe, 0x3f, 0x00,
+ 0x80, 0x07, 0xf0, 0x00, 0xc0, 0x01, 0xc0, 0x01, 0x60, 0x00, 0x00, 0x03,
+ 0x30, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x0c, 0x0c, 0x3e, 0x3e, 0x18,
+ 0x0e, 0x03, 0xe0, 0x18, 0xc6, 0x00, 0x00, 0x31, 0x07, 0x1e, 0x78, 0x30,
+ 0x03, 0x0c, 0x30, 0x60, 0x03, 0x40, 0x00, 0x60, 0x03, 0x40, 0x00, 0x60,
+ 0x03, 0x40, 0x00, 0x60, 0x03, 0x20, 0x04, 0x60, 0x03, 0x20, 0x04, 0x60,
+ 0x03, 0x10, 0x08, 0x60, 0x03, 0x08, 0x08, 0x60, 0x03, 0xf0, 0x07, 0x60,
+ 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x30, 0x0c, 0x00, 0xc0, 0x18,
+ 0x0c, 0x3c, 0x30, 0x18, 0x18, 0xe6, 0x19, 0x0c, 0x30, 0x00, 0x0f, 0x06,
+ 0x60, 0x00, 0x00, 0x03, 0xc0, 0x01, 0xc0, 0x01, 0x80, 0x07, 0xf0, 0x00,
+ 0x00, 0xfe, 0x3f, 0x00, 0x00, 0xf8, 0x0f, 0x00};
+
+
+//
+// The CursorView contains many labels with different cursors.
+//
+
+class CursorView : public TQWidget // cursor view
+{
+public:
+ CursorView();
+};
+
+//
+// Constructs a cursor view.
+//
+
+CursorView::CursorView() // construct view
+{
+ struct List {
+ CursorShape shape;
+ const char* name; // cursor name
+ };
+ static List list[] = {
+ { ArrowCursor, "arrowCursor" },
+ { UpArrowCursor, "upArrowCursor" },
+ { CrossCursor, "crossCursor" },
+ { WaitCursor, "waitCursor" },
+ { IbeamCursor, "ibeamCursor" },
+ { SizeVerCursor, "sizeVerCursor" },
+ { SizeHorCursor, "sizeHorCursor" },
+ { SizeBDiagCursor, "sizeBDiagCursor" },
+ { SizeFDiagCursor, "sizeFDiagCursor" },
+ { SizeAllCursor, "sizeAllCursor" },
+ { BlankCursor, "blankCursor" },
+ { SplitVCursor, "splitVCursor" },
+ { SplitHCursor, "splitHCursor" },
+ { PointingHandCursor, "pointingHandCursor" },
+ { ForbiddenCursor, "forbiddenCursor" },
+ { WhatsThisCursor, "whatsThisCursor" },
+ { BusyCursor, "busyCursor" }
+ };
+
+ setCaption( "CursorView" ); // set window caption
+
+ TQGridLayout* grid = new TQGridLayout( this, 5, 4, 20 );
+ TQLabel *label;
+
+ int i=0;
+ for ( int y=0; y<4; y++ ) { // create the small labels
+ for ( int x=0; x<4; x++ ) {
+ label = new TQLabel( this );
+ label->setCursor( TQCursor( list[i].shape ) );
+ label->setText( list[i].name );
+ label->setAlignment( AlignCenter );
+ label->setMargin( 10 );
+ label->setFrameStyle( TQFrame::Box | TQFrame::Raised );
+ grid->addWidget( label, x, y );
+ i++;
+ }
+ }
+
+
+ label = new TQLabel( this );
+ label->setCursor( TQCursor( list[i].shape ) );
+ label->setText( list[i].name );
+ label->setAlignment( AlignCenter );
+ label->setMargin( 10 );
+ label->setFrameStyle( TQFrame::Box | TQFrame::Raised );
+ grid->addWidget( label, 4, 0 );
+
+
+
+ TQBitmap cb( cb_width, cb_height, cb_bits, TRUE );
+ TQBitmap cm( cm_width, cm_height, cm_bits, TRUE );
+ TQCursor custom( cb, cm ); // create bitmap cursor
+
+ label = new TQLabel( this ); // create the big label
+ label->setCursor( custom );
+ label->setText( "Custom bitmap cursor" );
+ label->setAlignment( AlignCenter );
+ label->setMargin( 10 );
+ label->setFrameStyle( TQFrame::Box | TQFrame::Sunken );
+ grid->addMultiCellWidget( label, 4, 4, 1, 3 );
+
+}
+
+
+//
+// Create and display a CursorView.
+//
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv ); // application object
+ CursorView v; // cursor view
+ a.setMainWidget( &v );
+ v.setCaption("TQt Example - Cursors");
+ v.show();
+ return a.exec();
+}
diff --git a/examples/cursor/cursor.doc b/examples/cursor/cursor.doc
new file mode 100644
index 000000000..4bee6d87d
--- /dev/null
+++ b/examples/cursor/cursor.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page cursor-example.html
+
+ \ingroup examples
+ \title Cursors
+
+ This example shows how to set a mouse cursor for a widget.
+
+ <hr>
+
+ Implementation:
+
+ \include cursor/cursor.cpp
+
+*/
+
diff --git a/examples/cursor/cursor.pro b/examples/cursor/cursor.pro
new file mode 100644
index 000000000..23f659356
--- /dev/null
+++ b/examples/cursor/cursor.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = cursor
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = small-config
+
+HEADERS =
+SOURCES = cursor.cpp
diff --git a/examples/customlayout/border.cpp b/examples/customlayout/border.cpp
new file mode 100644
index 000000000..533b3b635
--- /dev/null
+++ b/examples/customlayout/border.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Implementing your own layout: flow example
+**
+** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "border.h"
+
+class BorderLayoutIterator : public TQGLayoutIterator
+{
+public:
+ BorderLayoutIterator( const TQPtrList<BorderLayout::BorderLayoutStruct> *l )
+ : idx( 0 ) , list( (TQPtrList<BorderLayout::BorderLayoutStruct>*)l )
+ {}
+
+ uint count() const;
+ TQLayoutItem *current();
+ BorderLayout::BorderLayoutStruct *currentStruct();
+ void toFirst();
+ TQLayoutItem *next();
+ TQLayoutItem *takeCurrent();
+ BorderLayoutIterator &operator++();
+
+private:
+ int idx;
+ TQPtrList<BorderLayout::BorderLayoutStruct> *list;
+
+};
+
+uint BorderLayoutIterator::count() const
+{
+ return list->count();
+}
+
+TQLayoutItem *BorderLayoutIterator::current()
+{
+ return idx < (int)count() ? list->at( idx )->item : 0;
+}
+
+BorderLayout::BorderLayoutStruct *BorderLayoutIterator::currentStruct()
+{
+ return idx < (int)count() ? list->at( idx ) : 0;
+}
+
+void BorderLayoutIterator::toFirst()
+{
+ idx = 0;
+}
+
+TQLayoutItem *BorderLayoutIterator::next()
+{
+ idx++;
+ return current();
+}
+
+TQLayoutItem *BorderLayoutIterator::takeCurrent()
+{
+ BorderLayout::BorderLayoutStruct *b
+ = idx < int( list->count() ) ? list->take( idx ) : 0;
+ TQLayoutItem *item = b ? b->item : 0;
+ delete b;
+ return item;
+}
+
+BorderLayoutIterator &BorderLayoutIterator::operator++()
+{
+ next();
+ return *this;
+}
+
+BorderLayout::~BorderLayout()
+{
+ deleteAllItems();
+}
+
+
+void BorderLayout::addItem( TQLayoutItem *item )
+{
+ add( item, West );
+}
+
+void BorderLayout::addWidget( TQWidget *widget, Position pos )
+{
+ add( new BorderWidgetItem( widget ), pos );
+}
+
+void BorderLayout::add( TQLayoutItem *item, Position pos )
+{
+ list.append( new BorderLayoutStruct( item, pos ) );
+ sizeDirty = TRUE; msizeDirty = TRUE;
+ calcSize( SizeHint ); calcSize( Minimum );
+}
+
+bool BorderLayout::hasHeightForWidth() const
+{
+ return FALSE;
+}
+
+TQSize BorderLayout::sizeHint() const
+{
+ return cached;
+}
+
+TQSize BorderLayout::minimumSize() const
+{
+ return cached;
+}
+
+TQSizePolicy::ExpandData BorderLayout::expanding() const
+
+{
+ return TQSizePolicy::BothDirections;
+}
+
+TQLayoutIterator BorderLayout::iterator()
+{
+ return TQLayoutIterator( new BorderLayoutIterator( &list ) );
+}
+
+void BorderLayout::setGeometry( const TQRect &rct )
+{
+ TQLayout::setGeometry( rct );
+ doLayout( rct );
+}
+
+void BorderLayout::doLayout( const TQRect &rct, bool /*testonly*/ )
+{
+ int ew = 0, ww = 0, nh = 0, sh = 0;
+ int h = 0;
+
+ BorderLayoutIterator it( &list );
+ BorderLayoutStruct *o;
+ BorderLayoutStruct *center = 0;
+ while ( ( o = it.currentStruct() ) != 0 ) {
+ ++it;
+
+ if ( o->pos == North ) {
+ o->item->setGeometry( TQRect( rct.x(), nh, rct.width(), o->item->sizeHint().height() ) );
+ nh += o->item->geometry().height() + spacing();
+ }
+ if ( o->pos == South ) {
+ o->item->setGeometry( TQRect( o->item->geometry().x(), o->item->geometry().y(),
+ rct.width(), o->item->sizeHint().height() ) );
+ sh += o->item->geometry().height() + spacing();
+ o->item->setGeometry( TQRect( rct.x(), rct.y() + rct.height() - sh + spacing(),
+ o->item->geometry().width(), o->item->geometry().height() ) );
+ }
+ if ( o->pos == Center )
+ center = o;
+ }
+
+ h = rct.height() - nh - sh;
+
+ it.toFirst();
+ while ( ( o = it.currentStruct() ) != 0 ) {
+ ++it;
+
+ if ( o->pos == West ) {
+ o->item->setGeometry( TQRect( rct.x() + ww, nh, o->item->sizeHint().width(), h ) );
+ ww += o->item->geometry().width() + spacing();
+ }
+ if ( o->pos == East ) {
+ o->item->setGeometry( TQRect( o->item->geometry().x(), o->item->geometry().y(),
+ o->item->sizeHint().width(), h ) );
+ ew += o->item->geometry().width() + spacing();
+ o->item->setGeometry( TQRect( rct.x() + rct.width() - ew + spacing(), nh,
+ o->item->geometry().width(), o->item->geometry().height() ) );
+ }
+ }
+
+ if ( center )
+ center->item->setGeometry( TQRect( ww, nh, rct.width() - ew - ww, h ) );
+}
+
+void BorderLayout::calcSize( SizeType st )
+{
+ if ( ( st == Minimum && !msizeDirty ) ||
+ ( st == SizeHint && !sizeDirty ) )
+ return;
+
+ int w = 0, h = 0;
+
+ BorderLayoutIterator it( &list );
+ BorderLayoutStruct *o;
+ while ( ( o = it.currentStruct() ) != 0 ) {
+ ++it;
+ if ( o->pos == North ||
+ o->pos == South ) {
+ if ( st == Minimum )
+ h += o->item->minimumSize().height();
+ else
+ h += o->item->sizeHint().height();
+ }
+ else if ( o->pos == West ||
+ o->pos == East ) {
+ if ( st == Minimum )
+ w += o->item->minimumSize().width();
+ else
+ w += o->item->sizeHint().width();
+ } else {
+ if ( st == Minimum ) {
+ h += o->item->minimumSize().height();
+ w += o->item->minimumSize().width();
+ }
+ else {
+ h += o->item->sizeHint().height();
+ w += o->item->sizeHint().width();
+ }
+ }
+ }
+
+ if ( st == Minimum ) {
+ msizeDirty = FALSE;
+ mcached = TQSize( w, h );
+ } else {
+ sizeDirty = FALSE;
+ cached = TQSize( w, h );
+ }
+
+ return;
+}
diff --git a/examples/customlayout/border.h b/examples/customlayout/border.h
new file mode 100644
index 000000000..fcab38acd
--- /dev/null
+++ b/examples/customlayout/border.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Definition of simple flow layout for custom layout example
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef BORDER_H
+#define BORDER_H
+
+#include <qlayout.h>
+#include <qptrlist.h>
+
+class BorderWidgetItem : public TQWidgetItem
+{
+public:
+ BorderWidgetItem( TQWidget *w )
+ : TQWidgetItem( w )
+ {}
+
+ void setGeometry( const TQRect &r )
+ { widget()->setGeometry( r ); }
+
+};
+
+class BorderLayout : public TQLayout
+{
+public:
+ enum Position {
+ West = 0,
+ North,
+ South,
+ East,
+ Center
+ };
+
+ struct BorderLayoutStruct
+ {
+ BorderLayoutStruct( TQLayoutItem *i, Position p ) {
+ item = i;
+ pos = p;
+ }
+
+ TQLayoutItem *item;
+ Position pos;
+ };
+
+ enum SizeType {
+ Minimum = 0,
+ SizeHint
+ };
+
+ BorderLayout( TQWidget *parent, int border = 0, int autoBorder = -1,
+ const char *name = 0 )
+ : TQLayout( parent, border, autoBorder, name ), cached( 0, 0 ), mcached( 0, 0 ),
+ sizeDirty( TRUE ), msizeDirty( TRUE )
+ {}
+
+ BorderLayout( TQLayout* parent, int autoBorder = -1, const char *name = 0 )
+ : TQLayout( parent, autoBorder, name ), cached( 0, 0 ), mcached( 0, 0 ),
+ sizeDirty( TRUE ), msizeDirty( TRUE )
+ {}
+
+ BorderLayout( int autoBorder = -1, const char *name = 0 )
+ : TQLayout( autoBorder, name ), cached( 0, 0 ), mcached( 0, 0 ),
+ sizeDirty( TRUE ), msizeDirty( TRUE )
+ {}
+
+ ~BorderLayout();
+
+ void addItem( TQLayoutItem *item );
+
+ void addWidget( TQWidget *widget, Position pos );
+ void add( TQLayoutItem *item, Position pos );
+
+ bool hasHeightForWidth() const;
+
+ TQSize sizeHint() const;
+ TQSize minimumSize() const;
+
+ TQLayoutIterator iterator();
+
+ TQSizePolicy::ExpandData expanding() const;
+
+protected:
+ void setGeometry( const TQRect &rect );
+
+private:
+ void doLayout( const TQRect &rect, bool testonly = FALSE );
+ void calcSize( SizeType st );
+
+ TQPtrList<BorderLayoutStruct> list;
+ TQSize cached, mcached;
+ bool sizeDirty, msizeDirty;
+
+};
+
+#endif
diff --git a/examples/customlayout/card.cpp b/examples/customlayout/card.cpp
new file mode 100644
index 000000000..dc3964e82
--- /dev/null
+++ b/examples/customlayout/card.cpp
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Implementing your own layout: flow example
+**
+** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "card.h"
+
+class CardLayoutIterator :public TQGLayoutIterator
+{
+public:
+ CardLayoutIterator( TQPtrList<TQLayoutItem> *l )
+ : idx( 0 ), list( l ) {}
+
+ TQLayoutItem *current();
+ TQLayoutItem *next();
+ TQLayoutItem *takeCurrent();
+
+private:
+ int idx;
+ TQPtrList<TQLayoutItem> *list;
+};
+
+TQLayoutItem *CardLayoutIterator::current()
+{
+ return idx < int( list->count() ) ? list->at( idx ) : 0;
+}
+
+TQLayoutItem *CardLayoutIterator::next()
+{
+ idx++; return current();
+}
+
+TQLayoutItem *CardLayoutIterator::takeCurrent()
+{
+ return idx < int( list->count() ) ?list->take( idx ) : 0;
+}
+
+
+
+TQLayoutIterator CardLayout::iterator()
+{
+ return TQLayoutIterator( new CardLayoutIterator( &list ) );
+}
+
+CardLayout::~CardLayout()
+{
+ deleteAllItems();
+}
+
+void CardLayout::addItem( TQLayoutItem *item )
+{
+ list.append( item );
+}
+
+void CardLayout::setGeometry( const TQRect &rct )
+{
+ TQLayout::setGeometry( rct );
+
+ TQPtrListIterator<TQLayoutItem> it( list );
+ if ( it.count() == 0 )
+ return;
+
+ TQLayoutItem *o;
+
+ int i = 0;
+
+ int w = rct.width() - ( list.count() - 1 ) * spacing();
+ int h = rct.height() - ( list.count() - 1 ) * spacing();
+
+ while ( ( o=it.current() ) != 0 ) {
+ ++it;
+ TQRect geom( rct.x() + i * spacing(), rct.y() + i * spacing(),
+ w, h );
+ o->setGeometry( geom );
+ ++i;
+ }
+}
+
+TQSize CardLayout::sizeHint() const
+{
+ TQSize s(0,0);
+ int n = list.count();
+ if ( n > 0 )
+ s = TQSize(100,70); //start with a nice default size
+ TQPtrListIterator<TQLayoutItem> it(list);
+ TQLayoutItem *o;
+ while ( (o=it.current()) != 0 ) {
+ ++it;
+ s = s.expandedTo( o->minimumSize() );
+ }
+ return s + n*TQSize(spacing(),spacing());
+}
+
+TQSize CardLayout::minimumSize() const
+{
+ TQSize s(0,0);
+ int n = list.count();
+ TQPtrListIterator<TQLayoutItem> it(list);
+ TQLayoutItem *o;
+ while ( (o=it.current()) != 0 ) {
+ ++it;
+ s = s.expandedTo( o->minimumSize() );
+ }
+ return s + n*TQSize(spacing(),spacing());
+}
diff --git a/examples/customlayout/card.h b/examples/customlayout/card.h
new file mode 100644
index 000000000..846bde9f4
--- /dev/null
+++ b/examples/customlayout/card.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Definition of simple flow layout for custom layout example
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef CARD_H
+#define CARD_H
+
+#include <qlayout.h>
+#include <qptrlist.h>
+
+class CardLayout : public TQLayout
+{
+public:
+ CardLayout( TQWidget *parent, int dist )
+ : TQLayout( parent, 0, dist ) {}
+ CardLayout( TQLayout* parent, int dist)
+ : TQLayout( parent, dist ) {}
+ CardLayout( int dist )
+ : TQLayout( dist ) {}
+ ~CardLayout();
+
+ void addItem( TQLayoutItem *item );
+ TQSize sizeHint() const;
+ TQSize minimumSize() const;
+ TQLayoutIterator iterator();
+ void setGeometry( const TQRect &rect );
+
+private:
+ TQPtrList<TQLayoutItem> list;
+
+};
+
+#endif
diff --git a/examples/customlayout/customlayout.doc b/examples/customlayout/customlayout.doc
new file mode 100644
index 000000000..6cbc56df9
--- /dev/null
+++ b/examples/customlayout/customlayout.doc
@@ -0,0 +1,55 @@
+/*
+*/
+/*! \page customlayout-example.html
+
+ \ingroup examples
+ \title Customized Layoutmanager
+
+ This examples demonstrates how to write customized layout (geometry) managers
+ like card layouts, border layout and flow layouts.
+
+ See also: <a href="layout.html">Documentation of Geometry Management</a>.
+
+ <hr>
+
+ Header file of the flow layout:
+
+ \include customlayout/flow.h
+
+ <hr>
+
+ Implementation of the flow layout:
+
+ \include customlayout/flow.cpp
+
+ <hr>
+
+ Header file of the border layout:
+
+ \include customlayout/border.h
+
+ <hr>
+
+ Implementation of the border layout:
+
+ \include customlayout/border.cpp
+
+ <hr>
+
+ Header file of the card layout:
+
+ \include customlayout/card.h
+
+ <hr>
+
+ Implementation of the card layout:
+
+ \include customlayout/card.cpp
+
+ <hr>
+
+ Main:
+
+ \include customlayout/main.cpp
+*/
+
diff --git a/examples/customlayout/customlayout.pro b/examples/customlayout/customlayout.pro
new file mode 100644
index 000000000..f377f13be
--- /dev/null
+++ b/examples/customlayout/customlayout.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+TARGET = customlayout
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = border.h \
+ card.h \
+ flow.h
+SOURCES = border.cpp \
+ card.cpp \
+ flow.cpp \
+ main.cpp
diff --git a/examples/customlayout/flow.cpp b/examples/customlayout/flow.cpp
new file mode 100644
index 000000000..af1fdf5fe
--- /dev/null
+++ b/examples/customlayout/flow.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Implementing your own layout: flow example
+**
+** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "flow.h"
+
+class SimpleFlowIterator :public TQGLayoutIterator
+{
+public:
+ SimpleFlowIterator( TQPtrList<TQLayoutItem> *l ) :idx(0), list(l) {}
+ uint count() const;
+ TQLayoutItem *current();
+ TQLayoutItem *next();
+ TQLayoutItem *takeCurrent();
+
+private:
+ int idx;
+ TQPtrList<TQLayoutItem> *list;
+
+};
+
+uint SimpleFlowIterator::count() const
+{
+ return list->count();
+}
+
+TQLayoutItem *SimpleFlowIterator::current()
+{
+ return idx < int(count()) ? list->at(idx) : 0;
+}
+
+TQLayoutItem *SimpleFlowIterator::next()
+{
+ idx++; return current();
+}
+
+TQLayoutItem *SimpleFlowIterator::takeCurrent()
+{
+ return idx < int(count()) ? list->take( idx ) : 0;
+}
+
+SimpleFlow::~SimpleFlow()
+{
+ deleteAllItems();
+}
+
+
+int SimpleFlow::heightForWidth( int w ) const
+{
+ if ( cached_width != w ) {
+ //Not all C++ compilers support "mutable" yet:
+ SimpleFlow * mthis = (SimpleFlow*)this;
+ int h = mthis->doLayout( TQRect(0,0,w,0), TRUE );
+ mthis->cached_hfw = h;
+ mthis->cached_width = w;
+ return h;
+ }
+ return cached_hfw;
+}
+
+void SimpleFlow::addItem( TQLayoutItem *item)
+{
+ list.append( item );
+}
+
+bool SimpleFlow::hasHeightForWidth() const
+{
+ return TRUE;
+}
+
+TQSize SimpleFlow::sizeHint() const
+{
+ return minimumSize();
+}
+
+TQSizePolicy::ExpandData SimpleFlow::expanding() const
+{
+ return TQSizePolicy::NoDirection;
+}
+
+TQLayoutIterator SimpleFlow::iterator()
+{
+ return TQLayoutIterator( new SimpleFlowIterator( &list ) );
+}
+
+void SimpleFlow::setGeometry( const TQRect &r )
+{
+ TQLayout::setGeometry( r );
+ doLayout( r );
+}
+
+int SimpleFlow::doLayout( const TQRect &r, bool testonly )
+{
+ int x = r.x();
+ int y = r.y();
+ int h = 0; //height of this line so far.
+ TQPtrListIterator<TQLayoutItem> it(list);
+ TQLayoutItem *o;
+ while ( (o=it.current()) != 0 ) {
+ ++it;
+ int nextX = x + o->sizeHint().width() + spacing();
+ if ( nextX - spacing() > r.right() && h > 0 ) {
+ x = r.x();
+ y = y + h + spacing();
+ nextX = x + o->sizeHint().width() + spacing();
+ h = 0;
+ }
+ if ( !testonly )
+ o->setGeometry( TQRect( TQPoint( x, y ), o->sizeHint() ) );
+ x = nextX;
+ h = TQMAX( h, o->sizeHint().height() );
+ }
+ return y + h - r.y();
+}
+
+TQSize SimpleFlow::minimumSize() const
+{
+ TQSize s(0,0);
+ TQPtrListIterator<TQLayoutItem> it(list);
+ TQLayoutItem *o;
+ while ( (o=it.current()) != 0 ) {
+ ++it;
+ s = s.expandedTo( o->minimumSize() );
+ }
+ return s;
+}
diff --git a/examples/customlayout/flow.h b/examples/customlayout/flow.h
new file mode 100644
index 000000000..9429a4ffb
--- /dev/null
+++ b/examples/customlayout/flow.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Definition of simple flow layout for custom layout example
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef FLOW_H
+#define FLOW_H
+
+#include <qlayout.h>
+#include <qptrlist.h>
+
+class SimpleFlow : public TQLayout
+{
+public:
+ SimpleFlow( TQWidget *parent, int border=0, int space=-1,
+ const char *name=0 )
+ : TQLayout( parent, border, space, name ),
+ cached_width(0) {}
+ SimpleFlow( TQLayout* parent, int space=-1, const char *name=0 )
+ : TQLayout( parent, space, name ),
+ cached_width(0) {}
+ SimpleFlow( int space=-1, const char *name=0 )
+ : TQLayout( space, name ),
+ cached_width(0) {}
+
+ ~SimpleFlow();
+
+ void addItem( TQLayoutItem *item);
+ bool hasHeightForWidth() const;
+ int heightForWidth( int ) const;
+ TQSize sizeHint() const;
+ TQSize minimumSize() const;
+ TQLayoutIterator iterator();
+ TQSizePolicy::ExpandData expanding() const;
+
+protected:
+ void setGeometry( const TQRect& );
+
+private:
+ int doLayout( const TQRect&, bool testonly = FALSE );
+ TQPtrList<TQLayoutItem> list;
+ int cached_width;
+ int cached_hfw;
+
+};
+
+#endif
diff --git a/examples/customlayout/main.cpp b/examples/customlayout/main.cpp
new file mode 100644
index 000000000..694fcf8fb
--- /dev/null
+++ b/examples/customlayout/main.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Main for custom layout example
+**
+** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "flow.h"
+#include "border.h"
+#include "card.h"
+
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qcolor.h>
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qmultilineedit.h>
+#include <qcolor.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ TQWidget *f = new TQWidget;
+ TQBoxLayout *gm = new TQVBoxLayout( f, 5 );
+
+ SimpleFlow *b1 = new SimpleFlow( gm );
+
+ b1->add( new TQPushButton( "Short", f ) );
+ b1->add( new TQPushButton( "Longer", f ) );
+ b1->add( new TQPushButton( "Different text", f ) );
+ b1->add( new TQPushButton( "More text", f ) );
+ b1->add( new TQPushButton( "Even longer button text", f ) );
+ TQPushButton* qb = new TQPushButton( "Quit", f );
+ a.connect( qb, SIGNAL( clicked() ), SLOT( tquit() ) );
+ b1->add( qb );
+
+ TQWidget *wid = new TQWidget( f );
+
+ BorderLayout *large = new BorderLayout( wid );
+ large->setSpacing( 5 );
+ large->addWidget( new TQPushButton( "North", wid ), BorderLayout::North );
+ large->addWidget( new TQPushButton( "West", wid ), BorderLayout::West );
+ TQMultiLineEdit* m = new TQMultiLineEdit( wid );
+ m->setText( "Central\nWidget" );
+ large->addWidget( m, BorderLayout::Center );
+ TQWidget *east1 = new TQPushButton( "East", wid );
+ large->addWidget( east1, BorderLayout::East );
+ TQWidget *east2 = new TQPushButton( "East 2", wid );
+ large->addWidget( east2 , BorderLayout::East );
+ large->addWidget( new TQPushButton( "South", wid ), BorderLayout::South );
+ //Left-to-right tab order looks better:
+ TQWidget::setTabOrder( east2, east1 );
+ gm->addWidget( wid );
+
+
+ wid = new TQWidget( f );
+ CardLayout *card = new CardLayout( wid, 10 );
+
+ TQWidget *crd = new TQWidget( wid );
+ crd->setBackgroundColor( TQt::red );
+ card->add( crd );
+ crd = new TQWidget( wid );
+ crd->setBackgroundColor( TQt::green );
+ card->add( crd );
+ crd = new TQWidget( wid );
+ crd->setBackgroundColor( TQt::blue );
+ card->add( crd );
+ crd = new TQWidget( wid );
+ crd->setBackgroundColor( TQt::white );
+ card->add( crd );
+ crd = new TQWidget( wid );
+ crd->setBackgroundColor( TQt::black );
+ card->add( crd );
+ crd = new TQWidget( wid );
+ crd->setBackgroundColor( TQt::yellow );
+ card->add( crd );
+
+ gm->addWidget( wid );
+
+ TQLabel* s = new TQLabel( f );
+ s->setText( "outermost box" );
+ s->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+ s->setAlignment( TQt::AlignVCenter | TQt::AlignHCenter );
+ gm->addWidget( s );
+ a.setMainWidget( f );
+ f->setCaption("TQt Example - Custom Layout");
+ f->show();
+
+ int result = a.exec();
+ delete f;
+ return result;
+}
diff --git a/examples/dclock/README b/examples/dclock/README
new file mode 100644
index 000000000..dfa58402f
--- /dev/null
+++ b/examples/dclock/README
@@ -0,0 +1,5 @@
+The dclock program displays a digital LCD clock and can switch
+between time and date.
+
+See also the aclock sample that displays an analog clock.
+
diff --git a/examples/dclock/dclock.cpp b/examples/dclock/dclock.cpp
new file mode 100644
index 000000000..be7cc8539
--- /dev/null
+++ b/examples/dclock/dclock.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "dclock.h"
+#include <qdatetime.h>
+
+
+//
+// Constructs a DigitalClock widget with a parent and a name.
+//
+
+DigitalClock::DigitalClock( TQWidget *parent, const char *name )
+ : TQLCDNumber( parent, name )
+{
+ showingColon = FALSE;
+ setFrameStyle( TQFrame::Panel | TQFrame::Raised );
+ setLineWidth( 2 ); // set frame line width
+ showTime(); // display the current time
+ normalTimer = startTimer( 500 ); // 1/2 second timer events
+ showDateTimer = -1; // not showing date
+}
+
+
+//
+// Handles timer events for the digital clock widget.
+// There are two different timers; one timer for updating the clock
+// and another one for switching back from date mode to time mode.
+//
+
+void DigitalClock::timerEvent( TQTimerEvent *e )
+{
+ if ( e->timerId() == showDateTimer ) // stop showing date
+ stopDate();
+ else { // normal timer
+ if ( showDateTimer == -1 ) // not showing date
+ showTime();
+ }
+}
+
+//
+// Enters date mode when the left mouse button is pressed.
+//
+
+void DigitalClock::mousePressEvent( TQMouseEvent *e )
+{
+ if ( e->button() == TQMouseEvent::LeftButton ) // left button pressed
+ showDate();
+}
+
+
+//
+// Shows the current date in the internal lcd widget.
+// Fires a timer to stop showing the date.
+//
+
+void DigitalClock::showDate()
+{
+ if ( showDateTimer != -1 ) // already showing date
+ return;
+ TQDate date = TQDate::currentDate();
+ TQString s;
+ s.sprintf( "%2d %2d", date.month(), date.day() );
+ display( s ); // sets the LCD number/text
+ showDateTimer = startTimer( 2000 ); // keep this state for 2 secs
+}
+
+//
+// Stops showing the date.
+//
+
+void DigitalClock::stopDate()
+{
+ killTimer( showDateTimer );
+ showDateTimer = -1;
+ showTime();
+}
+
+//
+// Shows the current time in the internal lcd widget.
+//
+
+void DigitalClock::showTime()
+{
+ showingColon = !showingColon; // toggle/blink colon
+ TQString s = TQTime::currentTime().toString().left(5);
+ if ( !showingColon )
+ s[2] = ' ';
+ if ( s[0] == '0' )
+ s[0] = ' ';
+ display( s ); // set LCD number/text
+}
diff --git a/examples/dclock/dclock.doc b/examples/dclock/dclock.doc
new file mode 100644
index 000000000..b341b6638
--- /dev/null
+++ b/examples/dclock/dclock.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page dclock-example.html
+
+ \ingroup examples
+ \title Digital Clock
+
+ This example displays a digital LCD clock that can switch between time
+ and date.
+
+ <hr>
+
+ Header file:
+
+ \include dclock/dclock.h
+
+ <hr>
+
+ Implementation:
+
+ \include dclock/dclock.cpp
+
+ <hr>
+
+ Main:
+
+ \include dclock/main.cpp
+*/
+
diff --git a/examples/dclock/dclock.h b/examples/dclock/dclock.h
new file mode 100644
index 000000000..315c54221
--- /dev/null
+++ b/examples/dclock/dclock.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef DCLOCK_H
+#define DCLOCK_H
+
+#include <qlcdnumber.h>
+
+
+class DigitalClock : public TQLCDNumber // digital clock widget
+{
+ Q_OBJECT
+public:
+ DigitalClock( TQWidget *parent=0, const char *name=0 );
+
+protected: // event handlers
+ void timerEvent( TQTimerEvent * );
+ void mousePressEvent( TQMouseEvent * );
+
+private slots: // internal slots
+ void stopDate();
+ void showTime();
+
+private: // internal data
+ void showDate();
+
+ bool showingColon;
+ int normalTimer;
+ int showDateTimer;
+};
+
+
+#endif // DCLOCK_H
diff --git a/examples/dclock/dclock.pro b/examples/dclock/dclock.pro
new file mode 100644
index 000000000..f244d7a51
--- /dev/null
+++ b/examples/dclock/dclock.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = dclock
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = dclock.h
+SOURCES = dclock.cpp \
+ main.cpp
diff --git a/examples/dclock/main.cpp b/examples/dclock/main.cpp
new file mode 100644
index 000000000..eb0dbc837
--- /dev/null
+++ b/examples/dclock/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "dclock.h"
+#include <qapplication.h>
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ DigitalClock *clock = new DigitalClock;
+ clock->resize( 170, 80 );
+ a.setMainWidget( clock );
+ clock->setCaption("TQt Example - Digital Clock");
+ clock->show();
+ return a.exec();
+}
diff --git a/examples/demo/categoryinterface.h b/examples/demo/categoryinterface.h
new file mode 100644
index 000000000..0d497eafa
--- /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 TQWidgetStack;
+
+class CategoryInterface : public TQObject
+{
+ Q_OBJECT
+
+public:
+ CategoryInterface( TQWidgetStack *s ) : stack( s ) {}
+ virtual ~CategoryInterface() {}
+ virtual TQString name() const = 0;
+ virtual TQIconSet icon() const = 0;
+ virtual int numCategories() const = 0;
+ virtual TQString categoryName( int i ) const = 0;
+ virtual TQIconSet categoryIcon( int i ) const = 0;
+ virtual int categoryOffset() const = 0;
+
+public slots:
+ virtual void setCurrentCategory( int i ) = 0;
+
+protected:
+ TQWidgetStack *stack;
+
+};
+
+#endif
diff --git a/examples/demo/demo.doc b/examples/demo/demo.doc
new file mode 100644
index 000000000..10f713584
--- /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 000000000..3413fcd04
--- /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 000000000..b80e6469e
--- /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 000000000..659f2c874
--- /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 TQt. 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( TQWidget *parent, const char *name )
+ : TQFrame( parent, name )
+{
+ setLineWidth( FrameWidth );
+ setFrameStyle( Panel | Sunken );
+ setBackgroundMode( PaletteBase );
+ setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::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( TQResizeEvent *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 < TQABS( 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, TQRect( FrameWidth, FrameWidth, width()-2*FrameWidth, height()-2*FrameWidth ));
+}
+
+void Screen::setStep( int s )
+{
+ step = s;
+}
+
+void Screen::drawContents( TQPainter *p )
+{
+ TQRect 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( TQWidget *parent, const char *name )
+ : TQFrame( parent, name )
+{
+ setLineWidth( FrameWidth );
+ setFrameStyle( Panel | Sunken );
+ setBackgroundMode( PaletteBase );
+ setPaletteBackgroundColor(black);
+ setPaletteForegroundColor(red);
+ setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding );
+
+ shift = 0;
+ n = 1;
+}
+
+void Curve::drawContents( TQPainter *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( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ timer = 0;
+
+ TQVBoxLayout *vbox = new TQVBoxLayout( this, 10 );
+
+ TQHBoxLayout *hbox = new TQHBoxLayout( vbox );
+ screen = new Screen( this );
+ dial = new TQDial( 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 TQLCDNumber( 2, this );
+ lcd->setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::Preferred );
+ lcdval = 0;
+
+ hbox->addWidget( screen );
+
+ TQVBoxLayout *vb2 = new TQVBoxLayout( hbox );
+
+ curve = new Curve( this );
+ spin = new TQSpinBox( 1, 10, 1, this );
+ connect( spin, SIGNAL( valueChanged( int )), curve, SLOT( setFactor( int )));
+ spin->setValue( 2 );
+ vb2->addWidget( curve );
+ vb2->addWidget( spin );
+
+ TQHBoxLayout *hbox2 = new TQHBoxLayout( vb2 );
+
+ hbox2->addWidget( dial );
+ hbox2->addWidget( lcd );
+
+ bar = new TQProgressBar( 10, this );
+ tbar = 0;
+
+ vbox->addWidget( bar );
+}
+
+void DisplayWidget::run()
+{
+ if ( !timer ) {
+ timer = new TQTimer( 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( TQShowEvent * )
+{
+ run();
+ screen->repaint();
+}
+
+void DisplayWidget::hideEvent( TQHideEvent * )
+{
+ stop();
+}
+
diff --git a/examples/demo/display.h b/examples/demo/display.h
new file mode 100644
index 000000000..68e6843c1
--- /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 TQt. 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 TQTimer;
+class TQDial;
+class TQLCDNumber;
+class TQProgressBar;
+class TQSpinBox;
+class Screen;
+class Curve;
+
+class DisplayWidget : public TQWidget {
+ Q_OBJECT
+public:
+ DisplayWidget( TQWidget *parent=0, const char *name=0 );
+
+ void run();
+ void stop();
+
+protected:
+ virtual void showEvent( TQShowEvent * );
+ virtual void hideEvent( TQHideEvent * );
+
+private slots:
+ void tick();
+
+private:
+ Screen *screen;
+ TQDial *dial;
+ Curve *curve;
+ TQSpinBox *spin;
+ TQLCDNumber *lcd;
+ int lcdval;
+ TQProgressBar *bar;
+ int tbar;
+ TQTimer *timer;
+};
+
+class Screen : public TQFrame {
+ Q_OBJECT
+public:
+ enum { FrameWidth = 3 };
+ Screen( TQWidget *parent=0, const char *name=0 );
+ ~Screen();
+
+ void animate();
+
+public slots:
+ void setStep( int s );
+
+protected:
+ virtual void drawContents( TQPainter * );
+ virtual void resizeEvent( TQResizeEvent * );
+
+private:
+ int *yval;
+ int pos0; // buffer pointer for x == 0
+ int t0; // time parameter at x == 0
+ int step;
+};
+
+class Curve : public TQFrame {
+ Q_OBJECT
+ enum { FrameWidth = 3 };
+public:
+ Curve( TQWidget *parent=0, const char *name=0 );
+
+ void animate();
+public slots:
+ void setFactor( int );
+
+protected:
+ virtual void drawContents( TQPainter * );
+
+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 000000000..00501f5df
--- /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( TQWidget* 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, TQListView::Maximum );
+
+ TQMap<TQString,IconItem>::Iterator it;
+ for( it = items.begin(); it != items.end(); ++it ) {
+ IconItem item = it.data();
+
+ TQIconViewItem *iitem = new IconViewItem( iconView, item.name(), *item.pixmap(), it.key() );
+ iitem->setRenameEnabled( TRUE );
+ TQListViewItem *litem = new ListViewItem( listView, item.name(), it.key() );
+ litem->setPixmap( 0, *item.pixmap() );
+ }
+}
+
+DnDDemo::~DnDDemo()
+{
+
+}
+
+IconItem::IconItem( const TQString& name, const TQString& icon )
+{
+ _name = name;
+ _pixmap = loadPixmap( icon );
+}
+
+TQPixmap IconItem::loadPixmap( const TQString& name )
+{
+ TQPixmap pix( "textdrawing/" + name );
+ return pix;
+}
+
+IconItem DnDDemo::findItem( const TQString& tag )
+{
+ return items[ tag ];
+}
diff --git a/examples/demo/dnd/dnd.h b/examples/demo/dnd/dnd.h
new file mode 100644
index 000000000..311360daf
--- /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 TQString& name = TQString::null, const TQString& icon = TQString::null );
+
+ TQString name() { return _name; }
+ TQPixmap *pixmap() { return &_pixmap; }
+
+ Q_DUMMY_COMPARISON_OPERATOR( IconItem )
+
+protected:
+ TQPixmap loadPixmap( const TQString& name );
+
+private:
+ TQString _name;
+ TQPixmap _pixmap;
+};
+
+class DnDDemo : public DnDDemoBase
+{
+ Q_OBJECT
+
+public:
+ DnDDemo( TQWidget* parent = 0, const char* name = 0 );
+ ~DnDDemo();
+
+ IconItem findItem( const TQString& tag );
+
+private:
+ TQMap<TQString,IconItem> items;
+};
+
+#endif
diff --git a/examples/demo/dnd/dndbase.ui b/examples/demo/dnd/dndbase.ui
new file mode 100644
index 000000000..73d325304
--- /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="TQWidget">
+ <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="TQLayoutWidget" 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="TQTextEdit" 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="TQTextEdit" 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 000000000..c8ce01b87
--- /dev/null
+++ b/examples/demo/dnd/iconview.cpp
@@ -0,0 +1,42 @@
+#include <qdragobject.h>
+
+#include "dnd.h"
+#include "iconview.h"
+
+
+IconView::IconView( TQWidget* parent, const char* name )
+ : TQIconView( parent, name )
+{
+ connect( this, SIGNAL(dropped(TQDropEvent*, const TQValueList<TQIconDragItem>&)),
+ SLOT(slotNewItem(TQDropEvent*, const TQValueList<TQIconDragItem>&)));
+}
+
+IconView::~IconView()
+{
+
+}
+
+
+TQDragObject *IconView::dragObject()
+{
+ if ( !currentItem() ) return 0;
+
+ TQTextDrag * drg = new TQTextDrag( ((IconViewItem*)currentItem())->tag(), this );
+ drg->setSubtype("dragdemotag");
+ drg->setPixmap( *currentItem()->pixmap() );
+
+ return drg;
+}
+
+void IconView::slotNewItem( TQDropEvent *e, const TQValueList<TQIconDragItem>& )
+{
+ TQString tag;
+ if ( !e->provides( "text/dragdemotag" ) ) return;
+
+ if ( TQTextDrag::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 000000000..a0b4e3a95
--- /dev/null
+++ b/examples/demo/dnd/iconview.h
@@ -0,0 +1,31 @@
+#include <qiconview.h>
+#include <qstring.h>
+
+#include "dnd.h"
+
+class IconViewItem : public TQIconViewItem
+{
+public:
+ IconViewItem( TQIconView * parent, const TQString & text, const TQPixmap & icon, const TQString& tag )
+ : TQIconViewItem( parent, text, icon ), _tag( tag ) {}
+ virtual ~IconViewItem() {}
+
+ TQString tag() { return _tag; }
+
+private:
+ TQString _tag;
+};
+
+class IconView : public TQIconView
+{
+ Q_OBJECT
+
+public:
+ IconView( TQWidget* parent = 0, const char* name = 0 );
+ ~IconView();
+
+ TQDragObject *dragObject();
+
+public slots:
+ void slotNewItem( TQDropEvent *t, const TQValueList<TQIconDragItem>& );
+};
diff --git a/examples/demo/dnd/listview.cpp b/examples/demo/dnd/listview.cpp
new file mode 100644
index 000000000..443bb7e50
--- /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( TQWidget* parent, const char* name )
+ : TQListView( parent, name )
+{
+ setAcceptDrops( TRUE );
+ setSorting( -1, FALSE );
+ dragging = FALSE;
+}
+
+ListView::~ListView()
+{
+
+}
+
+void ListView::dragEnterEvent( TQDragEnterEvent *e )
+{
+ if ( e->provides( "text/dragdemotag" ) )
+ e->accept();
+}
+
+void ListView::dropEvent( TQDropEvent *e )
+{
+ if ( !e->provides( "text/dragdemotag" ) )
+ return;
+
+ TQString tag;
+
+ if ( TQTextDrag::decode( e, tag ) ) {
+ IconItem item = ((DnDDemo*) parentWidget())->findItem( tag );
+ TQListViewItem *after = itemAt( viewport()->mapFromParent( e->pos() ) );
+ ListViewItem *litem = new ListViewItem( this, after, item.name(), tag );
+ litem->setPixmap( 0, *item.pixmap() );
+ }
+}
+
+void ListView::contentsMousePressEvent( TQMouseEvent *e )
+{
+ TQListView::contentsMousePressEvent( e );
+ dragging = TRUE;
+ pressPos = e->pos();
+}
+
+void ListView::contentsMouseMoveEvent( TQMouseEvent *e )
+{
+ TQListView::contentsMouseMoveEvent( e );
+
+ if ( ! dragging ) return;
+
+ if ( !currentItem() ) return;
+
+ if ( ( pressPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) {
+ TQTextDrag *drg = new TQTextDrag( ((ListViewItem*)currentItem())->tag(), this );
+
+ const TQPixmap *p = ((ListViewItem*)currentItem())->pixmap( 0 );
+ if (p)
+ drg->setPixmap(*p);
+ drg->setSubtype( "dragdemotag" );
+ drg->dragCopy();
+ dragging = FALSE;
+ }
+}
+
+void ListView::contentsMouseReleaseEvent( TQMouseEvent *e )
+{
+ TQListView::contentsMouseReleaseEvent( e );
+ dragging = FALSE;
+}
+
diff --git a/examples/demo/dnd/listview.h b/examples/demo/dnd/listview.h
new file mode 100644
index 000000000..b6b17a0da
--- /dev/null
+++ b/examples/demo/dnd/listview.h
@@ -0,0 +1,35 @@
+#include <qlistview.h>
+
+class ListViewItem : public TQListViewItem
+{
+public:
+ ListViewItem ( TQListView * parent, const TQString& name, const TQString& tag )
+ : TQListViewItem( parent, name ), _tag( tag ) {}
+ ListViewItem ( TQListView * parent, TQListViewItem * after, const TQString& name, const TQString& tag )
+ : TQListViewItem( parent, after, name ), _tag( tag ) {}
+ virtual ~ListViewItem() {}
+
+ TQString tag() { return _tag; }
+
+private:
+ TQString _tag;
+};
+
+class ListView : public TQListView
+{
+ Q_OBJECT
+
+public:
+ ListView( TQWidget* parent = 0, const char* name = 0 );
+ ~ListView();
+
+ void dragEnterEvent( TQDragEnterEvent * );
+ void dropEvent( TQDropEvent * );
+ void contentsMousePressEvent( TQMouseEvent * );
+ void contentsMouseMoveEvent( TQMouseEvent * );
+ void contentsMouseReleaseEvent( TQMouseEvent * );
+
+private:
+ TQPoint pressPos;
+ bool dragging;
+};
diff --git a/examples/demo/dnd/styledbutton.cpp b/examples/demo/dnd/styledbutton.cpp
new file mode 100644
index 000000000..3736198e4
--- /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 TQt 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 TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements 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 TQt Commercial licenses may use this file in
+** accordance with the TQt 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(TQWidget* parent, const char* name)
+ : TQButton( 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 TQBrush& b, TQWidget* parent, const char* name, WFlags f )
+ : TQButton( 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 TQColor& c )
+{
+ col = c;
+ update();
+}
+
+void StyledButton::setPixmap( const TQPixmap & pm )
+{
+ if ( !pm.isNull() ) {
+ delete pix;
+ pix = new TQPixmap( pm );
+ } else {
+ delete pix;
+ pix = 0;
+ }
+ scalePixmap();
+}
+
+TQColor StyledButton::color() const
+{
+ return col;
+}
+
+TQPixmap* StyledButton::pixmap() const
+{
+ return pix;
+}
+
+bool StyledButton::scale() const
+{
+ return s;
+}
+
+void StyledButton::setScale( bool on )
+{
+ if ( s == on )
+ return;
+
+ s = on;
+ scalePixmap();
+}
+
+TQSize StyledButton::sizeHint() const
+{
+ return TQSize( 50, 25 );
+}
+
+TQSize StyledButton::minimumSizeHint() const
+{
+ return TQSize( 50, 25 );
+}
+
+void StyledButton::scalePixmap()
+{
+ delete spix;
+
+ if ( pix ) {
+ spix = new TQPixmap( 6*width()/8, 6*height()/8 );
+ TQImage img = pix->convertToImage();
+
+ spix->convertFromImage( s? img.smoothScale( 6*width()/8, 6*height()/8 ) : img );
+ } else {
+ spix = 0;
+ }
+
+ update();
+}
+
+void StyledButton::resizeEvent( TQResizeEvent* e )
+{
+ scalePixmap();
+ TQButton::resizeEvent( e );
+}
+
+void StyledButton::drawButton( TQPainter *paint )
+{
+ style().drawPrimitive(TQStyle::PE_ButtonBevel, paint, rect(), colorGroup(),
+ isDown() ? TQStyle::Style_Sunken : TQStyle::Style_Default);
+ drawButtonLabel(paint);
+
+ if (hasFocus())
+ style().drawPrimitive(TQStyle::PE_FocusRect, paint,
+ style().subRect(TQStyle::SR_PushButtonFocusRect, this),
+ colorGroup(), TQStyle::Style_Default);
+}
+
+void StyledButton::drawButtonLabel( TQPainter *paint )
+{
+ TQColor pen = isEnabled() ?
+ hasFocus() ? palette().active().buttonText() : palette().inactive().buttonText()
+ : palette().disabled().buttonText();
+ paint->setPen( pen );
+
+ if(!isEnabled()) {
+ paint->setBrush( TQBrush( colorGroup().button() ) );
+ }
+ else if ( edit == PixmapEditor && spix ) {
+ paint->setBrush( TQBrush( col, *spix ) );
+ paint->setBrushOrigin( width()/8, height()/8 );
+ } else
+ paint->setBrush( TQBrush( col ) );
+
+ paint->drawRect( width()/8, height()/8, 6*width()/8, 6*height()/8 );
+}
+
+void StyledButton::onEditor()
+{
+ switch (edit) {
+ case ColorEditor: {
+ TQColor c = TQColorDialog::getColor( palette().active().background(), this );
+ if ( c.isValid() ) {
+ setColor( c );
+ emit changed();
+ }
+ } break;
+ case PixmapEditor: {
+ TQPixmap p;
+ /*
+ if ( pixmap() )
+ p = qChoosePixmap( this,*pixmap() );
+ else
+ p = qChoosePixmap( this, TQPixmap() );
+ if ( !p.isNull() ) {
+ setPixmap( p );
+ emit changed();
+ }
+ */
+ } break;
+ default:
+ break;
+ }
+}
+
+void StyledButton::mousePressEvent(TQMouseEvent* e)
+{
+ TQButton::mousePressEvent(e);
+ mousePressed = TRUE;
+ pressPos = e->pos();
+}
+
+void StyledButton::mouseMoveEvent(TQMouseEvent* e)
+{
+ TQButton::mouseMoveEvent( e );
+#ifndef QT_NO_DRAGANDDROP
+ if ( !mousePressed )
+ return;
+ if ( ( pressPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) {
+ if ( edit == ColorEditor ) {
+ TQColorDrag *drg = new TQColorDrag( col, this );
+ TQPixmap pix( 25, 25 );
+ pix.fill( col );
+ TQPainter 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() ) {
+ TQImage img = pix->convertToImage();
+ TQImageDrag *drg = new TQImageDrag( img, this );
+ if(spix)
+ drg->setPixmap( *spix );
+ mousePressed = FALSE;
+ drg->dragCopy();
+ }
+ }
+#endif
+}
+
+#ifndef QT_NO_DRAGANDDROP
+void StyledButton::dragEnterEvent( TQDragEnterEvent *e )
+{
+ setFocus();
+ if ( edit == ColorEditor && TQColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void StyledButton::dragLeaveEvent( TQDragLeaveEvent * )
+{
+ if ( hasFocus() )
+ parentWidget()->setFocus();
+}
+
+void StyledButton::dragMoveEvent( TQDragMoveEvent *e )
+{
+ if ( edit == ColorEditor && TQColorDrag::canDecode( e ) )
+ e->accept();
+ else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) )
+ e->accept();
+ else
+ e->ignore();
+}
+
+void StyledButton::dropEvent( TQDropEvent *e )
+{
+ if ( edit == ColorEditor && TQColorDrag::canDecode( e ) ) {
+ TQColor color;
+ TQColorDrag::decode( e, color );
+ setColor(color);
+ emit changed();
+ e->accept();
+ }
+ else if ( edit == PixmapEditor && TQImageDrag::canDecode( e ) ) {
+ TQImage img;
+ TQImageDrag::decode( e, img );
+ TQPixmap 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 000000000..fd96cd63c
--- /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 TQt 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 TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements 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 TQt Commercial licenses may use this file in
+** accordance with the TQt 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 TQColor;
+class TQBrush;
+
+class StyledButton : public TQButton
+{
+ Q_OBJECT
+
+ Q_PROPERTY( TQColor color READ color WRITE setColor )
+ Q_PROPERTY( TQPixmap 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( TQWidget* parent = 0, const char* name = 0 );
+ StyledButton( const TQBrush& b, TQWidget* parent = 0, const char* name = 0, WFlags f = 0 );
+ ~StyledButton();
+
+ void setEditor( EditorType );
+ EditorType editor() const;
+
+ void setColor( const TQColor& );
+ void setPixmap( const TQPixmap& );
+
+ TQPixmap* pixmap() const;
+ TQColor color() const;
+
+ void setScale( bool );
+ bool scale() const;
+
+ TQSize sizeHint() const;
+ TQSize minimumSizeHint() const;
+
+public slots:
+ virtual void onEditor();
+
+signals:
+ void changed();
+
+protected:
+ void mousePressEvent(TQMouseEvent*);
+ void mouseMoveEvent(TQMouseEvent*);
+#ifndef QT_NO_DRAGANDDROP
+ void dragEnterEvent ( TQDragEnterEvent * );
+ void dragMoveEvent ( TQDragMoveEvent * );
+ void dragLeaveEvent ( TQDragLeaveEvent * );
+ void dropEvent ( TQDropEvent * );
+#endif // QT_NO_DRAGANDDROP
+ void drawButton( TQPainter* );
+ void drawButtonLabel( TQPainter* );
+ void resizeEvent( TQResizeEvent* );
+ void scalePixmap();
+
+private:
+ TQPixmap* pix;
+ TQPixmap* spix; // the pixmap scaled down to fit into the button
+ TQColor col;
+ EditorType edit;
+ bool s;
+ TQPoint pressPos;
+ bool mousePressed;
+};
+
+#endif //STYLEDBUTTON_H
diff --git a/examples/demo/frame.cpp b/examples/demo/frame.cpp
new file mode 100644
index 000000000..a712f7b4f
--- /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 TQt. 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 TQTranslator *translator = 0;
+static TQTranslator *qt_translator = 0;
+
+Frame::Frame( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name )
+{
+ TQMenuBar *mainMenu = menuBar();
+ TQPopupMenu *fileMenu = new TQPopupMenu( this, "file" );
+ fileMenu->insertItem( tr( "&Exit" ), this, SLOT( close() ),
+ TQAccel::stringToKey( tr( "Ctrl+Q" ) ) );
+
+ TQPopupMenu *styleMenu = new TQPopupMenu( this, "style" );
+ styleMenu->setCheckable( TRUE );
+ TQActionGroup *ag = new TQActionGroup( this, 0 );
+ ag->setExclusive( TRUE );
+ TQSignalMapper *styleMapper = new TQSignalMapper( this );
+ connect( styleMapper, SIGNAL( mapped( const TQString& ) ),
+ this, SLOT( setStyle( const TQString& ) ) );
+
+ TQStringList list = TQStyleFactory::keys();
+ list.sort();
+ TQDict<int> stylesDict( 17, FALSE );
+ for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
+ TQString style = *it;
+ TQString 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;
+ }
+ TQAction *a = new TQAction( style, TQIconSet(),
+ 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 TQWidgetStack( this );
+
+ setCentralWidget( stack );
+}
+
+void Frame::setCategories( const TQPtrList<CategoryInterface> &l )
+{
+ categories = l;
+ TQDockWindow *dw = new TQDockWindow( TQDockWindow::InDock, this );
+ dw->setResizeEnabled( TRUE );
+ dw->setVerticalStretchable( TRUE );
+ addDockWindow( dw, DockLeft );
+ setDockEnabled( dw, DockTop, FALSE );
+ setDockEnabled( dw, DockBottom, FALSE );
+ dw->setCloseMode( TQDockWindow::Always );
+
+ toolBox = new TQToolBox( 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 );
+}
+
+TQWidget *Frame::createCategoryPage( CategoryInterface *c )
+{
+ TQButtonGroup *g = new TQButtonGroup( 1, Horizontal, toolBox );
+ g->setFrameStyle( TQFrame::NoFrame );
+ g->setEraseColor(green);
+ g->setBackgroundMode(PaletteBase);
+ for ( int i = 0; i < c->numCategories(); ++i ) {
+ TQToolButton *b = new TQToolButton( g );
+ b->setBackgroundMode(PaletteBase);
+ b->setTextLabel( c->categoryName( i ) );
+ b->setIconSet( c->categoryIcon( i ) );
+ b->setAutoRaise( TRUE );
+ b->setTextPosition( TQToolButton::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 TQString& style )
+{
+ TQStyle *s = TQStyleFactory::create( style );
+ if ( s )
+ TQApplication::setStyle( s );
+}
+
+void Frame::updateTranslators()
+{
+ if ( !qt_translator ) {
+ qt_translator = new TQTranslator( qApp );
+ translator = new TQTranslator( qApp );
+ qApp->installTranslator( qt_translator );
+ qApp->installTranslator( translator );
+ }
+
+ TQString base = TQDir("../../translations").absPath();
+ qt_translator->load( TQString( "qt_%1" ).arg( TQTextCodec::locale() ), base );
+ translator->load( TQString( "translations/demo_%1" ).arg( TQTextCodec::locale() ) );
+}
+
+bool Frame::event( TQEvent *e )
+{
+ if ( e->type() == TQEvent::LocaleChange )
+ updateTranslators();
+
+ return TQMainWindow::event( e );
+}
diff --git a/examples/demo/frame.h b/examples/demo/frame.h
new file mode 100644
index 000000000..865ea21db
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qmainwindow.h>
+#include <qintdict.h>
+#include "categoryinterface.h"
+
+class TQToolBox;
+class TQStyle;
+class TQWidgetStack;
+
+class Frame : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ Frame( TQWidget *parent=0, const char *name=0 );
+ void setCategories( const TQPtrList<CategoryInterface> &l );
+
+ static void updateTranslators();
+
+ TQWidgetStack *widgetStack() const { return stack; }
+
+private slots:
+ void setStyle( const TQString& );
+
+protected:
+ bool event( TQEvent *e );
+
+private:
+ TQWidget *createCategoryPage( CategoryInterface *c );
+
+private:
+ TQToolBox *toolBox;
+ TQWidgetStack *stack;
+ TQIntDict<TQWidget> categoryPages;
+ TQPtrList<CategoryInterface> categories;
+
+};
diff --git a/examples/demo/graph.cpp b/examples/demo/graph.cpp
new file mode 100644
index 000000000..96e03d6ab
--- /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 TQBrush *tb = 0;
+static TQPen *tp = 0;
+
+class EdgeItem;
+class NodeItem;
+class FigureEditor;
+typedef TQValueList<NodeItem*> NodeItemList;
+typedef TQValueList<EdgeItem*> EdgeItemList;
+
+#define SPEED2ADVANCE(x) (301-x)
+
+class GraphWidgetPrivate
+{
+public:
+ GraphWidgetPrivate() {
+ moving = 0;
+ speed = 275;
+ }
+ ~GraphWidgetPrivate() {
+ delete canvas;
+ }
+ NodeItemList nodeItems;
+ FigureEditor* editor;
+ TQCanvas* canvas;
+ TQCanvasItem* moving;
+ int speed;
+};
+
+class EdgeItem: public TQCanvasLine
+{
+public:
+ EdgeItem( NodeItem*, NodeItem*, TQCanvas* );
+ 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 TQCanvasEllipse
+{
+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, TQCanvas *canvas )
+ : TQCanvasLine( 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 = TQMAX( width()/2, nx );
+ ny = TQMAX( height()/2, ny );
+ nx = TQMIN( canvas()->width() - width()/2, nx );
+ ny = TQMIN( canvas()->height() - height()/2, ny );
+ }
+ TQCanvasEllipse::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 )
+ : TQCanvasEllipse( 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:
+ TQCanvasItem::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 ( TQABS( xvel ) < .1 && TQABS( yvel ) < .1 )
+ xvel = yvel = 0;
+ setVelocity( xvel, yvel );
+}
+
+
+class FigureEditor : public TQCanvasView {
+public:
+ FigureEditor( GraphWidgetPrivate *g, TQWidget* parent=0, const char* name=0, WFlags f=0);
+
+ TQSize sizeHint() const;
+
+
+protected:
+ void contentsMousePressEvent(TQMouseEvent*);
+ void contentsMouseReleaseEvent(TQMouseEvent*);
+ void contentsMouseMoveEvent(TQMouseEvent*);
+
+
+ void resizeEvent( TQResizeEvent* );
+ void showEvent( TQShowEvent* );
+ void hideEvent( TQHideEvent* e);
+
+private:
+ void initialize();
+ TQPoint moving_start;
+ GraphWidgetPrivate* graph;
+};
+
+
+FigureEditor::FigureEditor(
+ GraphWidgetPrivate* g, TQWidget* parent,
+ const char* name, WFlags f) :
+ TQCanvasView(g->canvas, parent,name,f)
+{
+ graph = g;
+}
+
+void FigureEditor::contentsMousePressEvent(TQMouseEvent* e)
+{
+ TQCanvasItemList l=canvas()->collisions(e->pos());
+ for (TQCanvasItemList::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(TQMouseEvent* )
+{
+ if ( graph->moving )
+ graph->moving = 0;
+}
+
+void FigureEditor::contentsMouseMoveEvent(TQMouseEvent* 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 TQCanvasText {
+ void initPos();
+ void initSpeed();
+public:
+ int rtti() const;
+ BouncyText(const TQString&, TQFont, TQCanvas*);
+ void advance(int);
+};
+
+BouncyText::BouncyText( const TQString& text, TQFont f, TQCanvas* canvas) :
+ TQCanvasText(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();
+ }
+
+ TQRect 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:
+ TQCanvasItem::advance( stage );
+ break;
+ }
+}
+
+GraphWidget::GraphWidget( TQWidget *parent, const char *name)
+ : TQWidget( parent, name )
+{
+ d = new GraphWidgetPrivate;
+ d->canvas = 0;
+ TQVBoxLayout* vb = new TQVBoxLayout( this, 11, 6 );
+ d->editor = new FigureEditor( d, this );
+ vb->addWidget( d->editor );
+ TQHBoxLayout* hb = new TQHBoxLayout( vb );
+ hb->addWidget( new TQLabel("Slow", this ) );
+ TQSlider* slider = new TQSlider( 0, 300, 25, d->speed, Horizontal, this );
+ connect( slider, SIGNAL( valueChanged(int) ), this, SLOT( setSpeed(int) ) );
+ hb->addWidget( slider );
+ hb->addWidget( new TQLabel("Fast", this ) );
+ hb->addSpacing( 10 );
+ TQPushButton* btn = new TQPushButton( "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()));
+ }
+}
+
+
+TQSize FigureEditor::sizeHint() const
+{
+ return TQSize( 600, 400 );
+}
+
+void FigureEditor::resizeEvent( TQResizeEvent* e )
+{
+ if ( canvas() )
+ canvas()->resize( contentsRect().width(), contentsRect().height() );
+ TQCanvasView::resizeEvent( e );
+}
+
+void FigureEditor::showEvent( TQShowEvent* )
+{
+ initialize();
+ canvas()->setAdvancePeriod( SPEED2ADVANCE(graph->speed) );
+}
+
+void FigureEditor::hideEvent( TQHideEvent* )
+{
+ initialize();
+ canvas()->setAdvancePeriod( -10 );
+}
+
+void FigureEditor::initialize()
+{
+ if ( canvas() )
+ return;
+ resize( sizeHint() );
+ graph->canvas = new TQCanvas( contentsRect().width(), contentsRect().height() );
+ if ( !tb ) tb = new TQBrush( TQt::red );
+ if ( !tp ) tp = new TQPen( TQt::black );
+ srand( TQTime::currentTime().msec() );
+ int nodecount = 0;
+
+ int rows = 3;
+ int cols = 3;
+
+ TQMemArray<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();
+
+ TQCanvasItem* i = new BouncyText( tr( "Drag the nodes around!" ), TQFont("helvetica", 24), graph->canvas);
+ i->show();
+ setCanvas( graph->canvas );
+ setMinimumSize( 600, 400 );
+ setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding );
+}
diff --git a/examples/demo/graph.h b/examples/demo/graph.h
new file mode 100644
index 000000000..841202bd0
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qwidget.h>
+class TQStyle;
+class TQListBox;
+class TQListBoxItem;
+class TQWidgetStack;
+
+class GraphWidgetPrivate;
+
+class GraphWidget : public TQWidget
+{
+ Q_OBJECT
+public:
+ GraphWidget( TQWidget *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 000000000..32980ce48
--- /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 000000000..eccc5fda6
--- /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 000000000..a66c21670
--- /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(TQWidget *parent, const char *name)
+ : TQMainWindow(parent, name, 0), lastwrapper(0)
+{
+ initActions();
+ initMenuBar();
+
+ TQVBox *box = new TQVBox(this);
+ box->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken );
+ box->setMargin( 1 );
+ box->setLineWidth( 1 );
+
+ workspace = new TQWorkspace(box);
+ connect(workspace, SIGNAL(windowActivated(TQWidget *)),
+ SLOT(windowActivated(TQWidget *)));
+ workspace->setBackgroundMode(PaletteMid);
+
+ setCentralWidget(box);
+}
+
+
+I18nDemo::~I18nDemo()
+{
+}
+
+
+void I18nDemo::initActions()
+{
+ actionClose = new TQAction(tr("Close the current window."),
+ tr("Close"),
+ CTRL + Key_F4,
+ this);
+ connect(actionClose, SIGNAL(activated()), SLOT(closeSlot()));
+
+ actionCloseAll = new TQAction(tr("Close all opened windows."),
+ tr("Close All"),
+ 0,
+ this);
+ connect(actionCloseAll, SIGNAL(activated()), SLOT(closeAllSlot()));
+
+ actionTile = new TQAction(tr("Tile opened windows."),
+ tr("Tile"),
+ 0,
+ this);
+ connect(actionTile, SIGNAL(activated()), SLOT(tileSlot()));
+
+ actionCascade = new TQAction(tr("Cascade opened windows."),
+ tr("Cascade"),
+ 0,
+ this);
+ connect(actionCascade, SIGNAL(activated()), SLOT(cascadeSlot()));
+}
+
+
+void I18nDemo::initMenuBar()
+{
+ newMenu = new TQPopupMenu(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 TQPopupMenu(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)
+{
+ TQString 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( TQLayout::FreeResize );
+ te->setMinimumSize(500, 400);
+ te->fileNew();
+ te->currentEditor()->
+ setText(tr("<h3>About TQt</h3>"
+ "<p>This program uses TQt version %1, a multiplatform C++ "
+ "GUI toolkit from Trolltech. TQt 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;
+
+ TQWidgetList list = workspace->windowList();
+ Wrapper *wrapper = (Wrapper *) list.first();
+ while (wrapper) {
+ if (wrapper->id == id) {
+ wrapper->setFocus();
+ break;
+ }
+
+ wrapper = (Wrapper *) list.next();
+ }
+}
+
+
+void I18nDemo::windowActivated(TQWidget *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()
+{
+ TQWidget *w = workspace->activeWindow();
+ delete w;
+}
+
+
+void I18nDemo::closeAllSlot()
+{
+ TQWidget *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(TQShowEvent *)
+{
+ if (firstShow) {
+ newSlot(1);
+ firstShow = FALSE;
+ return;
+ }
+
+ if (! lastwrapper)
+ return;
+
+ qApp->installTranslator(&lastwrapper->translator);
+}
+
+
+void I18nDemo::hideEvent(TQHideEvent *)
+{
+ 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 000000000..850e48c39
--- /dev/null
+++ b/examples/demo/i18n/i18n.h
@@ -0,0 +1,44 @@
+#ifndef I18N_H
+#define I18N_H
+
+#include <qmainwindow.h>
+
+class TQWorkspace;
+class TQAction;
+class TQPopupMenu;
+class Wrapper;
+
+
+class I18nDemo : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ I18nDemo(TQWidget *, const char * = 0);
+ ~I18nDemo();
+
+ void initActions();
+ void initMenuBar();
+
+ void showEvent(TQShowEvent *);
+ void hideEvent(TQHideEvent *);
+
+ TQWorkspace *workspace;
+ TQAction *actionClose, *actionCloseAll, *actionTile, *actionCascade;
+ TQPopupMenu *windowMenu, *newMenu;
+ Wrapper *lastwrapper;
+
+
+public slots:
+ void newSlot(int);
+ void windowSlot(int);
+ void windowActivated(TQWidget *);
+ 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 000000000..c61d2139b
--- /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 000000000..788888e33
--- /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 000000000..81a3ec7cd
--- /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 000000000..028e8b527
--- /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 000000000..1aaffb714
--- /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 000000000..05482a882
--- /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 000000000..b1bddf586
--- /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 TQVBox
+{
+public:
+ Wrapper(TQWidget *parent, int i, const char *name = 0)
+ : TQVBox(parent, name, WDestructiveClose), translator(this), id(i)
+ {
+ }
+
+ TQTranslator translator;
+ int id;
+};
+
+
+#endif // WRAPPER_H
diff --git a/examples/demo/icons.h b/examples/demo/icons.h
new file mode 100644
index 000000000..32177688e
--- /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 000000000..b8c69398d
--- /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 TQt. 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 )
+{
+ TQWidget *w = qApp->mainWidget();
+ if ( !w )
+ return;
+ TQString title = Frame::tr( "TQt Demo Collection" );
+ title += " - " + c->categoryName( i - c->categoryOffset() );
+ w->setCaption( title );
+}
+
+class WidgetCategory : public CategoryInterface
+{
+public:
+ WidgetCategory( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ TQString name() const { return "Widgets"; }
+ TQIconSet icon() const { return TQPixmap( widgeticon ); }
+ int numCategories() const { return 2; }
+ TQString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Widgets" );
+ break;
+ case 1:
+ return Frame::tr( "Drag and Drop" );
+ break;
+ }
+ return TQString::null;
+ }
+ TQIconSet categoryIcon( int ) const { return TQIconSet(); }
+ 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( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ TQString name() const { return "Database"; }
+ TQIconSet icon() const { return TQPixmap( dbicon ); }
+ int numCategories() const { return 1; }
+ TQString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "SQL Explorer" );
+ break;
+ }
+ return TQString::null;
+ }
+ TQIconSet categoryIcon( int ) const { return TQIconSet(); }
+ 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( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ TQString name() const { return "2D Graphics"; }
+ TQIconSet icon() const { return TQPixmap( twodicon ); }
+ int numCategories() const { return 2; }
+ TQString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Graph Drawing" );
+ break;
+ case 1:
+ return Frame::tr( "Display" );
+ break;
+ }
+ return TQString::null;
+ }
+ TQIconSet categoryIcon( int ) const { return TQIconSet(); }
+ 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( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ TQString name() const { return "3D Graphics"; }
+ TQIconSet icon() const { return TQPixmap( threedicon ); }
+ int numCategories() const { return 3; }
+ TQString 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 TQString::null;
+ }
+ TQIconSet categoryIcon( int ) const { return TQIconSet(); }
+ 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( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ TQString name() const { return "Text Drawing/Editing"; }
+ TQIconSet icon() const { return TQPixmap( texticon ); }
+ int numCategories() const { return 2; }
+ TQString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Richtext Editor" );
+ break;
+ case 1:
+ return Frame::tr( "Help Browser" );
+ break;
+ }
+ return TQString::null;
+ }
+ TQIconSet categoryIcon( int ) const { return TQIconSet(); }
+ 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 );
+ TQString home = TQDir( "../../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( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ TQString name() const { return "Internationalization"; }
+ TQIconSet icon() const { return TQPixmap( internicon ); }
+ int numCategories() const { return 1; }
+ TQString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Internationalization" );
+ break;
+ }
+ return TQString::null;
+ }
+ TQIconSet categoryIcon( int ) const { return TQIconSet(); }
+ 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( TQWidgetStack *s ) : CategoryInterface( s ), created( FALSE ) {}
+
+ TQString name() const { return "Game"; }
+ TQIconSet icon() const { return TQPixmap( joyicon ); }
+ int numCategories() const { return 1; }
+ TQString categoryName( int i ) const {
+ switch ( i ) {
+ case 0:
+ return Frame::tr( "Asteroids" );
+ break;
+ }
+ return TQString::null;
+ }
+ TQIconSet categoryIcon( int ) const { return TQIconSet(); }
+ 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 )
+{
+ TQString category;
+ TQApplication a( argc, argv );
+
+ Frame::updateTranslators();
+ Frame frame;
+ a.setMainWidget( &frame );
+
+ TQPtrList<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 000000000..4409ae08f
--- /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 retquired 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 000000000..474cd3c2d
--- /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 000000000..ccba9ec4e
--- /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 000000000..f065888b5
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget 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( TQWidget* 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", TQFont( "helvetica", 12, TQFont::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 000000000..2667cfa3b
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLBOX_H
+#define GLBOX_H
+
+#include "glcontrolwidget.h"
+
+class GLBox : public GLControlWidget
+{
+ Q_OBJECT
+
+public:
+
+ GLBox( TQWidget* 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 000000000..2e019f051
--- /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( TQWidget *parent, const char *name, TQGLWidget *share, WFlags f )
+: TQGLWidget( 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 TQTimer( 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 );
+ TQString str( "Rendering text in OpenGL is easy with TQt" );
+ TQFontMetrics fm( font() );
+ renderText( (width() - fm.width( str )) / 2, 15, str );
+ TQFont f( "courier", 8 );
+ TQFontMetrics fmc( f );
+ qglColor( TQColor("skyblue") );
+ int x, y, z;
+ x = (xRot >= 0) ? (int) xRot % 360 : 359 - (TQABS((int) xRot) % 360);
+ y = (yRot >= 0) ? (int) yRot % 360 : 359 - (TQABS((int) yRot) % 360);
+ z = (zRot >= 0) ? (int) zRot % 360 : 359 - (TQABS((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( TQMouseEvent *e )
+{
+ e->accept();
+ oldPos = e->pos();
+}
+
+void GLControlWidget::mouseReleaseEvent( TQMouseEvent *e )
+{
+ e->accept();
+ oldPos = e->pos();
+}
+
+void GLControlWidget::mouseMoveEvent( TQMouseEvent *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( TQWheelEvent *e )
+{
+ e->accept();
+ if ( scale <= ( (double)e->delta() / 1000 ) )
+ return;
+ setScale( scale - ( (double)e->delta() / 1000 ));
+}
+
+void GLControlWidget::mouseDoubleClickEvent( TQMouseEvent * )
+{
+ if ( delay <= 0 )
+ return;
+
+ animation = !animation;
+ if ( animation )
+ timer->start( delay );
+ else
+ timer->stop();
+}
+
+void GLControlWidget::showEvent( TQShowEvent *e )
+{
+ if ( wasAnimated && !timer->isActive() )
+ timer->start( delay );
+
+ TQGLWidget::showEvent( e );
+}
+
+void GLControlWidget::hideEvent( TQHideEvent *e )
+{
+ wasAnimated = timer->isActive();
+ timer->stop();
+ TQGLWidget::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 000000000..7a1b6174b
--- /dev/null
+++ b/examples/demo/opengl/glcontrolwidget.h
@@ -0,0 +1,56 @@
+#ifndef GLCONTROLWIDGET_H
+#define GLCONTROLWIDGET_H
+
+#include <qgl.h>
+
+class GLControlWidget : public TQGLWidget
+{
+ Q_OBJECT
+
+public:
+ GLControlWidget( TQWidget *parent, const char *name = 0, TQGLWidget *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( TQMouseEvent *e );
+ void mouseReleaseEvent( TQMouseEvent *e );
+ void mouseMoveEvent( TQMouseEvent * );
+ void mouseDoubleClickEvent( TQMouseEvent * );
+ void wheelEvent( TQWheelEvent * );
+
+ void showEvent( TQShowEvent * );
+ void hideEvent( TQHideEvent * );
+
+ GLfloat xRot, yRot, zRot;
+ GLfloat xTrans, yTrans, zTrans;
+ GLfloat scale;
+ bool animation;
+
+protected slots:
+ virtual void animate();
+
+private:
+ bool wasAnimated;
+ TQPoint oldPos;
+ TQTimer* timer;
+ int delay;
+};
+
+#endif
diff --git a/examples/demo/opengl/glgear.cpp b/examples/demo/opengl/glgear.cpp
new file mode 100644
index 000000000..07c5f3694
--- /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 TQt. 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( TQWidget *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", TQFont( "helvetica", 12, TQFont::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 000000000..fed4256ca
--- /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( TQWidget *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 000000000..70266fc1d
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef GLINFO_H
+#define GLINFO_H
+
+#include <qstring.h>
+
+class GLInfo
+{
+public:
+ GLInfo();
+ TQString info();//extensions();
+/* TQString configs(); */
+
+protected:
+ TQString infotext;
+/* TQString config; */
+};
+#endif
diff --git a/examples/demo/opengl/glinfo_x11.cpp b/examples/demo/opengl/glinfo_x11.cpp
new file mode 100644
index 000000000..5155f87c8
--- /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 TQt. 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, TQString &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 += TQString( 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 += TQString( clientExtensions ).replace( ' ', '\n' ) + "\n\n";
+
+ infotext.sprintf( "%sGLX extensions:\n", infotext.ascii() );
+
+ infotext += TQString( 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 += TQString( glExtensions ).replace( ' ', '\n' ) + "\n\n";
+
+ infotext.sprintf( "%sGLU version: %s\n", infotext.ascii(), gluVersion );
+ infotext.sprintf( "%sGLU extensions:\n", infotext.ascii() );
+
+ infotext += TQString( 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, TQString &configs )
+{
+ TQString 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()
+{
+ TQGLWidget gl((TQWidget *) 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" );
+ }
+}
+
+TQString GLInfo::info()
+{
+ return infotext;
+}
diff --git a/examples/demo/opengl/glinfotext.h b/examples/demo/opengl/glinfotext.h
new file mode 100644
index 000000000..80f42baba
--- /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 TQWidget
+{
+public:
+ GLInfoText(TQWidget *parent)
+ : TQWidget(parent)
+ {
+ view = new TQTextView(this);
+ view->setFont(TQFont("courier", 10));
+ view->setWordWrap(TQTextEdit::NoWrap);
+ TQHBoxLayout *l = new TQHBoxLayout(this);
+ l->addWidget(view);
+ GLInfo info;
+ view->setText(info.info());
+ }
+
+private:
+ TQTextView *view;
+};
diff --git a/examples/demo/opengl/gllandscape.cpp b/examples/demo/opengl/gllandscape.cpp
new file mode 100644
index 000000000..0aa836687
--- /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( TQWidget * parent, const char * name )
+ : TQGLWidget( 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();
+
+ TQImage tex;
+ tex.load("opengl/qtlogo.png");
+ tex = TQGLWidget::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()
+{
+ TQString 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 retquire
+ // 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( TQMouseEvent *e )
+{
+ oldPos = e->pos();
+ mouseButtonDown = TRUE;
+}
+
+void GLLandscape::mouseReleaseEvent( TQMouseEvent *e )
+{
+ oldPos = e->pos();
+ mouseButtonDown = FALSE;
+}
+
+void GLLandscape::mouseMoveEvent( TQMouseEvent *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( TQTimerEvent *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( TQShowEvent * )
+{
+ if (animationRunning)
+ animTimer = startTimer(20);
+ cubeTimer = startTimer(50);
+}
+
+void GLLandscape::hideEvent( TQHideEvent * )
+{
+ 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 000000000..7d91215c9
--- /dev/null
+++ b/examples/demo/opengl/gllandscape.h
@@ -0,0 +1,98 @@
+#ifndef GLLANDSCAPE_H
+#define GLLANDSCAPE_H
+
+#include <qgl.h>
+
+class GLLandscape : public TQGLWidget
+{
+ Q_OBJECT
+
+public:
+ GLLandscape( TQWidget * 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( TQMouseEvent * );
+ void mouseReleaseEvent( TQMouseEvent * );
+ void mouseMoveEvent( TQMouseEvent * );
+ void timerEvent( TQTimerEvent * );
+ void showEvent( TQShowEvent * );
+ void hideEvent( TQHideEvent * );
+
+ 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];
+
+ TQPoint 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 000000000..d587a56a4
--- /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="TQWidget">
+ <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>TQt/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="TQLayoutWidget" 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="TQLayoutWidget">
+ <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="TQLabel">
+ <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="TQThumbWheel">
+ <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="TQLayoutWidget">
+ <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="TQLabel">
+ <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="TQThumbWheel">
+ <property name="name">
+ <cstring>wheelY</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>30</height>
+ </size>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <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="TQLabel">
+ <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="TQThumbWheel">
+ <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="TQLayoutWidget" 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="TQButtonGroup">
+ <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="TQRadioButton" 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="TQRadioButton" 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="TQRadioButton" row="0" column="2">
+ <property name="name">
+ <cstring>RadioButton1_3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Smooth shaded</string>
+ </property>
+ </widget>
+ <widget class="TQRadioButton" 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="TQLayoutWidget">
+ <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="TQPushButton" 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="TQPushButton" 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="TQPushButton" 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="TQLayoutWidget" 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="TQLayoutWidget">
+ <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="TQLabel">
+ <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="TQThumbWheel">
+ <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="TQLabel">
+ <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="TQThumbWheel">
+ <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="TQFrame">
+ <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>TQThumbWheel</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 000000000..c82acdc09
--- /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 TQt 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 000000000..ee64a1036
--- /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 000000000..30a9b8c93
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget demonstrating the use of TQImages 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( TQWidget* 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", TQFont( "helvetica", 12, TQFont::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
+
+ TQImage tex1, tex2, buf;
+
+ if ( !buf.load( "opengl/gllogo.bmp" ) ) { // Load first image from file
+ qWarning( "Could not read image file, using single-color instead." );
+ TQImage dummy( 128, 128, 32 );
+ dummy.fill( TQt::green.rgb() );
+ buf = dummy;
+ }
+ tex1 = TQGLWidget::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." );
+ TQImage dummy( 128, 128, 32 );
+ dummy.fill( TQt::red.rgb() );
+ buf = dummy;
+ }
+ tex2 = TQGLWidget::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 TQImage& tex1, const TQImage& 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 000000000..5d235dcff
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLTEXOBJ_H
+#define GLTEXOBJ_H
+
+#include "glcontrolwidget.h"
+
+class GLTexobj : public GLControlWidget
+{
+ Q_OBJECT
+
+public:
+ GLTexobj( TQWidget* 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 TQImage& tex1, const TQImage& 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 000000000..ecc1f374e
--- /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( TQWidget *parent, const char *name, WFlags f )
+: TQMainWindow( parent, name, f ), printer( 0 )
+{
+ setupSceneActions();
+
+ TQVBox *vbox = new TQVBox( this );
+ vbox->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken );
+ vbox->setMargin( 1 );
+ vbox->setLineWidth( 1 );
+
+ workspace = new TQWorkspace( vbox );
+ workspace->setBackgroundMode( PaletteMid );
+ setCentralWidget( vbox );
+}
+
+GLWorkspace::~GLWorkspace()
+{
+}
+
+void GLWorkspace::setupSceneActions()
+{
+ TQToolBar *tb = new TQToolBar( "Scene", this );
+ TQPopupMenu *menu = new TQPopupMenu( this );
+ menuBar()->insertItem( tr( "&Scene" ), menu );
+
+ TQAction *a;
+ TQActionGroup *newGroup = new TQActionGroup( this );
+ newGroup->setMenuText( tr( "&New" ) );
+ newGroup->setText( tr( "New" ) );
+ newGroup->setUsesDropDown( TRUE );
+ newGroup->setExclusive( FALSE );
+ newGroup->setIconSet( TQPixmap( "textdrawing/filenew.png" ) );
+ a = new TQAction( tr( "Wirebox" ), TQPixmap( "opengl/wirebox.xpm" ), tr( "&Wirebox" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newWirebox() ) );
+ a = new TQAction( tr( "Gear" ), TQPixmap( "opengl/gear.xpm" ), tr( "&Gears" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newGear() ) );
+ a = new TQAction( tr( "Texture" ), TQPixmap( "opengl/texture.xpm" ), tr( "&Texture" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newTexture() ) );
+/* a = new TQAction( tr( "Nurbs" ), TQPixmap( "opengl/nurbs.xpm" ), tr( "&Nurbs" ), 0, newGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( newNurbs() ) );*/
+ newGroup->addTo( tb );
+ newGroup->addTo( menu );
+
+ menu->insertSeparator();
+ TQActionGroup *printGroup = new TQActionGroup( this );
+ printGroup->setMenuText( tr( "&Print" ) );
+ printGroup->setText( tr( "Print" ) );
+ printGroup->setUsesDropDown( TRUE );
+ printGroup->setExclusive( FALSE );
+ printGroup->setIconSet( TQPixmap( "textdrawing/print.png" ) );
+ TQAction *da = new TQAction( tr( "Window Size" ), TQPixmap( "textdrawing/print.png" ), tr( "&Window Size" ), CTRL + Key_P, printGroup );
+ connect( da, SIGNAL( activated() ), this, SLOT( filePrintWindowRes() ) );
+ a = new TQAction( tr( "Low Resolution" ), tr( "&Low Resolution" ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintLowRes() ) );
+ a = new TQAction( tr( "Medium Resolution" ), tr( "&Medium Resolution" ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintMedRes() ) );
+ a = new TQAction( tr( "High Resolution" ), tr( "&High Resolution" ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintHighRes() ) );
+ printGroup->addSeparator();
+ a = new TQAction( tr( "Setup" ), tr( "&Setup..." ), 0, printGroup );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrintSetup() ) );
+ da->addTo( tb );
+ printGroup->addTo( menu );
+
+ a = new TQAction( tr( "Close" ), TQPixmap(), 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( TQPixmap( "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( TQPixmap( "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( TQPixmap( "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( TQPixmap( "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;
+
+ TQWidget *widget = workspace->activeWindow();
+ if ( !widget || !widget->inherits( "TQGLWidget" ) )
+ return;
+ TQGLWidget *gl = (TQGLWidget *)widget;
+ TQPixmap pm = gl->renderPixmap( x, y );
+
+ PrintPreview view( this );
+ TQImage temp = pm.convertToImage();
+ temp = temp.smoothScale( 400, 300 );
+ TQPixmap temppix;
+ temppix.convertFromImage( temp );
+ view.setPixmap( temppix );
+ view.setIcon( TQPixmap( "opengl/snapshot.xpm" ) );
+ view.setCaption( gl->caption() + " - Print preview" );
+ if ( view.exec() ) {
+ TQImage 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 );
+
+ TQPainter painter;
+ if ( !painter.begin( printer ) )
+ return;
+
+ painter.drawPixmap( TQPoint( 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 TQPrinter;
+ 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 000000000..4bf532a95
--- /dev/null
+++ b/examples/demo/opengl/glworkspace.h
@@ -0,0 +1,37 @@
+#ifndef GLWORKSPACE_H
+#define GLWORKSPACE_H
+
+#include <qmainwindow.h>
+
+class TQWorkspace;
+class TQPrinter;
+
+class GLWorkspace : public TQMainWindow
+{
+ Q_OBJECT
+public:
+ GLWorkspace( TQWidget *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:
+ TQWorkspace *workspace;
+ TQPrinter *printer;
+};
+
+#endif //GLWORKSPACE_H
diff --git a/examples/demo/opengl/nurbs.xpm b/examples/demo/opengl/nurbs.xpm
new file mode 100644
index 000000000..946d08115
--- /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 000000000..b312edca1
--- /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="TQDialog">
+ <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="TQGroupBox" 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="TQLabel">
+ <property name="name">
+ <cstring>pixmapLabel</cstring>
+ </property>
+ <property name="text">
+ <string>TextLabel1</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQGroupBox" 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="TQCheckBox">
+ <property name="name">
+ <cstring>checkInvert</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Invert Colors</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>checkMirror</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Mirror</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>checkFlip</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Flip</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>checkLeft</cstring>
+ </property>
+ <property name="text">
+ <string>Rotate 90° &amp;left</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>checkRight</cstring>
+ </property>
+ <property name="text">
+ <string>Rotate 90° &amp;right</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="TQLayoutWidget" 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="TQPushButton">
+ <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="TQPushButton">
+ <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="TQPushButton">
+ <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>TQPixmap 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 TQPixmap &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 000000000..fd19c2c4b
--- /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
+** TQt 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()
+{
+ TQImage 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() ) {
+ }
+ TQPixmap 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 TQPixmap & pm )
+{
+ pix = pm;
+ updatePreview();
+}
diff --git a/examples/demo/opengl/qtlogo.bmp b/examples/demo/opengl/qtlogo.bmp
new file mode 100644
index 000000000..b7f9215d9
--- /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 000000000..e6e3beef3
--- /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 000000000..1c7180c40
--- /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 000000000..3c423e948
--- /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 000000000..77ca534c3
--- /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 000000000..33cdc48c1
--- /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 000000000..de75852a9
--- /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( TQWidget *parent ) : TQFrame( 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 TQColor &c )
+{
+ ColorRange *cr = new ColorRange;
+ cr->mPc = pc;
+ cr->mColor = c;
+ mCRanges.append( cr );
+ calcColorRanges();
+}
+
+void KALedMeter::resizeEvent( TQResizeEvent *e )
+{
+ TQFrame::resizeEvent( e );
+ int w = ( width() - frameWidth() - 2 ) / mCount * mCount;
+ w += frameWidth() + 2;
+ setFrameRect( TQRect( 0, 0, w, height() ) );
+}
+
+void KALedMeter::drawContents( TQPainter *p )
+{
+ TQRect b = contentsRect();
+
+ unsigned cidx = 0;
+ int ncol = mCount;
+ TQColor 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 000000000..8018c72df
--- /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 TQFrame
+{
+ Q_OBJECT
+public:
+ KALedMeter( TQWidget *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 TQColor &c );
+
+public slots:
+ void setValue( int v );
+
+protected:
+ virtual void resizeEvent( TQResizeEvent * );
+ virtual void drawContents( TQPainter * );
+ void calcColorRanges();
+
+protected:
+ struct ColorRange
+ {
+ int mPc;
+ int mValue;
+ TQColor mColor;
+ };
+
+ int mRange;
+ int mCount;
+ int mCurrentCount;
+ int mValue;
+ TQPtrList<ColorRange> mCRanges;
+};
+
+#endif
diff --git a/examples/demo/qasteroids/sounds/Explosion.wav b/examples/demo/qasteroids/sounds/Explosion.wav
new file mode 100644
index 000000000..7b140b1c6
--- /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 000000000..361bd0e2b
--- /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 TQCanvasSprite
+{
+public:
+ KMissile( TQCanvasPixmapArray *s, TQCanvas *c ) : TQCanvasSprite( 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 TQCanvasSprite
+{
+public:
+ KBit( TQCanvasPixmapArray *s, TQCanvas *c ) : TQCanvasSprite( 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 TQCanvasSprite
+{
+public:
+ KExhaust( TQCanvasPixmapArray *s, TQCanvas *c ) : TQCanvasSprite( 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 TQCanvasSprite
+{
+public:
+ KPowerup( TQCanvasPixmapArray *s, TQCanvas *c, int t ) : TQCanvasSprite( 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 TQCanvasSprite
+{
+public:
+ KRock (TQCanvasPixmapArray *s, TQCanvas *c, int t, int sk, int st) : TQCanvasSprite( s, c )
+ { type = t; skip = cskip = sk; step = st; }
+
+ void nextFrame()
+ {
+ if (cskip-- <= 0) {
+ setFrame( (frame()+step+frameCount())%frameCount() );
+ cskip = TQABS(skip);
+ }
+ }
+
+ virtual int rtti() const { return type; }
+
+private:
+ int type;
+ int skip;
+ int cskip;
+ int step;
+};
+
+class KShield : public TQCanvasSprite
+{
+public:
+ KShield( TQCanvasPixmapArray *s, TQCanvas *c )
+ : TQCanvasSprite( 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 000000000..e69de29bb
--- /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 000000000..cb2976f88
--- /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 000000000..9be7ccb67
--- /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 000000000..5ec9d0294
--- /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 000000000..07b401233
--- /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 000000000..833379229
--- /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 000000000..9f1fc0283
--- /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 000000000..eb1cc090c
--- /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 000000000..149be63c1
--- /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 000000000..4ac75c8ed
--- /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 000000000..907241dd7
--- /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 000000000..15332684f
--- /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 000000000..05402ba9e
--- /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 000000000..ca4f2297a
--- /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 000000000..91913c032
--- /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 000000000..e55d4399a
--- /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 000000000..9c7343600
--- /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 000000000..f0463a2a9
--- /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 000000000..bce35aac5
--- /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 000000000..a17ee71cf
--- /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 000000000..4283c6709
--- /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 000000000..75cd649cc
--- /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 000000000..2d97ac1ed
--- /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 000000000..bd6055582
--- /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 000000000..4b2b3e335
--- /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 000000000..121ec9cde
--- /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 000000000..e42fc7662
--- /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 000000000..58298c050
--- /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 000000000..2e3ff9322
--- /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 000000000..ba70d2404
--- /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 000000000..88d776e43
--- /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 000000000..9db197d4c
--- /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 000000000..9b92d55c3
--- /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 000000000..9cdddf5ab
--- /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 000000000..0c421a009
--- /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 000000000..2339c8367
--- /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 000000000..d1eb8aaf9
--- /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 000000000..47ada4278
--- /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 000000000..1a2eba02e
--- /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 000000000..ec213e1c8
--- /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 000000000..3bdb39b61
--- /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 000000000..08de9a088
--- /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 000000000..3b6ce6084
--- /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 000000000..01216dce4
--- /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 000000000..efb612d44
--- /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 000000000..97bbfce88
--- /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 000000000..29862676c
--- /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 000000000..80eab6df8
--- /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 000000000..78023e088
--- /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 000000000..076a33848
--- /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 000000000..4f8f5edcb
--- /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 000000000..4e6ba042a
--- /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 000000000..1a15fc3b7
--- /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 000000000..b627d537d
--- /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 000000000..7df23b167
--- /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 000000000..d2cb5d3f8
--- /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 000000000..68611a679
--- /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 000000000..44d6a30bb
--- /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 000000000..9dca7db1d
--- /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 000000000..10beae6ab
--- /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 000000000..d50e6fada
--- /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 000000000..2f37a2062
--- /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 000000000..5cb52bb81
--- /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 000000000..c4c85eb59
--- /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 000000000..dea49d7e8
--- /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 000000000..39772b8aa
--- /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 000000000..fb02ee48e
--- /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 000000000..a81c5ac7d
--- /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 000000000..cf5c2f4c4
--- /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 000000000..479c21d27
--- /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 000000000..871abca06
--- /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 000000000..d5d786081
--- /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 000000000..1da995334
--- /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 000000000..29886585e
--- /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 000000000..d104ff954
--- /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 000000000..e12943df9
--- /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 000000000..dc7529cfd
--- /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 000000000..3d9d3185e
--- /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 000000000..6314f03b8
--- /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 000000000..5a8aeef21
--- /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 000000000..f0e5b088d
--- /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 000000000..d731950d0
--- /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 000000000..8bc7e20fe
--- /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 000000000..b2854b25d
--- /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 000000000..781d620a0
--- /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 000000000..1f64b02c2
--- /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 000000000..bd19e7444
--- /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 000000000..180f5b65c
--- /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 000000000..f2681d46f
--- /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 000000000..5bc1add09
--- /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 000000000..5621b4d6d
--- /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 000000000..aec4a3474
--- /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 000000000..121b70eea
--- /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 000000000..661b18e7c
--- /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 000000000..26a3cf969
--- /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 000000000..2f37a2062
--- /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 000000000..de1205a88
--- /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 000000000..12ebc0031
--- /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 000000000..265c381bc
--- /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 000000000..1ff7a0675
--- /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 000000000..5b505bf10
--- /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 000000000..204c9697b
--- /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 000000000..32140cffb
--- /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 000000000..f01baa6b3
--- /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 000000000..eee458e5a
--- /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 000000000..14412d4e1
--- /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 000000000..bb61d549b
--- /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 000000000..8486e5a45
--- /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 000000000..d9ae4191e
--- /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 000000000..ce694002a
--- /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 000000000..981e92c13
--- /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 000000000..63f0a69d8
--- /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 000000000..72bc42fc7
--- /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 000000000..c89f358ce
--- /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 000000000..e1ba724d4
--- /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 000000000..5f004a766
--- /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 000000000..58009bf92
--- /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 000000000..8d9549c85
--- /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 000000000..1e8a1c233
--- /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 000000000..9b960d669
--- /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 000000000..6c15f2b89
--- /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 000000000..12b05da54
--- /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 000000000..16190e944
--- /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 000000000..a8625015d
--- /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 000000000..e3e0c1806
--- /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 000000000..ec70b8443
--- /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 000000000..0b060d038
--- /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 000000000..c1dc1b92f
--- /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 000000000..e3434e623
--- /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 000000000..038cf5dbd
--- /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 000000000..1cf0da0ad
--- /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 000000000..40c725655
--- /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 000000000..4ee43bae0
--- /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 000000000..0122e14ea
--- /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 000000000..dc5bea344
--- /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 000000000..479cc20ea
--- /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 000000000..8f185cd7b
--- /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 000000000..1d73a6e2c
--- /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 000000000..d3f4b3f3b
--- /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 000000000..c5f40fa20
--- /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 000000000..a1c8c2590
--- /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 000000000..8d3b6d9cc
--- /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 000000000..15843ddef
--- /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 000000000..380509ac7
--- /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 000000000..633f5629f
--- /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 000000000..e40ad04d6
--- /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 000000000..19f3436e3
--- /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 000000000..b1142f4eb
--- /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 000000000..b8acd629b
--- /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 000000000..06ac9eb5b
--- /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 000000000..71cf38c0c
--- /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 000000000..988a77f78
--- /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 000000000..1ad219304
--- /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 000000000..c4f712504
--- /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 000000000..09e226e7c
--- /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 000000000..56b6190bb
--- /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 000000000..473340a63
--- /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 000000000..dcfaa9879
--- /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 000000000..f5718a2aa
--- /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 000000000..d59ca3208
--- /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 000000000..8f2492710
--- /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 000000000..0cae4978f
--- /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 000000000..bc7c5db22
--- /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 000000000..386a9c7ce
--- /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 000000000..ad9677988
--- /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 000000000..117420f07
--- /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 000000000..0677ce19f
--- /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 000000000..576625cb5
--- /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 000000000..ba876908c
--- /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 000000000..fbec2ec28
--- /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( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name, 0 )
+{
+ TQWidget *border = new TQWidget( this );
+ border->setBackgroundColor( black );
+ setCentralWidget( border );
+
+ TQVBoxLayout *borderLayout = new TQVBoxLayout( border );
+ borderLayout->addStretch( 1 );
+
+ TQWidget *mainWin = new TQWidget( 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() ) );
+
+ TQVBoxLayout *vb = new TQVBoxLayout( mainWin );
+ TQHBoxLayout *hb = new TQHBoxLayout;
+ TQHBoxLayout *hbd = new TQHBoxLayout;
+ vb->addLayout( hb );
+
+ TQFont labelFont( "helvetica", 24 );
+ TQColorGroup grp( darkGreen, black, TQColor( 128, 128, 128 ),
+ TQColor( 64, 64, 64 ), black, darkGreen, black );
+ TQPalette pal( grp, grp, grp );
+
+ mainWin->setPalette( pal );
+
+ hb->addSpacing( 10 );
+
+ TQLabel *label;
+ label = new TQLabel( tr("Score"), mainWin );
+ label->setFont( labelFont );
+ label->setPalette( pal );
+ label->setFixedWidth( label->sizeHint().width() );
+ hb->addWidget( label );
+
+ scoreLCD = new TQLCDNumber( 6, mainWin );
+ scoreLCD->setFrameStyle( TQFrame::NoFrame );
+ scoreLCD->setSegmentStyle( TQLCDNumber::Flat );
+ scoreLCD->setFixedWidth( 150 );
+ scoreLCD->setPalette( pal );
+ hb->addWidget( scoreLCD );
+ hb->addStretch( 10 );
+
+ label = new TQLabel( tr("Level"), mainWin );
+ label->setFont( labelFont );
+ label->setPalette( pal );
+ label->setFixedWidth( label->sizeHint().width() );
+ hb->addWidget( label );
+
+ levelLCD = new TQLCDNumber( 2, mainWin );
+ levelLCD->setFrameStyle( TQFrame::NoFrame );
+ levelLCD->setSegmentStyle( TQLCDNumber::Flat );
+ levelLCD->setFixedWidth( 70 );
+ levelLCD->setPalette( pal );
+ hb->addWidget( levelLCD );
+ hb->addStretch( 10 );
+
+ label = new TQLabel( tr("Ships"), mainWin );
+ label->setFont( labelFont );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hb->addWidget( label );
+
+ shipsLCD = new TQLCDNumber( 1, mainWin );
+ shipsLCD->setFrameStyle( TQFrame::NoFrame );
+ shipsLCD->setSegmentStyle( TQLCDNumber::Flat );
+ shipsLCD->setFixedWidth( 40 );
+ shipsLCD->setPalette( pal );
+ hb->addWidget( shipsLCD );
+
+ hb->addStrut( 30 );
+
+ vb->addWidget( view, 10 );
+
+// -- bottom layout:
+ vb->addLayout( hbd );
+
+ TQFont smallFont( "helvetica", 14 );
+ hbd->addSpacing( 10 );
+
+ TQString sprites_prefix = "qasteroids/sprites/";
+/*
+ label = new TQLabel( tr( "T" ), mainWin );
+ label->setFont( smallFont );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ teleportsLCD = new TQLCDNumber( 1, mainWin );
+ teleportsLCD->setFrameStyle( TQFrame::NoFrame );
+ teleportsLCD->setSegmentStyle( TQLCDNumber::Flat );
+ teleportsLCD->setPalette( pal );
+ teleportsLCD->setFixedHeight( 20 );
+ hbd->addWidget( teleportsLCD );
+
+ hbd->addSpacing( 10 );
+*/
+ TQPixmap pm( sprites_prefix + "powerups/brake.png" );
+ label = new TQLabel( mainWin );
+ label->setPixmap( pm );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ brakesLCD = new TQLCDNumber( 1, mainWin );
+ brakesLCD->setFrameStyle( TQFrame::NoFrame );
+ brakesLCD->setSegmentStyle( TQLCDNumber::Flat );
+ brakesLCD->setPalette( pal );
+ brakesLCD->setFixedHeight( 20 );
+ hbd->addWidget( brakesLCD );
+
+ hbd->addSpacing( 10 );
+
+ pm.load( sprites_prefix + "powerups/shield.png" );
+ label = new TQLabel( mainWin );
+ label->setPixmap( pm );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ shieldLCD = new TQLCDNumber( 1, mainWin );
+ shieldLCD->setFrameStyle( TQFrame::NoFrame );
+ shieldLCD->setSegmentStyle( TQLCDNumber::Flat );
+ shieldLCD->setPalette( pal );
+ shieldLCD->setFixedHeight( 20 );
+ hbd->addWidget( shieldLCD );
+
+ hbd->addSpacing( 10 );
+
+ pm.load( sprites_prefix + "powerups/shoot.png" );
+ label = new TQLabel( mainWin );
+ label->setPixmap( pm );
+ label->setFixedWidth( label->sizeHint().width() );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ shootLCD = new TQLCDNumber( 1, mainWin );
+ shootLCD->setFrameStyle( TQFrame::NoFrame );
+ shootLCD->setSegmentStyle( TQLCDNumber::Flat );
+ shootLCD->setPalette( pal );
+ shootLCD->setFixedHeight( 20 );
+ hbd->addWidget( shootLCD );
+
+ hbd->addStretch( 1 );
+
+ label = new TQLabel( tr( "Fuel" ), mainWin );
+ label->setFont( smallFont );
+ label->setFixedWidth( label->sizeHint().width() + 10 );
+ label->setPalette( pal );
+ hbd->addWidget( label );
+
+ powerMeter = new KALedMeter( mainWin );
+ powerMeter->setFrameStyle( TQFrame::Box | TQFrame::Plain );
+ powerMeter->setRange( MAX_POWER_LEVEL );
+ powerMeter->addColorRange( 10, darkRed );
+ powerMeter->addColorRange( 20, TQColor(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( TQt::Key_Up, Thrust );
+ actions.insert( TQt::Key_Left, RotateLeft );
+ actions.insert( TQt::Key_Right, RotateRight );
+ actions.insert( TQt::Key_Space, Shoot );
+ actions.insert( TQt::Key_Z, Teleport );
+ actions.insert( TQt::Key_X, Brake );
+ actions.insert( TQt::Key_S, Shield );
+ actions.insert( TQt::Key_P, Pause );
+ actions.insert( TQt::Key_L, Launch );
+ actions.insert( TQt::Key_N, NewGame );
+
+ view->showText( tr( "Press N to start playing" ), yellow );
+}
+
+KAstTopLevel::~KAstTopLevel()
+{
+}
+
+void KAstTopLevel::playSound( const char * )
+{
+}
+
+void KAstTopLevel::keyPressEvent( TQKeyEvent *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( TQKeyEvent *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 );
+ TQMessageBox::information( this,
+ tr("KAsteroids is paused"),
+ tr("Paused") );
+ view->pause( FALSE );
+ }
+ break;
+*/
+ default:
+ event->ignore();
+ return;
+ }
+
+ event->accept();
+}
+
+void KAstTopLevel::showEvent( TQShowEvent *e )
+{
+ TQMainWindow::showEvent( e );
+ view->pause( FALSE );
+ view->setFocus();
+}
+
+void KAstTopLevel::hideEvent( TQHideEvent *e )
+{
+ TQMainWindow::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()
+{
+ TQString r( "0.00" );
+ if ( view->shots() )
+ r = TQString::number( (double)view->hits() / view->shots() * 100.0,
+ 'g', 2 );
+
+/* multi-line text broken in TQt 3
+ TQString 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 000000000..158363b08
--- /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 TQLCDNumber;
+
+class KAstTopLevel : public TQMainWindow
+{
+ Q_OBJECT
+public:
+ KAstTopLevel( TQWidget *parent=0, const char *name=0 );
+ virtual ~KAstTopLevel();
+
+private:
+ void playSound( const char *snd );
+ void readSoundMapping();
+ void doStats();
+
+protected:
+ virtual void showEvent( TQShowEvent * );
+ virtual void hideEvent( TQHideEvent * );
+ virtual void keyPressEvent( TQKeyEvent *event );
+ virtual void keyReleaseEvent( TQKeyEvent *event );
+
+private slots:
+ void slotNewGame();
+
+ void slotShipKilled();
+ void slotRockHit( int size );
+ void slotRocksRemoved();
+
+ void slotUpdateVitals();
+
+private:
+ KAsteroidsView *view;
+ TQLCDNumber *scoreLCD;
+ TQLCDNumber *levelLCD;
+ TQLCDNumber *shipsLCD;
+
+ TQLCDNumber *teleportsLCD;
+// TQLCDNumber *bombsLCD;
+ TQLCDNumber *brakesLCD;
+ TQLCDNumber *shieldLCD;
+ TQLCDNumber *shootLCD;
+ KALedMeter *powerMeter;
+
+ bool sound;
+ TQDict<TQString> 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 };
+
+ TQMap<int,Action> actions;
+};
+
+#endif
+
diff --git a/examples/demo/qasteroids/view.cpp b/examples/demo/qasteroids/view.cpp
new file mode 100644
index 000000000..99acca1ff
--- /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( TQWidget *parent, const char *name )
+ : TQWidget( parent, name ),
+ field(640, 440),
+ view(&field,this)
+{
+ view.setVScrollBarMode( TQScrollView::AlwaysOff );
+ view.setHScrollBarMode( TQScrollView::AlwaysOff );
+ view.viewport()->setFocusProxy( this );
+ rocks.setAutoDelete( TRUE );
+ missiles.setAutoDelete( TRUE );
+ bits.setAutoDelete( TRUE );
+ powerups.setAutoDelete( TRUE );
+ exhaust.setAutoDelete( TRUE );
+
+ field.setBackgroundColor( black );
+ TQPixmap pm( IMG_BACKGROUND );
+ field.setBackgroundPixmap( pm );
+
+ textSprite = new TQCanvasText( &field );
+ TQFont font( "helvetica", 18 );
+ textSprite->setFont( font );
+
+ shield = 0;
+ shieldOn = FALSE;
+ refreshRate = REFRESH_DELAY;
+
+ initialized = readSprites();
+
+ shieldTimer = new TQTimer( 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()
+{
+ TQString sprites_prefix = "qasteroids/sprites/";
+
+ int i = 0;
+ while ( kas_animations[i].id )
+ {
+ TQCanvasPixmapArray *anim =
+ new TQCanvasPixmapArray( 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 TQCanvasSprite( 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 TQString &text, const TQColor &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(TQResizeEvent* event)
+{
+ TQWidget::resizeEvent(event);
+ field.resize(width()-4, height()-4);
+ view.resize(width(),height());
+}
+
+// - - -
+
+void KAsteroidsView::timerEvent( TQTimerEvent * )
+{
+ field.advance();
+
+ TQCanvasSprite *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( TQCanvasItem *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( TQCanvasItem *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;
+
+ TQCanvasSprite *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( (TQCanvasSprite *)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.
+ TQPtrListIterator<KMissile> it(missiles);
+
+ for ( ; it.current(); ++it )
+ {
+ missile = it.current();
+ missile->growOlder();
+
+ if ( missile->expired() )
+ {
+ missiles.removeRef( missile );
+ continue;
+ }
+
+ wrapSprite( missile );
+
+ TQCanvasItemList hits = missile->collisions( TRUE );
+ TQCanvasItemList::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 );
+
+ TQCanvasItemList hits = shield->collisions( TRUE );
+ TQCanvasItemList::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();
+ TQCanvasItemList hits = ship->collisions( TRUE );
+ TQCanvasItemList::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;
+ TQPtrListIterator<KPowerup> it( powerups );
+
+ for( ; it.current(); ++it )
+ {
+ pup = it.current();
+ pup->growOlder();
+
+ if( pup->expired() )
+ {
+ powerups.removeRef( pup );
+ continue;
+ }
+
+ wrapSprite( pup );
+
+ TQCanvasItemList hits = pup->collisions( TRUE );
+ TQCanvasItemList::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( TQShowEvent *e )
+{
+#if defined( QT_LICENSE_PROFESSIONAL )
+ static bool wasThere = FALSE;
+
+ if ( !wasThere ) {
+ wasThere = TRUE;
+ TQMessageBox::information( this, tr("TQCanvas demo"),
+ tr("This game has been implemented using the TQCanvas class.\n"
+ "The TQCanvas class is not part of the Professional Edition. Please \n"
+ "contact Trolltech if you want to upgrade to the Enterprise Edition.") );
+ }
+#endif
+
+ TQWidget::showEvent( e );
+}
diff --git a/examples/demo/qasteroids/view.h b/examples/demo/qasteroids/view.h
new file mode 100644
index 000000000..2f2c53b28
--- /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 TQWidget
+{
+ Q_OBJECT
+public:
+ KAsteroidsView( TQWidget *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 TQString &text, const TQColor &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( TQCanvasItem * );
+ void rockHit( TQCanvasItem * );
+ 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( TQResizeEvent *event );
+ virtual void timerEvent( TQTimerEvent * );
+
+ void showEvent( TQShowEvent * );
+
+private:
+ TQCanvas field;
+ TQCanvasView view;
+ TQIntDict<TQCanvasPixmapArray> animation;
+ TQPtrList<TQCanvasSprite> rocks;
+ TQPtrList<KMissile> missiles;
+ TQPtrList<KBit> bits;
+ TQPtrList<KExhaust> exhaust;
+ TQPtrList<KPowerup> powerups;
+ KShield *shield;
+ TQCanvasSprite *ship;
+ TQCanvasText *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;
+
+ TQTimer *shieldTimer;
+ bool initialized;
+};
+
+#endif
diff --git a/examples/demo/qthumbwheel.cpp b/examples/demo/qthumbwheel.cpp
new file mode 100644
index 000000000..5d4127480
--- /dev/null
+++ b/examples/demo/qthumbwheel.cpp
@@ -0,0 +1,301 @@
+/****************************************************************************
+**
+** Definition of TQThumbWheel class
+**
+** Created : 010205
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the widgets module of the TQt 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 TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements 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.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** 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;
+
+TQThumbWheel::TQThumbWheel( TQWidget *parent, const char *name )
+ : TQFrame( parent, name )
+{
+ orient = Vertical;
+ init();
+}
+
+/*!
+ Destructs the wheel.
+*/
+
+TQThumbWheel::~TQThumbWheel()
+{
+}
+
+/*!
+ \internal
+ */
+
+void TQThumbWheel::init()
+{
+ track = TRUE;
+ mousePressed = FALSE;
+ pressedAt = -1;
+ rat = 1.0;
+ setFrameStyle( WinPanel | Sunken );
+ setMargin( 2 );
+ setFocusPolicy( WheelFocus );
+}
+
+void TQThumbWheel::setOrientation( Orientation orientation )
+{
+ orient = orientation;
+ update();
+}
+
+void TQThumbWheel::setTracking( bool enable )
+{
+ track = enable;
+}
+
+void TQThumbWheel::setTransmissionRatio( double r )
+{
+ rat = r;
+}
+
+/*!
+ Makes TQRangeControl::setValue() available as a slot.
+*/
+
+void TQThumbWheel::setValue( int value )
+{
+ TQRangeControl::setValue( value );
+}
+
+void TQThumbWheel::valueChange()
+{
+ repaint( FALSE );
+ emit valueChanged(value());
+}
+
+void TQThumbWheel::rangeChange()
+{
+}
+
+void TQThumbWheel::stepChange()
+{
+}
+
+/*!
+ \reimp
+*/
+
+void TQThumbWheel::keyPressEvent( TQKeyEvent *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 TQThumbWheel::mousePressEvent( TQMouseEvent *e )
+{
+ if ( e->button() == LeftButton ) {
+ mousePressed = TRUE;
+ pressedAt = valueFromPosition( e->pos() );
+ }
+}
+
+/*!
+ \reimp
+*/
+
+void TQThumbWheel::mouseReleaseEvent( TQMouseEvent *e )
+{
+ int movedTo = valueFromPosition( e->pos() );
+ setValue( value() + movedTo - pressedAt );
+ pressedAt = movedTo;
+}
+
+/*!
+ \reimp
+*/
+
+void TQThumbWheel::mouseMoveEvent( TQMouseEvent *e )
+{
+ if ( !mousePressed )
+ return;
+ if ( track ) {
+ int movedTo = valueFromPosition( e->pos() );
+ setValue( value() + movedTo - pressedAt );
+ pressedAt = movedTo;
+ }
+}
+
+/*!
+ \reimp
+*/
+
+void TQThumbWheel::wheelEvent( TQWheelEvent *e )
+{
+ int step = ( e->state() & ControlButton ) ? lineStep() : pageStep();
+ setValue( value() - e->delta()*step/120 );
+ e->accept();
+}
+
+/*!\reimp
+*/
+
+void TQThumbWheel::focusInEvent( TQFocusEvent *e )
+{
+ TQWidget::focusInEvent( e );
+}
+
+/*!\reimp
+*/
+
+void TQThumbWheel::focusOutEvent( TQFocusEvent *e )
+{
+ TQWidget::focusOutEvent( e );
+}
+
+void TQThumbWheel::drawContents( TQPainter *p )
+{
+ TQRect cr = contentsRect();
+ // double buffer
+ TQPixmap pix( width(), height() );
+ TQPainter pt( &pix );
+ TQBrush brush = backgroundPixmap() ?
+ TQBrush( backgroundColor(), *backgroundPixmap() ) : TQBrush( 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);
+ TQPen pen0( colorGroup().midlight() );
+ TQPen 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 TQThumbWheel::valueFromPosition( const TQPoint &p )
+{
+ TQRect 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 000000000..9986194f4
--- /dev/null
+++ b/examples/demo/qthumbwheel.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Definition of TQThumbWheel class
+**
+** Created : 010205
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the widgets module of the TQt 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 TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements 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.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** 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 TQTHUMBWHEEL_H
+#define TQTHUMBWHEEL_H
+
+#ifndef QT_H
+#include "qframe.h"
+#include "qrangecontrol.h"
+#endif // QT_H
+
+#ifndef QT_NO_THUMBWHEEL
+
+class TQThumbWheel : public TQFrame, public TQRangeControl
+{
+ Q_OBJECT
+
+public:
+ TQThumbWheel( TQWidget *parent=0, const char *name=0 );
+ ~TQThumbWheel();
+
+ 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( TQKeyEvent * );
+ void mousePressEvent( TQMouseEvent * );
+ void mouseReleaseEvent( TQMouseEvent * );
+ void mouseMoveEvent( TQMouseEvent * );
+ void wheelEvent( TQWheelEvent * );
+ void focusInEvent( TQFocusEvent *e );
+ void focusOutEvent( TQFocusEvent *e );
+
+ void drawContents( TQPainter * );
+
+private:
+ void init();
+ int valueFromPosition( const TQPoint & );
+
+
+ double rat;
+ int pressedAt;
+ Orientation orient;
+ uint track : 1;
+ uint mousePressed : 1;
+
+ class TQThumbWheelPrivate;
+ TQThumbWheelPrivate *d;
+};
+
+inline TQThumbWheel::Orientation TQThumbWheel::orientation() const
+{
+ return orient;
+}
+
+inline bool TQThumbWheel::tracking() const
+{
+ return (bool)track;
+}
+
+inline double TQThumbWheel::transmissionRatio() const
+{
+ return rat;
+}
+
+#endif // QT_NO_WHEEL
+
+#endif // TQWHEEL_H
diff --git a/examples/demo/sql/book.sql b/examples/demo/sql/book.sql
new file mode 100644
index 000000000..417ef4347
--- /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 000000000..ee875f318
--- /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="TQDialog">
+ <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="TQGroupBox">
+ <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="TQLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>editDatabase</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" 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="TQLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>editPassword</cstring>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ </widget>
+ <widget class="TQLabel" 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="TQLabel" 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="TQComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>comboDriver</cstring>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>editUsername</cstring>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>editHostname</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" 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="TQLabel" 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="TQSpinBox" 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="TQLabel" 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="TQLayoutWidget">
+ <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="TQPushButton">
+ <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="TQPushButton">
+ <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 000000000..cc1bce9bf
--- /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 TQt 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( TQSqlDatabase::drivers() );
+}
+
+void ConnectDialog::destroy()
+{
+
+}
diff --git a/examples/demo/sql/sqlex.ui b/examples/demo/sql/sqlex.ui
new file mode 100644
index 000000000..a7e972f8f
--- /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="TQWidget">
+ <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="TQSplitter">
+ <property name="name">
+ <cstring>vsplit</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="TQSplitter">
+ <property name="name">
+ <cstring>hsplit</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="TQListView">
+ <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>Retquired</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="TQDataTable">
+ <property name="name">
+ <cstring>dt</cstring>
+ </property>
+ <property name="frameworkCode" stdset="0">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="TQGroupBox">
+ <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="TQLayoutWidget" 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="TQTextEdit">
+ <property name="name">
+ <cstring>te</cstring>
+ </property>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <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="TQPushButton">
+ <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="TQPushButton">
+ <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="TQLayoutWidget">
+ <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="TQLabel">
+ <property name="name">
+ <cstring>lbl</cstring>
+ </property>
+ <property name="text">
+ <string>Press "Connect" to open a database</string>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <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(TQListViewItem*)</signal>
+ <receiver>SqlEx</receiver>
+ <slot>showTable(TQListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>lv</sender>
+ <signal>doubleClicked(TQListViewItem*)</signal>
+ <receiver>SqlEx</receiver>
+ <slot>showTable(TQListViewItem*)</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( TQListViewItem * 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 000000000..b8e88ca91
--- /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 TQt 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 TQSqlError& err, TQWidget* parent = 0 )
+{
+ TQString errStr ( "The database reported an error\n" );
+ if ( !err.databaseText().isEmpty() )
+ errStr += err.databaseText();
+ if ( !err.driverText().isEmpty() )
+ errStr += err.driverText();
+ TQMessageBox::warning( parent, "Error", errStr );
+}
+
+ConnectDialog* conDiag = 0;
+
+void SqlEx::init()
+{
+ hsplit->setResizeMode( lv, TQSplitter::KeepSize );
+ vsplit->setResizeMode( gb, TQSplitter::KeepSize );
+ submitBtn->setEnabled( FALSE );
+ conDiag = new ConnectDialog( this, "Connection Dialog", TRUE );
+}
+
+void SqlEx::dbConnect()
+{
+ if ( conDiag->exec() != TQDialog::Accepted )
+ return;
+ if ( dt->sqlCursor() ) {
+ dt->setSqlCursor( 0 );
+ }
+ // close old connection (if any)
+ if ( TQSqlDatabase::contains( "SqlEx" ) ) {
+ TQSqlDatabase* oldDb = TQSqlDatabase::database( "SqlEx" );
+ oldDb->close();
+ TQSqlDatabase::removeDatabase( "SqlEx" );
+ }
+ // open the new connection
+ TQSqlDatabase* db = TQSqlDatabase::addDatabase( conDiag->comboDriver->currentText(), "SqlEx" );
+ if ( !db ) {
+ TQMessageBox::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();
+
+ TQStringList tables = db->tables();
+ for ( TQStringList::Iterator it = tables.begin(); it != tables.end(); ++it ) {
+ TQListViewItem* lvi = new TQListViewItem( lv, *it );
+ TQSqlRecordInfo ri = db->recordInfo ( *it );
+ for ( TQSqlRecordInfo::Iterator it = ri.begin(); it != ri.end(); ++it ) {
+ TQString req;
+ if ( (*it).isRetquired() > 0 ) {
+ req = "Yes";
+ } else if ( (*it).isRetquired() == 0 ) {
+ req = "No";
+ } else {
+ req = "?";
+ }
+ TQListViewItem* fi = new TQListViewItem( lvi, (*it).name(), + TQVariant::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
+ TQSqlSelectCursor* cursor = new TQSqlSelectCursor( te->text(), TQSqlDatabase::database( "SqlEx", TRUE ) );
+ if ( cursor->isSelect() ) {
+ dt->setSqlCursor( cursor, TRUE, TRUE );
+ dt->setSort( TQStringList() );
+ dt->refresh( TQDataTable::RefreshAll );
+ TQString txt( "Query OK" );
+ if ( cursor->size() >= 0 )
+ txt += ", returned rows: " + TQString::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( TQString("Query OK, affected rows: %1").arg( cursor->numRowsAffected() ) );
+ }
+ }
+}
+
+void SqlEx::showTable( TQListViewItem * item )
+{
+ // get the table name
+ TQListViewItem* i = item->parent();
+ if ( !i ) {
+ i = item;
+ }
+
+ // populate the data table
+ TQSqlCursor* cursor = new TQSqlCursor( i->text( 0 ), TRUE, TQSqlDatabase::database( "SqlEx", TRUE ) );
+ dt->setSqlCursor( cursor, TRUE, TRUE );
+ dt->setSort( cursor->primaryIndex() );
+ dt->refresh( TQDataTable::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 000000000..7674ab0f0
--- /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 000000000..2f931cb2e
--- /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 000000000..54c8e1440
--- /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 000000000..9f0491ddc
--- /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 000000000..50605f276
--- /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 000000000..b1b7f8537
--- /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 000000000..f15725170
--- /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 000000000..211838dac
--- /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>TQt Toolkit - TQLabel 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>TQLabel Class Reference</h1><br clear="all">
+<p>
+The TQLabel 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">TQFrame</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>TQLabel</b></a> ( QWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#2bafbb"><b>TQLabel</b></a> ( const QString &amp; text, TQWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#5514c7"><b>TQLabel</b></a> ( QWidget * buddy, const QString &amp;, TQWidget * parent, const char * name=0, WFlags f=0 ) </div>
+<li><div class="fn"><a href="#9958af"><b>~TQLabel</b></a> () </div>
+<li><div class="fn">TQString <a href="#72cf09"><b>text</b></a> () const</div>
+<li><div class="fn">TQPixmap* <a href="#101ecb"><b>pixmap</b></a> () const</div>
+<li><div class="fn">TQMovie* <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">TQWidget* <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>TQString<td>text<td>text<td>setText<td>&nbsp;
+<tr><td>TextFormat<td>textFormat<td>textFormat<td>setTextFormat<td>&nbsp;
+<tr><td>TQPixmap<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 TQLabel widget provides a static information display
+<p>
+TQLabel 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 TQLabel can contain any of the following content types:
+<ul>
+<li> A plain text: set by passing a <a href="qstring.html">TQString</a> to <a href="#dffb43">setText</a>().
+<li> A rich text: set by passing a TQString that contains a rich text to setText().
+<li> A pixmap: set by passing a <a href="qpixmap.html">TQPixmap</a> to <a href="#f3f301">setPixmap</a>().
+<li> A movie: set by passing a <a href="qmovie.html">TQMovie</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 TQLabel can be tuned in several ways. All the settings
+of <a href="qframe.html">TQFrame</a> are available for specifying a widget frame. The
+positioning of the content within the TQLabel 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">TQLabel</a> *label = new <a href="qlabel.html">TQLabel</a>;
+ label-&gt;<a href="qframe.html#c0d758">setFrameStyle</a>( TQFrame::Panel | TQFrame::Sunken );
+ label-&gt;<a href="#dffb43">setText</a>( "first line\nsecond line" );
+ label-&gt;<a href="#1f406e">setAlignment</a>( AlignBottom | AlignRight );
+</pre>
+<p>A TQLabel is often used as a label for another, interactive
+widget. For this use, TQLabel provides a handy mechanism for adding
+an accelerator key (see <a href="qaccel.html">TQAccel</a>) that will set the keyboard focus to
+the other widget (called the TQLabel's "buddy"). Example:
+<p><pre> <a href="qlineedit.html">TQLineEdit</a>* phoneEdit = new <a href="qlineedit.html">TQLineEdit</a>( this, "phoneEdit" );
+ <a href="qlabel.html">TQLabel</a>* phoneLabel = new <a href="qlabel.html">TQLabel</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">TQLineEdit</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">TQLineEdit</a>, <a href="qtextview.html">TQTextView</a>, <a href="qpixmap.html">TQPixmap</a>, <a href="qmovie.html">TQMovie</a> and <a href="guibooks.html#fowler">GUI Design Handbook: Label</a>
+<p>Examples:
+ <a href="cursor-cursor-cpp.html#TQLabel">cursor/cursor.cpp</a>
+ <a href="layout-layout-cpp.html#TQLabel">layout/layout.cpp</a>
+ <a href="popup-popup-cpp.html#TQLabel">popup/popup.cpp</a>
+ <a href="menu-menu-cpp.html#TQLabel">menu/menu.cpp</a>
+ <a href="progress-progress-cpp.html#TQLabel">progress/progress.cpp</a>
+ <a href="qmag-qmag-cpp.html#TQLabel">qmag/qmag.cpp</a>
+ <a href="movies-main-cpp.html#TQLabel">movies/main.cpp</a>
+ <a href="customlayout-main-cpp.html#TQLabel">customlayout/main.cpp</a>
+
+<hr><h2>Member Function Documentation</h2>
+<h3 class="fn"><a name="5514c7"></a>TQLabel::TQLabel ( <a href="qwidget.html">TQWidget</a> * buddy, const <a href="qstring.html">TQString</a> &amp; text, <a href="qwidget.html">TQWidget</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">TQFrame</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>TQLabel::TQLabel ( <a href="qwidget.html">TQWidget</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">TQFrame</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>TQLabel::TQLabel ( const <a href="qstring.html">TQString</a> &amp; text, <a href="qwidget.html">TQWidget</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">TQFrame</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>TQLabel::~TQLabel ()</h3>
+<p>Destructs the label.
+<h3 class="fn">int <a name="2fcaa3"></a>TQLabel::alignment () const</h3>
+<p>Returns the alignment setting.
+<p>See also <a href="#1f406e">setAlignment</a>().
+<h3 class="fn">bool <a name="75b2a1"></a>TQLabel::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 TQt. 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">TQWidget</a> * <a name="123954"></a>TQLabel::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>TQLabel::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>TQLabel::drawContents ( <a href="qpainter.html">TQPainter</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">TQFrame.</a>
+<h3 class="fn">void <a name="479dd2"></a>TQLabel::drawContentsMask ( <a href="qpainter.html">TQPainter</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">TQWidget::setAutoMask</a>();.
+<p>Reimplemented from <a href="qframe.html#4cbf11">TQFrame.</a>
+<h3 class="fn">void <a name="0435a2"></a>TQLabel::fontChange ( const <a href="qfont.html">TQFont</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">TQWidget.</a>
+<h3 class="fn">bool <a name="7e1f73"></a>TQLabel::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>TQLabel::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">TQWidget.</a>
+<h3 class="fn">int <a name="e3c907"></a>TQLabel::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">TQSize</a> <a name="53c8c7"></a>TQLabel::minimumSizeHint () const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#3f0fc2">TQWidget.</a>
+<h3 class="fn"><a href="qmovie.html">TQMovie</a>* <a name="7dcdfe"></a>TQLabel::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">TQPixmap</a> * <a name="101ecb"></a>TQLabel::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>TQLabel::resizeEvent ( <a href="qresizeevent.html">TQResizeEvent</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">TQWidget.</a>
+<h3 class="fn">void <a name="1f406e"></a>TQLabel::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">TQt::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">TQt::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>TQLabel::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">TQWidget.</a>
+<h3 class="fn">void <a name="c0e104"></a>TQLabel::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 TQt. 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 TQLabel widgets that are not managed by
+a <a href="qlayout.html">TQLayout</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>TQLabel::setBuddy ( <a href="qwidget.html">TQWidget</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 TQLabels 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">TQLineEdit</a> *nameEd = new <a href="qlineedit.html">TQLineEdit</a>( this );
+ <a href="qlabel.html">TQLabel</a> *nameLb = new <a href="qlabel.html">TQLabel</a>( "&amp;Name:", this );
+ nameLb-&gt;<a href="#191701">setBuddy</a>( nameEd );
+ <a href="qlineedit.html">TQLineEdit</a> *phoneEd = new <a href="qlineedit.html">TQLineEdit</a>( this );
+ <a href="qlabel.html">TQLabel</a> *phoneLb = new <a href="qlabel.html">TQLabel</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">TQAccel</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>TQLabel::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>TQLabel::setMovie ( const <a href="qmovie.html">TQMovie</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>TQLabel::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">TQString::setNum</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="301e3c"></a>TQLabel::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">TQString::setNum</a>() and <a href="#191701">setBuddy</a>().
+<h3 class="fn">void <a name="f3f301"></a>TQLabel::setPixmap ( const <a href="qpixmap.html">TQPixmap</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>TQLabel::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>TQLabel::setText ( const <a href="qstring.html">TQString</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. TQLabel 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">TQTextView</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>TQLabel::setTextFormat ( <a href="qt.html#TextFormat">TQt::TextFormat</a> format )</h3>
+<p>Sets the text format to <em>format.</em> See the <a href="qt.html#TextFormat">TQt::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">TQSize</a> <a name="614dd5"></a>TQLabel::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">TQWidget.</a>
+<h3 class="fn"><a href="qsizepolicy.html">TQSizePolicy</a> <a name="26e1d9"></a>TQLabel::sizePolicy () const <code>[virtual]</code></h3>
+<p>Reimplemented for internal reasons; the API is not affected.
+<p>Reimplemented from <a href="qwidget.html#2d5d13">TQWidget.</a>
+<h3 class="fn"><a href="qstring.html">TQString</a> <a name="72cf09"></a>TQLabel::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">TQt::TextFormat <a name="0b92ed"></a>TQLabel::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">TQt 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">TQt 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 000000000..be963bf86
--- /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 000000000..6077b815f
--- /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 000000000..a1cb03dd0
--- /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 000000000..2ab2c25d7
--- /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 000000000..de353df7d
--- /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 TQt. 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 TQString& home_, const TQString& _path,
+ TQWidget* parent, const char *name )
+ : TQMainWindow( parent, name, WDestructiveClose ),
+ pathCombo( 0 ), selectedURL()
+{
+ readHistory();
+ readBookmarks();
+
+ browser = new TQTextBrowser( this );
+ browser->mimeSourceFactory()->setFilePath( _path );
+ browser->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+ connect( browser, SIGNAL( textChanged() ),
+ this, SLOT( textChanged() ) );
+
+ setCentralWidget( browser );
+
+ if ( !home_.isEmpty() )
+ browser->setSource( home_ );
+
+ connect( browser, SIGNAL( highlighted( const TQString&) ),
+ statusBar(), SLOT( message( const TQString&)) );
+
+ resize( 640,700 );
+
+ TQPopupMenu* file = new TQPopupMenu( 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.
+ TQIconSet icon_back( TQPixmap("textdrawing/previous.png") );
+ TQIconSet icon_forward( TQPixmap("textdrawing/next.png") );
+ TQIconSet icon_home( TQPixmap("textdrawing/home.png") );
+
+ TQPopupMenu* go = new TQPopupMenu( 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 TQPopupMenu( this );
+ TQStringList::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 TQPopupMenu( this );
+ bookm->insertItem( tr( "Add Bookmark" ), this, SLOT( addBookmark() ) );
+ bookm->insertSeparator();
+
+ TQStringList::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 ) ) );
+
+
+ TQToolBar* toolbar = new TQToolBar( this );
+ addToolBar( toolbar, "Toolbar");
+ TQToolButton* button;
+
+ button = new TQToolButton( icon_back, tr("Backward"), "", browser, SLOT(backward()), toolbar );
+ connect( browser, SIGNAL( backwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+ button->setEnabled( FALSE );
+ button = new TQToolButton( icon_forward, tr("Forward"), "", browser, SLOT(forward()), toolbar );
+ connect( browser, SIGNAL( forwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+ button->setEnabled( FALSE );
+ button = new TQToolButton( icon_home, tr("Home"), "", browser, SLOT(home()), toolbar );
+
+ toolbar->addSeparator();
+
+ pathCombo = new TQComboBox( TRUE, toolbar );
+ connect( pathCombo, SIGNAL( activated( const TQString & ) ),
+ this, SLOT( pathSelected( const TQString & ) ) );
+ 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 = TQString::null;
+ }
+}
+
+HelpWindow::~HelpWindow()
+{
+ history.clear();
+ TQMap<int, TQString>::Iterator it = mHistory.begin();
+ for ( ; it != mHistory.end(); ++it )
+ history.append( *it );
+
+ TQFile f( TQDir::currentDirPath() + "/.history" );
+ f.open( IO_WriteOnly );
+ TQDataStream s( &f );
+ s << history;
+ f.close();
+
+ bookmarks.clear();
+ TQMap<int, TQString>::Iterator it2 = mBookmarks.begin();
+ for ( ; it2 != mBookmarks.end(); ++it2 )
+ bookmarks.append( *it2 );
+
+ TQFile f2( TQDir::currentDirPath() + "/.bookmarks" );
+ f2.open( IO_WriteOnly );
+ TQDataStream s2( &f2 );
+ s2 << bookmarks;
+ f2.close();
+}
+
+void HelpWindow::about()
+{
+ TQMessageBox::about( this, "HelpViewer Example",
+ "<p>This example implements a simple HTML help viewer "
+ "using TQt's rich text capabilities</p>"
+ "<p>It's just about 100 lines of C++ code, so don't expect too much :-)</p>"
+ );
+}
+
+
+void HelpWindow::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQBrowser" );
+}
+
+void HelpWindow::openFile()
+{
+#ifndef QT_NO_FILEDIALOG
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::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
+ TQPrinter printer;
+ printer.setFullPage(TRUE);
+ if ( printer.setup() ) {
+ TQPainter p( &printer );
+ TQPaintDeviceMetrics metrics(p.device());
+ int dpix = metrics.logicalDpiX();
+ int dpiy = metrics.logicalDpiY();
+ const int margin = 72; // pt
+ TQRect body(margin*dpix/72, margin*dpiy/72,
+ metrics.width()-margin*dpix/72*2,
+ metrics.height()-margin*dpiy/72*2 );
+ TQFont font("times", 10);
+ TQStringList filePaths = browser->mimeSourceFactory()->filePath();
+ TQString file;
+ TQStringList::Iterator it = filePaths.begin();
+ for ( ; it != filePaths.end(); ++it ) {
+ file = TQUrl( *it, TQUrl( browser->source() ).path() ).path();
+ if ( TQFile::exists( file ) )
+ break;
+ else
+ file = TQString::null;
+ }
+ if ( file.isEmpty() )
+ return;
+ TQFile f( file );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+ TQTextStream ts( &f );
+ TQSimpleRichText richText( ts.read(), font, browser->context(), browser->styleSheet(),
+ browser->mimeSourceFactory(), body.height() );
+ richText.setWidth( &p, body.width() );
+ TQRect 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( TQString::number(page) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, TQString::number(page) );
+ if ( view.top() >= richText.height() )
+ break;
+ printer.newPage();
+ page++;
+ } while (TRUE);
+ }
+#endif
+}
+
+void HelpWindow::pathSelected( const TQString &_path )
+{
+ browser->setSource( _path );
+ TQMap<int, TQString>::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 ( TQFile::exists( TQDir::currentDirPath() + "/.history" ) ) {
+ TQFile f( TQDir::currentDirPath() + "/.history" );
+ f.open( IO_ReadOnly );
+ TQDataStream s( &f );
+ s >> history;
+ f.close();
+ while ( history.count() > 20 )
+ history.remove( history.begin() );
+ }
+}
+
+void HelpWindow::readBookmarks()
+{
+ if ( TQFile::exists( TQDir::currentDirPath() + "/.bookmarks" ) ) {
+ TQFile f( TQDir::currentDirPath() + "/.bookmarks" );
+ f.open( IO_ReadOnly );
+ TQDataStream 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 000000000..0115da9fc
--- /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 TQt. 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 TQComboBox;
+class TQPopupMenu;
+
+class HelpWindow : public TQMainWindow
+{
+ Q_OBJECT
+public:
+ HelpWindow( const TQString& home_, const TQString& path, TQWidget* parent = 0, const char *name=0 );
+ ~HelpWindow();
+
+private slots:
+ void setBackwardAvailable( bool );
+ void setForwardAvailable( bool );
+
+ void textChanged();
+ void about();
+ void aboutTQt();
+ void openFile();
+ void newWindow();
+ void print();
+
+ void pathSelected( const TQString & );
+ void histChosen( int );
+ void bookmChosen( int );
+ void addBookmark();
+
+private:
+ void readHistory();
+ void readBookmarks();
+
+ TQTextBrowser* browser;
+ TQComboBox *pathCombo;
+ int backwardId, forwardId;
+ TQString selectedURL;
+ TQStringList history, bookmarks;
+ TQMap<int, TQString> mHistory, mBookmarks;
+ TQPopupMenu *hist, *bookm;
+
+};
+
+
+
+
+
+#endif
+
diff --git a/examples/demo/textdrawing/home.png b/examples/demo/textdrawing/home.png
new file mode 100644
index 000000000..aa150a32c
--- /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 000000000..4b29ff454
--- /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 000000000..4e3556c8d
--- /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 000000000..57e3e532f
--- /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 000000000..bae07d3eb
--- /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 000000000..7b5be472a
--- /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 000000000..5c68b09ce
--- /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 000000000..57949a7a7
--- /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 TQt. 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( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name, 0 )
+{
+ setupFileActions();
+ setupEditActions();
+ setupTextActions();
+
+ tabWidget = new TQTabWidget( this );
+ connect( tabWidget, SIGNAL( currentChanged( TQWidget * ) ),
+ this, SLOT( editorChanged( TQWidget * ) ) );
+ setCentralWidget( tabWidget );
+}
+
+void TextEdit::setupFileActions()
+{
+ TQToolBar *tb = new TQToolBar( this );
+ TQPopupMenu *menu = new TQPopupMenu( this );
+ menuBar()->insertItem( tr( "&File" ), menu );
+
+ TQAction *a;
+ a = new TQAction( tr( "New" ), TQPixmap( "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 TQAction( tr( "Open" ), TQPixmap( "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 TQAction( tr( "Save" ), TQPixmap( "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 TQAction( tr( "Save As" ), TQPixmap(), tr( "Save &As..." ), 0, this, "fileSaveAs" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) );
+ a->addTo( menu );
+ menu->insertSeparator();
+ a = new TQAction( tr( "Print" ), TQPixmap( "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 TQAction( tr( "Close" ), TQPixmap(), tr( "&Close" ), 0, this, "fileClose" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) );
+ a->addTo( menu );
+}
+
+void TextEdit::setupEditActions()
+{
+ TQToolBar *tb = new TQToolBar( this );
+ TQPopupMenu *menu = new TQPopupMenu( this );
+ menuBar()->insertItem( tr( "&Edit" ), menu );
+
+ TQAction *a;
+ a = new TQAction( tr( "Undo" ), TQPixmap( "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 TQAction( tr( "Redo" ), TQPixmap( "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 TQAction( tr( "Cut" ), TQPixmap( "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 TQAction( tr( "Copy" ), TQPixmap( "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 TQAction( tr( "Paste" ), TQPixmap( "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()
+{
+ TQToolBar *tb = new TQToolBar( this );
+ TQPopupMenu *menu = new TQPopupMenu( this );
+ menuBar()->insertItem( tr( "For&mat" ), menu );
+
+ comboStyle = new TQComboBox( 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 TQComboBox( TRUE, tb );
+ TQFontDatabase db;
+ comboFont->insertStringList( db.families() );
+ connect( comboFont, SIGNAL( activated( const TQString & ) ),
+ this, SLOT( textFamily( const TQString & ) ) );
+ comboFont->lineEdit()->setText( TQApplication::font().family() );
+
+ comboSize = new TQComboBox( TRUE, tb );
+ TQValueList<int> sizes = db.standardSizes();
+ TQValueList<int>::Iterator it = sizes.begin();
+ for ( ; it != sizes.end(); ++it )
+ comboSize->insertItem( TQString::number( *it ) );
+ connect( comboSize, SIGNAL( activated( const TQString & ) ),
+ this, SLOT( textSize( const TQString & ) ) );
+ comboSize->lineEdit()->setText( TQString::number( TQApplication::font().pointSize() ) );
+
+ actionTextBold = new TQAction( tr( "Bold" ), TQPixmap( "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 TQAction( tr( "Italic" ), TQPixmap( "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 TQAction( tr( "Underline" ), TQPixmap( "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();
+
+ TQActionGroup *grp = new TQActionGroup( this );
+ grp->setExclusive( TRUE );
+ connect( grp, SIGNAL( selected( TQAction* ) ), this, SLOT( textAlign( TQAction* ) ) );
+
+ actionAlignLeft = new TQAction( tr( "Left" ), TQPixmap( "textdrawing/textleft.png" ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" );
+ actionAlignLeft->addTo( tb );
+ actionAlignLeft->addTo( menu );
+ actionAlignLeft->setToggleAction( TRUE );
+ actionAlignCenter = new TQAction( tr( "Center" ), TQPixmap( "textdrawing/textcenter.png" ), tr( "C&enter" ), CTRL + Key_M, grp, "textCenter" );
+ actionAlignCenter->addTo( tb );
+ actionAlignCenter->addTo( menu );
+ actionAlignCenter->setToggleAction( TRUE );
+ actionAlignRight = new TQAction( tr( "Right" ), TQPixmap( "textdrawing/textright.png" ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" );
+ actionAlignRight->addTo( tb );
+ actionAlignRight->addTo( menu );
+ actionAlignRight->setToggleAction( TRUE );
+ actionAlignJustify = new TQAction( tr( "Justify" ), TQPixmap( "textdrawing/textjustify.png" ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" );
+ actionAlignJustify->addTo( tb );
+ actionAlignJustify->addTo( menu );
+ actionAlignJustify->setToggleAction( TRUE );
+
+ menu->insertSeparator();
+
+ TQPixmap pix( 16, 16 );
+ pix.fill( black );
+ actionTextColor = new TQAction( 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 TQString &f )
+{
+ if ( !TQFile::exists( f ) )
+ return;
+ TQTextEdit *edit = new TQTextEdit( tabWidget );
+ doConnections( edit );
+ tabWidget->addTab( edit, TQFileInfo( f ).fileName() );
+
+ TQFile fl( f );
+ fl.open( IO_ReadOnly );
+ TQByteArray array = fl.readAll();
+ array.resize( array.size() +1 );
+ array[ (int)array.size() - 1 ] = '\0';
+ TQString text = ( f.find( "bidi.txt" ) != -1 ? TQString::fromUtf8( array.data() ) : TQString::fromLatin1( array.data() ) );
+ edit->setText( text );
+
+ edit->viewport()->setFocus();
+ edit->setTextFormat( TQt::RichText );
+}
+
+TQTextEdit *TextEdit::currentEditor() const
+{
+ if ( tabWidget->currentPage() &&
+ tabWidget->currentPage()->inherits( "TQTextEdit" ) )
+ return (TQTextEdit*)tabWidget->currentPage();
+ return 0;
+}
+
+void TextEdit::doConnections( TQTextEdit *e )
+{
+ connect( e, SIGNAL( currentFontChanged( const TQFont & ) ),
+ this, SLOT( fontChanged( const TQFont & ) ) );
+ connect( e, SIGNAL( currentColorChanged( const TQColor & ) ),
+ this, SLOT( colorChanged( const TQColor & ) ) );
+ connect( e, SIGNAL( currentAlignmentChanged( int ) ),
+ this, SLOT( alignmentChanged( int ) ) );
+}
+
+void TextEdit::fileNew()
+{
+ TQTextEdit *edit = new TQTextEdit( tabWidget );
+ doConnections( edit );
+ tabWidget->addTab( edit, tr( "noname" ) );
+ tabWidget->showPage( edit );
+ edit->viewport()->setFocus();
+}
+
+void TextEdit::fileOpen()
+{
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+ if ( !fn.isEmpty() )
+ load( fn );
+}
+
+void TextEdit::fileSave()
+{
+ if ( !currentEditor() )
+ return;
+ TQString fn;
+ if ( filenames.find( currentEditor() ) == filenames.end() ) {
+ fileSaveAs();
+ } else {
+ TQFile file( *filenames.find( currentEditor() ) );
+ if ( !file.open( IO_WriteOnly ) )
+ return;
+ TQTextStream ts( &file );
+ ts << currentEditor()->text();
+ }
+}
+
+void TextEdit::fileSaveAs()
+{
+ if ( !currentEditor() )
+ return;
+ TQString fn = TQFileDialog::getSaveFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+ if ( !fn.isEmpty() ) {
+ filenames.replace( currentEditor(), fn );
+ fileSave();
+ tabWidget->setTabLabel( currentEditor(), TQFileInfo( fn ).fileName() );
+ }
+}
+
+void TextEdit::filePrint()
+{
+ if ( !currentEditor() )
+ return;
+#ifndef QT_NO_PRINTER
+ TQPrinter printer;
+ printer.setFullPage(TRUE);
+ TQPaintDeviceMetrics screen( this );
+ printer.setResolution( screen.logicalDpiY() );
+ if ( printer.setup( this ) ) {
+ TQPainter p( &printer );
+ TQPaintDeviceMetrics metrics( p.device() );
+ int dpix = metrics.logicalDpiX();
+ int dpiy = metrics.logicalDpiY();
+ const int margin = 72; // pt
+ TQRect body( margin * dpix / 72, margin * dpiy / 72,
+ metrics.width() - margin * dpix / 72 * 2,
+ metrics.height() - margin * dpiy / 72 * 2 );
+ TQFont font( "times", 10 );
+ TQSimpleRichText richText( currentEditor()->text(), font, currentEditor()->context(), currentEditor()->styleSheet(),
+ currentEditor()->mimeSourceFactory(), body.height() );
+ richText.setWidth( &p, body.width() );
+ TQRect 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( TQString::number( page ) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, TQString::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->tquit();
+}
+
+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 TQString &f )
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setFamily( f );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textSize( const TQString &p )
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setPointSize( p.toInt() );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textStyle( int i )
+{
+ if ( !currentEditor() )
+ return;
+ if ( i == 0 )
+ currentEditor()->setParagType( TQStyleSheetItem::DisplayBlock, TQStyleSheetItem::ListDisc );
+ else if ( i == 1 )
+ currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListDisc );
+ else if ( i == 2 )
+ currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListCircle );
+ else if ( i == 3 )
+ currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListSquare );
+ else if ( i == 4 )
+ currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListDecimal );
+ else if ( i == 5 )
+ currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListLowerAlpha );
+ else if ( i == 6 )
+ currentEditor()->setParagType( TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListUpperAlpha );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textColor()
+{
+ if ( !currentEditor() )
+ return;
+ TQColor col = TQColorDialog::getColor( currentEditor()->color(), this );
+ if ( !col.isValid() )
+ return;
+ currentEditor()->setColor( col );
+ TQPixmap pix( 16, 16 );
+ pix.fill( col );
+ actionTextColor->setIconSet( pix );
+}
+
+void TextEdit::textAlign( TQAction *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 TQFont &f )
+{
+ comboFont->lineEdit()->setText( f.family() );
+ comboSize->lineEdit()->setText( TQString::number( f.pointSize() ) );
+ actionTextBold->setOn( f.bold() );
+ actionTextItalic->setOn( f.italic() );
+ actionTextUnderline->setOn( f.underline() );
+}
+
+void TextEdit::colorChanged( const TQColor &c )
+{
+ TQPixmap 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( TQWidget * )
+{
+ 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 000000000..38c9c5b2d
--- /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 TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TEXTEDIT_H
+#define TEXTEDIT_H
+
+#include <qmainwindow.h>
+#include <qmap.h>
+
+class TQAction;
+class TQComboBox;
+class TQTabWidget;
+class TQTextEdit;
+
+class TextEdit : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ TextEdit( TQWidget *parent = 0, const char *name = 0 );
+
+ TQTextEdit *currentEditor() const;
+ void load( const TQString &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 TQString &f );
+ void textSize( const TQString &p );
+ void textStyle( int s );
+ void textColor();
+ void textAlign( TQAction *a );
+
+ void fontChanged( const TQFont &f );
+ void colorChanged( const TQColor &c );
+ void alignmentChanged( int a );
+ void editorChanged( TQWidget * );
+
+
+private:
+ void setupFileActions();
+ void setupEditActions();
+ void setupTextActions();
+ void doConnections( TQTextEdit *e );
+
+ TQAction *actionTextBold,
+ *actionTextUnderline,
+ *actionTextItalic,
+ *actionTextColor,
+ *actionAlignLeft,
+ *actionAlignCenter,
+ *actionAlignRight,
+ *actionAlignJustify;
+ TQComboBox *comboStyle,
+ *comboFont,
+ *comboSize;
+ TQTabWidget *tabWidget;
+ TQMap<TQTextEdit*, TQString> filenames;
+
+};
+
+
+#endif
diff --git a/examples/demo/textdrawing/textitalic.png b/examples/demo/textdrawing/textitalic.png
new file mode 100644
index 000000000..68e2b44ce
--- /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 000000000..1c6e5b952
--- /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 000000000..30b05019e
--- /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 000000000..73f1cad5d
--- /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 000000000..3477ccb33
--- /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 000000000..d5b6c1634
--- /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 000000000..fa1da4727
--- /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 000000000..5f0a3701a
--- /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>Retquired</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 000000000..bc1d3d8ab
--- /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 000000000..5b7e6b577
--- /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>Retquired</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 000000000..6bd22c41d
--- /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 000000000..82bdc1910
--- /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>Retquired</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 000000000..34478f16b
--- /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 000000000..112414a09
--- /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>Retquired</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 000000000..bf61dfd34
--- /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="TQWidget">
+ <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="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <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="TQLabel">
+ <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="TQButtonGroup">
+ <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="TQCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Apple</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>CheckBox2</cstring>
+ </property>
+ <property name="text">
+ <string>Banana</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox" 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="TQButtonGroup">
+ <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="TQRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>RadioButton3</cstring>
+ </property>
+ <property name="text">
+ <string>Whisky</string>
+ </property>
+ </widget>
+ <widget class="TQRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>RadioButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Wine</string>
+ </property>
+ </widget>
+ <widget class="TQRadioButton" 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="TQGroupBox">
+ <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="TQDateEdit" 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="TQTimeEdit" 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="TQLabel" 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="TQGroupBox">
+ <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="TQLCDNumber" 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="TQSlider" 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="TQLabel" 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="TQPushButton" 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="TQComboBox" 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="TQLineEdit" 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="TQLabel" 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="TQSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>spinBox</cstring>
+ </property>
+ </widget>
+ <widget class="TQProgressBar" row="0" column="2">
+ <property name="name">
+ <cstring>progressBar</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" 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="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQListBox">
+ <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="TQTextEdit">
+ <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;TQt 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="TQTabWidget">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <widget class="TQWidget">
+ <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="TQIconView" 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="TQWidget">
+ <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="TQListView" 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="TQWidget">
+ <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="TQTable" 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>TQt</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 TQTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const TQTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const TQTime&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 TQDate&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 TQString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor(const TQString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>textChanged(const TQString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateColorTest(const TQString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>returnPressed()</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const TQTime&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateDateTimeString()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const TQTime&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 TQString &amp; color )</slot>
+ <slot>setColor()</slot>
+ <slot>updateClock()</slot>
+ <slot access="protected">updateColorTest( const TQString &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 000000000..94caf5df0
--- /dev/null
+++ b/examples/demo/widgets/widgetsbase.ui.h
@@ -0,0 +1,66 @@
+#include <qobjectlist.h>
+
+void WidgetsBase::init()
+{
+ timeEdit->setTime( TQTime::currentTime() );
+ dateEdit->setDate( TQDate::currentDate() );
+}
+
+void WidgetsBase::destroy()
+{
+
+}
+
+void WidgetsBase::resetColors()
+{
+ groupBox->setPalette( palette(), FALSE );
+ TQObjectList *chldn = groupBox->queryList();
+ if ( chldn ) {
+ for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ TQWidget *w = (TQWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(palette(), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor( const TQString & color )
+{
+ groupBox->setPalette( TQColor( color ), FALSE );
+ TQObjectList *chldn = groupBox->queryList();
+ if ( chldn ) {
+ for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ TQWidget *w = (TQWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(TQColor(color), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor()
+{
+ setColor( lineEdit->text() );
+}
+
+void WidgetsBase::updateClock()
+{
+ clock->setTime( timeEdit->time() );
+}
+
+void WidgetsBase::updateColorTest( const TQString & color )
+{
+ colorTest->setPalette( TQColor( color ), TRUE);
+}
+
+void WidgetsBase::updateDateTimeString()
+{
+ TQDateTime 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 000000000..ec0c46069
--- /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="TQWidget">
+ <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="TQListBox" 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="TQTextEdit" 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;TQt 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="TQTabWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TabWidget2</cstring>
+ </property>
+ <widget class="TQWidget">
+ <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="TQIconView" 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="TQWidget">
+ <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="TQListView" 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="TQGroupBox" 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="TQLCDNumber" 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="TQSlider" 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="TQLabel" 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="TQPushButton" 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="TQComboBox" 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="TQLineEdit" 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="TQLabel" 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="TQSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>spinBox</cstring>
+ </property>
+ </widget>
+ <widget class="TQProgressBar" row="0" column="2">
+ <property name="name">
+ <cstring>progressBar</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" 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="TQLayoutWidget" 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="TQLabel">
+ <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="TQButtonGroup">
+ <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="TQCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>CheckBox1</cstring>
+ </property>
+ <property name="text">
+ <string>Apples</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>CheckBox2</cstring>
+ </property>
+ <property name="text">
+ <string>Banana</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox" 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="TQButtonGroup">
+ <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="TQRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>RadioButton3</cstring>
+ </property>
+ <property name="text">
+ <string>Sprite</string>
+ </property>
+ </widget>
+ <widget class="TQRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>RadioButton4</cstring>
+ </property>
+ <property name="text">
+ <string>Farris</string>
+ </property>
+ </widget>
+ <widget class="TQRadioButton" 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="TQGroupBox">
+ <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="TQDateEdit" 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="TQTimeEdit" 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="TQLayoutWidget" 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="TQLabel">
+ <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 TQTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const TQTime &amp;)</slot>
+ <slot access="public" specifier="">setTime(const TQTime&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 TQDate&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 TQString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor(const TQString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>textChanged(const TQString&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateColorTest(const TQString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>lineEdit</sender>
+ <signal>returnPressed()</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>setColor()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const TQTime&amp;)</signal>
+ <receiver>WidgetsBase</receiver>
+ <slot>updateDateTimeString()</slot>
+ </connection>
+ <connection>
+ <sender>timeEdit</sender>
+ <signal>valueChanged(const TQTime&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 TQString &amp; color )</slot>
+ <slot>setColor()</slot>
+ <slot>updateClock()</slot>
+ <slot access="protected">updateColorTest( const TQString &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 000000000..729b1ab3e
--- /dev/null
+++ b/examples/demo/widgets/widgetsbase_pro.ui.h
@@ -0,0 +1,64 @@
+#include <qobjectlist.h>
+
+void WidgetsBase::init()
+{
+ timeEdit->setTime( TQTime::currentTime() );
+ dateEdit->setDate( TQDate::currentDate() );
+}
+
+void WidgetsBase::destroy()
+{
+
+}
+
+void WidgetsBase::resetColors()
+{
+ groupBox->setPalette( palette(), FALSE );
+ if(TQObjectList *chldn = groupBox->queryList()) {
+ for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ TQWidget *w = (TQWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(palette(), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor( const TQString & color )
+{
+ groupBox->setPalette( TQColor( color ), FALSE );
+ if(TQObjectList *chldn = groupBox->queryList()) {
+ for(TQObject *obj=chldn->first(); obj; obj = chldn->next()) {
+ if(obj->isWidgetType()) {
+ TQWidget *w = (TQWidget *)obj;
+ if(!w->isTopLevel())
+ w->setPalette(TQColor(color), FALSE);
+ }
+ }
+ }
+}
+
+void WidgetsBase::setColor()
+{
+ setColor( lineEdit->text() );
+}
+
+void WidgetsBase::updateClock()
+{
+ clock->setTime( timeEdit->time() );
+}
+
+void WidgetsBase::updateColorTest( const TQString & color )
+{
+ colorTest->setPalette( TQColor( color ) );
+}
+
+void WidgetsBase::updateDateTimeString()
+{
+ TQDateTime dt;
+ dt.setDate( dateEdit->date() );
+ dt.setTime( timeEdit->time() );
+ dateTimeLabel->setText( dt.toString() );
+}
+
diff --git a/examples/desktop/README b/examples/desktop/README
new file mode 100644
index 000000000..dcbb7a125
--- /dev/null
+++ b/examples/desktop/README
@@ -0,0 +1,12 @@
+The desktop demo contains three routines, each of which draws simple
+shapes on the desktop.
+
+"desktop -rotate" rotates a shaded square. Some nice color work.
+
+"desktop -poly" draws qix-like moving shapes.
+
+"desktop -shadetext" and "-troll" draw pretty shaded text on the
+desktop; "-shadewidget" and "-trollwidget" use the background as a
+widget. The latter can be used to make animated background widgets
+that work efficiently, which is very cool but possibly not very
+useful.
diff --git a/examples/desktop/desktop.cpp b/examples/desktop/desktop.cpp
new file mode 100644
index 000000000..34c548ca7
--- /dev/null
+++ b/examples/desktop/desktop.cpp
@@ -0,0 +1,347 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qimage.h>
+#include <qbitmap.h>
+#include <qpainter.h>
+#include <qapplication.h>
+#include <qdropsite.h>
+#include <qdragobject.h>
+#include <stdio.h>
+
+
+static double seed = 0.353535353535;
+static const int KINDA_RAND_MAX = 32767;
+
+static int kindaRand()
+{
+ seed = seed*147;
+ seed = seed - (double) ((int) seed);
+ return (int) ( seed*(KINDA_RAND_MAX + 1) );
+}
+
+static int velocity( int i ) // change velocity
+{
+ const int velmax = 15;
+ const int velmin = 4;
+ if ( i == 1 || i == 2 )
+ i = (kindaRand()&0x7fff % velmax)/3 + velmin;
+ else
+ i = (kindaRand()&0x7fff % velmax) + velmin;
+ return i;
+}
+
+//
+// Draw polygon on desktop.
+//
+
+void poly()
+{
+ TQWidget *d = TQApplication::desktop();
+ d->setBackgroundColor( TQt::white ); // white desktop
+
+ const int maxpoints = 5;
+ const int maxcurves = 8;
+ static int xvel[maxpoints];
+ static int yvel[maxpoints];
+ int head = 0;
+ int tail = -maxcurves + 2;
+ TQPointArray *a = new TQPointArray[ maxcurves ];
+ register TQPointArray *p;
+ TQRect r = d->rect(); // desktop rectangle
+
+ int i;
+ for ( i=0; i<maxcurves; i++ )
+ a[i].resize( maxpoints );
+ p = &a[0];
+ for ( i=0; i<maxpoints; i++ ) { // setup first polygon points
+ p->setPoint( i, (kindaRand()&0x7fff) % r.width(),
+ (kindaRand()&0x7fff) % r.height() );
+ xvel[i] = velocity(i);
+ yvel[i] = velocity(i);
+ }
+
+ TQPainter paint;
+ paint.begin( d ); // start painting desktop
+
+ for ( int ntimes=0; ntimes<2000; ntimes++ ) {
+ paint.setBrush( TQColor(kindaRand()%360, 180, 255, TQColor::Hsv) );
+ paint.drawPolygon( a[head] );
+ if ( ++tail >= maxcurves )
+ tail = 0;
+
+ int minx=r.left(), maxx=r.right();
+ int miny=r.top(), maxy=r.bottom();
+ int x, y;
+ p = &a[head];
+ if ( ++head >= maxcurves )
+ head = 0;
+ for ( i=0; i<maxpoints; i++ ) { // calc new curve
+ p->point( i, &x, &y );
+ x += xvel[i];
+ y += yvel[i];
+ if ( x >= maxx ) {
+ x = maxx - (x - maxx + 1);
+ xvel[i] = -velocity(i);
+ }
+ if ( x <= minx ) {
+ x = minx + (minx - x + 1);
+ xvel[i] = velocity(i);
+ }
+ if ( y >= maxy ) {
+ y = maxy - (y - maxy + 1);
+ yvel[i] = -velocity(i);
+ }
+ if ( y <= miny ) {
+ y = miny + (miny - y + 1);
+ yvel[i] = velocity(i);
+ }
+ a[head].setPoint( i, x, y );
+ }
+ }
+ paint.end(); // painting done
+ delete[] a;
+}
+
+
+//
+// Rotate pattern on desktop.
+//
+
+void rotate()
+{
+ int i;
+ const int w = 64;
+ const int h = 64;
+ TQImage image( w, h, 8, 128 ); // create image
+ for ( i=0; i<128; i++ ) // build color table
+ image.setColor( i, qRgb(i,0,0) );
+ for ( int y=0; y<h; y++ ) { // set image pixels
+ uchar *p = image.scanLine(y);
+ for ( int x=0; x<w; x++ )
+ *p++ = (x+y)%128;
+ }
+
+ TQPixmap pm;
+ pm = image; // convert image to pixmap
+ pm.setOptimization( TQPixmap::BestOptim ); // rotation will be faster
+
+ TQWidget *d = TQApplication::desktop(); // w = desktop widget
+
+ for ( i=0; i<=360; i += 2 ) {
+ TQWMatrix m;
+ m.rotate( i ); // rotate coordinate system
+ TQPixmap rpm = pm.xForm( m ); // rpm = rotated pixmap
+ d->setBackgroundPixmap( rpm ); // set desktop pixmap
+ d->update(); // repaint desktop
+ }
+}
+
+//
+// Generates a marble-like pattern in pm.
+//
+
+void generateStone( TQPixmap *pm,
+ const TQColor &c1, const TQColor &c2, const TQColor &c3 )
+{
+ TQPainter p;
+ TQPen p1 ( c1, 0 );
+ TQPen p2 ( c2, 0 );
+ TQPen p3 ( c3, 0 );
+
+ p.begin( pm );
+ for( int i = 0 ; i < pm->width() ; i++ )
+ for( int j = 0 ; j < pm->height() ; j++ ) {
+ int r = kindaRand();
+ if ( r < KINDA_RAND_MAX / 3 )
+ p.setPen( p1 );
+ else if ( r < KINDA_RAND_MAX / 3 * 2 )
+ p.setPen( p2 );
+ else
+ p.setPen( p3 );
+ p.drawPoint( i,j );
+ }
+ p.end();
+}
+
+void drawShadeText( TQPainter *p, int x, int y, const char *text,
+ const TQColor &topColor, const TQColor &bottomColor,
+ int sw = 2 )
+{
+ if ( !p->isActive() )
+ return;
+
+ p->setPen( bottomColor );
+ p->drawText( x+sw, y+sw, text );
+ p->setPen( topColor );
+ p->drawText( x, y, text );
+}
+
+// NOTE: desktop drag/drop is experimental
+
+class DesktopWidget : public TQWidget, private TQDropSite
+{
+public:
+ DesktopWidget( const char *s, TQWidget *parent=0, const char *name=0 );
+ ~DesktopWidget();
+ void paintEvent( TQPaintEvent * );
+
+ void dragEnterEvent( TQDragEnterEvent *e )
+ {
+ if ( TQImageDrag::canDecode(e) )
+ e->accept();
+ }
+
+ void dragLeaveEvent( TQDragLeaveEvent * )
+ {
+ }
+
+ void dragMoveEvent( TQDragMoveEvent *e )
+ {
+ e->accept();
+ }
+
+ void dropEvent( TQDropEvent * e )
+ {
+ TQPixmap pmp;
+ if ( TQImageDrag::decode( e, pmp ) ) {
+ setBackgroundPixmap( pmp );
+ update();
+ }
+ }
+
+private:
+ TQPixmap *pm;
+ TQString text;
+};
+
+DesktopWidget::DesktopWidget( const char *s, TQWidget *parent, const char *name )
+ : TQWidget( parent, name, WType_Desktop | WPaintDesktop),
+ TQDropSite(this)
+{
+ text = s;
+ pm = 0;
+}
+
+DesktopWidget::~DesktopWidget()
+{
+ delete pm;
+}
+
+void DesktopWidget::paintEvent( TQPaintEvent * )
+{
+ TQColor c1 = backgroundColor();
+ TQColor c2 = c1.light(104);
+ TQColor c3 = c1.dark(106);
+ if ( !pm ) {
+ pm = new TQPixmap( 64, 64 );
+ generateStone( pm, c1, c2, c3 );
+ setBackgroundPixmap( *pm );
+ update();
+ }
+ TQRect br = fontMetrics().boundingRect( text );
+ TQPixmap offscreen( br.width(), br.height() );
+ int x = width()/2 - br.width()/2;
+ int y = height()/2 - br.height()/2;
+ offscreen.fill( this, x, y );
+ TQPainter p;
+ p.begin( &offscreen );
+ drawShadeText( &p, -br.x(), -br.y(), text, c2, c3, 3 );
+ p.end();
+ bitBlt( this, x, y, &offscreen );
+}
+
+void desktopWidget( const char *s = "Trolltech" )
+{
+ DesktopWidget *t = new DesktopWidget(s);
+ t->update();
+ qApp->exec();
+ delete t;
+}
+
+void desktopText( const char *s = "Trolltech" )
+{
+ const int border = 20;
+
+ TQColor c1 = qApp->palette().inactive().background();
+ TQColor c2 = c1.light(104);
+ TQColor c3 = c1.dark(106);
+
+ TQPixmap pm(10,10);
+
+ TQPainter p;
+ p.begin( &pm );
+ TQRect r = p.fontMetrics().boundingRect( s );
+ p.end();
+
+ int appWidth = qApp->desktop()->width();
+ int appHeight = qApp->desktop()->height();
+ if ( r.width() > appWidth - border*2 )
+ r.setWidth( appWidth - border*2 );
+ if ( r.height() > appHeight - border*2 )
+ r.setHeight( appHeight - border*2 );
+
+ pm.resize( r.size() + TQSize( border*2, border*2 ) );
+ generateStone( &pm, c1, c2, c3 );
+ p.begin( &pm );
+ drawShadeText( &p, -r.x() + border, -r.y() + border, s, c2, c3 );
+ p.end();
+
+ qApp->desktop()->setBackgroundPixmap( pm );
+}
+
+//
+// The program starts here.
+//
+
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+
+ if ( argc > 1 ) {
+ TQFont f( "charter", 96, TQFont::Black );
+ f.setStyleHint( TQFont::Times );
+ app.setFont( f );
+ }
+
+ bool validOptions = FALSE;
+
+ if ( argc == 2 ) {
+ validOptions = TRUE;
+ if ( strcmp(argv[1],"-poly") == 0 )
+ poly();
+ else if ( strcmp(argv[1],"-rotate") == 0 )
+ rotate();
+ else if ( strcmp(argv[1],"-troll") == 0 )
+ desktopText();
+ else if ( strcmp(argv[1],"-trollwidget") == 0 )
+ desktopWidget();
+ else
+ validOptions = FALSE;
+ }
+ if ( argc == 3 ) {
+ validOptions = TRUE;
+ if ( strcmp(argv[1],"-shadetext") == 0 )
+ desktopText( argv[2] );
+ else if ( strcmp(argv[1],"-shadewidget") == 0 )
+ desktopWidget( argv[2] );
+ else
+ validOptions = FALSE;
+ }
+ if ( !validOptions ) {
+ fprintf( stderr, "Usage:\n\tdesktop -poly"
+ "\n\tdesktop -rotate"
+ "\n\tdesktop -troll"
+ "\n\tdesktop -trollwidget"
+ "\n\tdesktop -shadetext <text>"
+ "\n\tdesktop -shadewidget <text>\n" );
+ rotate();
+ }
+ return 0;
+}
diff --git a/examples/desktop/desktop.doc b/examples/desktop/desktop.doc
new file mode 100644
index 000000000..3a7df648e
--- /dev/null
+++ b/examples/desktop/desktop.doc
@@ -0,0 +1,20 @@
+
+/*
+*/
+/*! \page desktop-example.html
+
+ \ingroup examples
+ \title Painting on the Desktop
+
+ The desktop demo contains three routines, each of which draws
+ something on the desktop. It does some nice stuff with QPainter,
+ and also demonstrates how one can treat the desktop as a widget like
+ any other.
+
+ <hr>
+
+ Implementation:
+
+ \include desktop/desktop.cpp
+*/
+
diff --git a/examples/desktop/desktop.pro b/examples/desktop/desktop.pro
new file mode 100644
index 000000000..851401087
--- /dev/null
+++ b/examples/desktop/desktop.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = desktop
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = desktop.cpp
diff --git a/examples/dirview/dirview.cpp b/examples/dirview/dirview.cpp
new file mode 100644
index 000000000..ce5e96b9c
--- /dev/null
+++ b/examples/dirview/dirview.cpp
@@ -0,0 +1,532 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "dirview.h"
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qpixmap.h>
+#include <qevent.h>
+#include <qpoint.h>
+#include <qmessagebox.h>
+#include <qdragobject.h>
+#include <qmime.h>
+#include <qstrlist.h>
+#include <qstringlist.h>
+#include <qapplication.h>
+#include <qheader.h>
+
+static const char* folder_closed_xpm[]={
+ "16 16 9 1",
+ "g c #808080",
+ "b c #c0c000",
+ "e c #c0c0c0",
+ "# c #000000",
+ "c c #ffff00",
+ ". c None",
+ "a c #585858",
+ "f c #a0a0a4",
+ "d c #ffffff",
+ "..###...........",
+ ".#abc##.........",
+ ".#daabc#####....",
+ ".#ddeaabbccc#...",
+ ".#dedeeabbbba...",
+ ".#edeeeeaaaab#..",
+ ".#deeeeeeefe#ba.",
+ ".#eeeeeeefef#ba.",
+ ".#eeeeeefeff#ba.",
+ ".#eeeeefefff#ba.",
+ ".##geefeffff#ba.",
+ "...##gefffff#ba.",
+ ".....##fffff#ba.",
+ ".......##fff#b##",
+ ".........##f#b##",
+ "...........####."};
+
+static const char* folder_open_xpm[]={
+ "16 16 11 1",
+ "# c #000000",
+ "g c #c0c0c0",
+ "e c #303030",
+ "a c #ffa858",
+ "b c #808080",
+ "d c #a0a0a4",
+ "f c #585858",
+ "c c #ffdca8",
+ "h c #dcdcdc",
+ "i c #ffffff",
+ ". c None",
+ "....###.........",
+ "....#ab##.......",
+ "....#acab####...",
+ "###.#acccccca#..",
+ "#ddefaaaccccca#.",
+ "#bdddbaaaacccab#",
+ ".eddddbbaaaacab#",
+ ".#bddggdbbaaaab#",
+ "..edgdggggbbaab#",
+ "..#bgggghghdaab#",
+ "...ebhggghicfab#",
+ "....#edhhiiidab#",
+ "......#egiiicfb#",
+ "........#egiibb#",
+ "..........#egib#",
+ "............#ee#"};
+
+static const char * folder_locked[]={
+ "16 16 10 1",
+ "h c #808080",
+ "b c #ffa858",
+ "f c #c0c0c0",
+ "e c #c05800",
+ "# c #000000",
+ "c c #ffdca8",
+ ". c None",
+ "a c #585858",
+ "g c #a0a0a4",
+ "d c #ffffff",
+ "..#a#...........",
+ ".#abc####.......",
+ ".#daa#eee#......",
+ ".#ddf#e##b#.....",
+ ".#dfd#e#bcb##...",
+ ".#fdccc#daaab#..",
+ ".#dfbbbccgfg#ba.",
+ ".#ffb#ebbfgg#ba.",
+ ".#ffbbe#bggg#ba.",
+ ".#fffbbebggg#ba.",
+ ".##hf#ebbggg#ba.",
+ "...###e#gggg#ba.",
+ ".....#e#gggg#ba.",
+ "......###ggg#b##",
+ ".........##g#b##",
+ "...........####."};
+
+static const char * pix_file []={
+ "16 16 7 1",
+ "# c #000000",
+ "b c #ffffff",
+ "e c #000000",
+ "d c #404000",
+ "c c #c0c000",
+ "a c #ffffc0",
+ ". c None",
+ "................",
+ ".........#......",
+ "......#.#a##....",
+ ".....#b#bbba##..",
+ "....#b#bbbabbb#.",
+ "...#b#bba##bb#..",
+ "..#b#abb#bb##...",
+ ".#a#aab#bbbab##.",
+ "#a#aaa#bcbbbbbb#",
+ "#ccdc#bcbbcbbb#.",
+ ".##c#bcbbcabb#..",
+ "...#acbacbbbe...",
+ "..#aaaacaba#....",
+ "...##aaaaa#.....",
+ ".....##aa#......",
+ ".......##......."};
+
+TQPixmap *folderLocked = 0;
+TQPixmap *folderClosed = 0;
+TQPixmap *folderOpen = 0;
+TQPixmap *fileNormal = 0;
+
+/*****************************************************************************
+ *
+ * Class Directory
+ *
+ *****************************************************************************/
+
+Directory::Directory( Directory * parent, const TQString& filename )
+ : TQListViewItem( parent ), f(filename),
+ showDirsOnly( parent->showDirsOnly ),
+ pix( 0 )
+{
+ p = parent;
+ readable = TQDir( fullName() ).isReadable();
+
+ if ( !readable )
+ setPixmap( folderLocked );
+ else
+ setPixmap( folderClosed );
+}
+
+
+Directory::Directory( TQListView * parent, const TQString& filename )
+ : TQListViewItem( parent ), f(filename),
+ showDirsOnly( ( (DirectoryView*)parent )->showDirsOnly() ),
+ pix( 0 )
+{
+ p = 0;
+ readable = TQDir( fullName() ).isReadable();
+}
+
+
+void Directory::setPixmap( TQPixmap *px )
+{
+ pix = px;
+ setup();
+ widthChanged( 0 );
+ invalidateHeight();
+ repaint();
+}
+
+
+const TQPixmap *Directory::pixmap( int i ) const
+{
+ if ( i )
+ return 0;
+ return pix;
+}
+
+void Directory::setOpen( bool o )
+{
+ if ( o )
+ setPixmap( folderOpen );
+ else
+ setPixmap( folderClosed );
+
+ if ( o && !childCount() ) {
+ TQString s( fullName() );
+ TQDir thisDir( s );
+ if ( !thisDir.isReadable() ) {
+ readable = FALSE;
+ setExpandable( FALSE );
+ return;
+ }
+
+ listView()->setUpdatesEnabled( FALSE );
+ const TQFileInfoList * files = thisDir.entryInfoList();
+ if ( files ) {
+ TQFileInfoListIterator it( *files );
+ TQFileInfo * fi;
+ while( (fi=it.current()) != 0 ) {
+ ++it;
+ if ( fi->fileName() == "." || fi->fileName() == ".." )
+ ; // nothing
+ else if ( fi->isSymLink() && !showDirsOnly ) {
+ FileItem *item = new FileItem( this, fi->fileName(),
+ "Symbolic Link" );
+ item->setPixmap( fileNormal );
+ }
+ else if ( fi->isDir() )
+ (void)new Directory( this, fi->fileName() );
+ else if ( !showDirsOnly ) {
+ FileItem *item
+ = new FileItem( this, fi->fileName(),
+ fi->isFile()?"File":"Special" );
+ item->setPixmap( fileNormal );
+ }
+ }
+ }
+ listView()->setUpdatesEnabled( TRUE );
+ }
+ TQListViewItem::setOpen( o );
+}
+
+
+void Directory::setup()
+{
+ setExpandable( TRUE );
+ TQListViewItem::setup();
+}
+
+
+TQString Directory::fullName()
+{
+ TQString s;
+ if ( p ) {
+ s = p->fullName();
+ s.append( f.name() );
+ s.append( "/" );
+ } else {
+ s = f.name();
+ }
+ return s;
+}
+
+
+TQString Directory::text( int column ) const
+{
+ if ( column == 0 )
+ return f.name();
+ else if ( readable )
+ return "Directory";
+ else
+ return "Unreadable Directory";
+}
+
+/*****************************************************************************
+ *
+ * Class DirectoryView
+ *
+ *****************************************************************************/
+
+DirectoryView::DirectoryView( TQWidget *parent, const char *name, bool sdo )
+ : TQListView( parent, name ), dirsOnly( sdo ), oldCurrent( 0 ),
+ dropItem( 0 ), mousePressed( FALSE )
+{
+ autoopen_timer = new TQTimer( this );
+ if ( !folderLocked ) {
+ folderLocked = new TQPixmap( folder_locked );
+ folderClosed = new TQPixmap( folder_closed_xpm );
+ folderOpen = new TQPixmap( folder_open_xpm );
+ fileNormal = new TQPixmap( pix_file );
+ }
+
+ connect( this, SIGNAL( doubleClicked( TQListViewItem * ) ),
+ this, SLOT( slotFolderSelected( TQListViewItem * ) ) );
+ connect( this, SIGNAL( returnPressed( TQListViewItem * ) ),
+ this, SLOT( slotFolderSelected( TQListViewItem * ) ) );
+
+ setAcceptDrops( TRUE );
+ viewport()->setAcceptDrops( TRUE );
+
+ connect( autoopen_timer, SIGNAL( timeout() ),
+ this, SLOT( openFolder() ) );
+}
+
+void DirectoryView::slotFolderSelected( TQListViewItem *i )
+{
+ if ( !i || !showDirsOnly() )
+ return;
+
+ Directory *dir = (Directory*)i;
+ emit folderSelected( dir->fullName() );
+}
+
+void DirectoryView::openFolder()
+{
+ autoopen_timer->stop();
+ if ( dropItem && !dropItem->isOpen() ) {
+ dropItem->setOpen( TRUE );
+ dropItem->repaint();
+ }
+}
+
+static const int autoopenTime = 750;
+
+
+void DirectoryView::contentsDragEnterEvent( TQDragEnterEvent *e )
+{
+ if ( !TQUriDrag::canDecode(e) ) {
+ e->ignore();
+ return;
+ }
+
+ oldCurrent = currentItem();
+
+ TQListViewItem *i = itemAt( contentsToViewport(e->pos()) );
+ if ( i ) {
+ dropItem = i;
+ autoopen_timer->start( autoopenTime );
+ }
+}
+
+
+void DirectoryView::contentsDragMoveEvent( TQDragMoveEvent *e )
+{
+ if ( !TQUriDrag::canDecode(e) ) {
+ e->ignore();
+ return;
+ }
+
+ TQPoint vp = contentsToViewport( ( (TQDragMoveEvent*)e )->pos() );
+ TQListViewItem *i = itemAt( vp );
+ if ( i ) {
+ setSelected( i, TRUE );
+ e->accept();
+ if ( i != dropItem ) {
+ autoopen_timer->stop();
+ dropItem = i;
+ autoopen_timer->start( autoopenTime );
+ }
+ switch ( e->action() ) {
+ case TQDropEvent::Copy:
+ break;
+ case TQDropEvent::Move:
+ e->acceptAction();
+ break;
+ case TQDropEvent::Link:
+ e->acceptAction();
+ break;
+ default:
+ ;
+ }
+ } else {
+ e->ignore();
+ autoopen_timer->stop();
+ dropItem = 0;
+ }
+}
+
+void DirectoryView::contentsDragLeaveEvent( TQDragLeaveEvent * )
+{
+ autoopen_timer->stop();
+ dropItem = 0;
+
+ setCurrentItem( oldCurrent );
+ setSelected( oldCurrent, TRUE );
+}
+
+void DirectoryView::contentsDropEvent( TQDropEvent *e )
+{
+ autoopen_timer->stop();
+
+ if ( !TQUriDrag::canDecode(e) ) {
+ e->ignore();
+ return;
+ }
+
+ TQListViewItem *item = itemAt( contentsToViewport(e->pos()) );
+ if ( item ) {
+
+ TQStrList lst;
+
+ TQUriDrag::decode( e, lst );
+
+ TQString str;
+
+ switch ( e->action() ) {
+ case TQDropEvent::Copy:
+ str = "Copy";
+ break;
+ case TQDropEvent::Move:
+ str = "Move";
+ e->acceptAction();
+ break;
+ case TQDropEvent::Link:
+ str = "Link";
+ e->acceptAction();
+ break;
+ default:
+ str = "Unknown";
+ }
+
+ str += "\n\n";
+
+ e->accept();
+
+ for ( uint i = 0; i < lst.count(); ++i ) {
+ TQString filename = TQDir::convertSeparators(TQUriDrag::uriToLocalFile(lst.at(i)));
+ str += filename + "\n";
+ }
+ str += TQString( "\nTo\n\n %1" )
+ .arg( TQDir::convertSeparators(fullPath(item)) );
+
+ TQMessageBox::information( this, "Drop target", str, "Not implemented" );
+ } else
+ e->ignore();
+
+}
+
+
+TQString DirectoryView::fullPath(TQListViewItem* item)
+{
+ TQString fullpath = item->text(0);
+ while ( (item=item->parent()) ) {
+ if ( item->parent() )
+ fullpath = item->text(0) + "/" + fullpath;
+ else
+ fullpath = item->text(0) + fullpath;
+ }
+#ifdef Q_WS_WIN
+ if (fullpath.length() > 2 && fullpath[1] != ':') {
+ TQDir dir(fullpath);
+ fullpath = dir.currentDirPath().left(2) + fullpath;
+ }
+#endif
+
+ return fullpath;
+}
+
+void DirectoryView::contentsMousePressEvent( TQMouseEvent* e )
+{
+ TQListView::contentsMousePressEvent(e);
+ TQPoint p( contentsToViewport( e->pos() ) );
+ TQListViewItem *i = itemAt( p );
+ if ( i ) {
+ // if the user clicked into the root decoration of the item, don't try to start a drag!
+ if ( p.x() > header()->cellPos( header()->mapToActual( 0 ) ) +
+ treeStepSize() * ( i->depth() + ( rootIsDecorated() ? 1 : 0) ) + itemMargin() ||
+ p.x() < header()->cellPos( header()->mapToActual( 0 ) ) ) {
+ presspos = e->pos();
+ mousePressed = TRUE;
+ }
+ }
+}
+
+void DirectoryView::contentsMouseMoveEvent( TQMouseEvent* e )
+{
+ if ( mousePressed && ( presspos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) {
+ mousePressed = FALSE;
+ TQListViewItem *item = itemAt( contentsToViewport(presspos) );
+ if ( item ) {
+ TQString source = fullPath(item);
+ if ( TQFile::exists(source) ) {
+ TQUriDrag* ud = new TQUriDrag(viewport());
+ ud->setFileNames( source );
+ if ( ud->drag() )
+ TQMessageBox::information( this, "Drag source",
+ TQString("Delete ") + TQDir::convertSeparators(source), "Not implemented" );
+ }
+ }
+ }
+}
+
+void DirectoryView::contentsMouseReleaseEvent( TQMouseEvent * )
+{
+ mousePressed = FALSE;
+}
+
+void DirectoryView::setDir( const TQString &s )
+{
+ TQListViewItemIterator it( this );
+ ++it;
+ for ( ; it.current(); ++it ) {
+ it.current()->setOpen( FALSE );
+ }
+
+ TQStringList lst( TQStringList::split( "/", s ) );
+ TQListViewItem *item = firstChild();
+ TQStringList::Iterator it2 = lst.begin();
+ for ( ; it2 != lst.end(); ++it2 ) {
+ while ( item ) {
+ if ( item->text( 0 ) == *it2 ) {
+ item->setOpen( TRUE );
+ break;
+ }
+ item = item->itemBelow();
+ }
+ }
+
+ if ( item )
+ setCurrentItem( item );
+}
+
+void FileItem::setPixmap( TQPixmap *p )
+{
+ pix = p;
+ setup();
+ widthChanged( 0 );
+ invalidateHeight();
+ repaint();
+}
+
+
+const TQPixmap *FileItem::pixmap( int i ) const
+{
+ if ( i )
+ return 0;
+ return pix;
+}
diff --git a/examples/dirview/dirview.doc b/examples/dirview/dirview.doc
new file mode 100644
index 000000000..82a599996
--- /dev/null
+++ b/examples/dirview/dirview.doc
@@ -0,0 +1,35 @@
+
+/*
+*/
+/*! \page dirview-example.html
+
+ \ingroup examples
+ \title A Directory Browser
+
+ This example program demonstrates how to use a listview and
+ listview items to build a multi-column hierarchical, memory- and
+ CPU-efficient directory browser. It also demonstrates how to use
+ Drag&Drop in a listview.
+
+ <hr>
+
+ Header file:
+
+ \include dirview/dirview.h
+
+ <hr>
+
+ And here is the main implementation file. Note the way the program
+ scans subdirectories only when it has to. This allows the program
+ to handle very large file systems efficiently. The same technique
+ can be used in any other trees.
+
+ \include dirview/dirview.cpp
+
+ <hr>
+
+ Main:
+
+ \include dirview/main.cpp
+*/
+
diff --git a/examples/dirview/dirview.h b/examples/dirview/dirview.h
new file mode 100644
index 000000000..b4e49b5a2
--- /dev/null
+++ b/examples/dirview/dirview.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef DIRVIEW_H
+#define DIRVIEW_H
+
+#include <qlistview.h>
+#include <qstring.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qtimer.h>
+
+class TQWidget;
+class TQDragEnterEvent;
+class TQDragMoveEvent;
+class TQDragLeaveEvent;
+class TQDropEvent;
+
+class FileItem : public TQListViewItem
+{
+public:
+ FileItem( TQListViewItem *parent, const TQString &s1, const TQString &s2 )
+ : TQListViewItem( parent, s1, s2 ), pix( 0 ) {}
+
+ const TQPixmap *pixmap( int i ) const;
+#if !defined(Q_NO_USING_KEYWORD)
+ using TQListViewItem::setPixmap;
+#endif
+ void setPixmap( TQPixmap *p );
+
+private:
+ TQPixmap *pix;
+
+};
+
+class Directory : public TQListViewItem
+{
+public:
+ Directory( TQListView * parent, const TQString& filename );
+ Directory( Directory * parent, const TQString& filename, const TQString &col2 )
+ : TQListViewItem( parent, filename, col2 ), pix( 0 ) {}
+ Directory( Directory * parent, const TQString& filename );
+
+ TQString text( int column ) const;
+
+ TQString fullName();
+
+ void setOpen( bool );
+ void setup();
+
+ const TQPixmap *pixmap( int i ) const;
+#if !defined(Q_NO_USING_KEYWORD)
+ using TQListViewItem::setPixmap;
+#endif
+ void setPixmap( TQPixmap *p );
+
+private:
+ TQFile f;
+ Directory * p;
+ bool readable;
+ bool showDirsOnly;
+ TQPixmap *pix;
+
+};
+
+class DirectoryView : public TQListView
+{
+ Q_OBJECT
+
+public:
+ DirectoryView( TQWidget *parent = 0, const char *name = 0, bool sdo = FALSE );
+ bool showDirsOnly() { return dirsOnly; }
+
+public slots:
+ void setDir( const TQString & );
+
+signals:
+ void folderSelected( const TQString & );
+
+protected slots:
+ void slotFolderSelected( TQListViewItem * );
+ void openFolder();
+
+protected:
+ void contentsDragEnterEvent( TQDragEnterEvent *e );
+ void contentsDragMoveEvent( TQDragMoveEvent *e );
+ void contentsDragLeaveEvent( TQDragLeaveEvent *e );
+ void contentsDropEvent( TQDropEvent *e );
+ void contentsMouseMoveEvent( TQMouseEvent *e );
+ void contentsMousePressEvent( TQMouseEvent *e );
+ void contentsMouseReleaseEvent( TQMouseEvent *e );
+
+private:
+ TQString fullPath(TQListViewItem* item);
+ bool dirsOnly;
+ TQListViewItem *oldCurrent;
+ TQListViewItem *dropItem;
+ TQTimer* autoopen_timer;
+ TQPoint presspos;
+ bool mousePressed;
+
+};
+
+#endif
diff --git a/examples/dirview/dirview.pro b/examples/dirview/dirview.pro
new file mode 100644
index 000000000..fe711169b
--- /dev/null
+++ b/examples/dirview/dirview.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = dirview
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = dirview.h
+SOURCES = dirview.cpp \
+ main.cpp
diff --git a/examples/dirview/main.cpp b/examples/dirview/main.cpp
new file mode 100644
index 000000000..00f712729
--- /dev/null
+++ b/examples/dirview/main.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include "dirview.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+
+ DirectoryView mw;
+
+ mw.addColumn( "Name" );
+ mw.addColumn( "Type" );
+ mw.setTreeStepSize( 20 );
+
+ const TQFileInfoList* roots = TQDir::drives();
+ TQPtrListIterator<TQFileInfo> i(*roots);
+ TQFileInfo* fi;
+ while ( (fi = *i) ) {
+ ++i;
+ Directory * root = new Directory( &mw, fi->filePath() );
+ if ( roots->count() <= 1 )
+ root->setOpen( TRUE ); // be interesting
+ }
+
+ mw.resize( 400, 400 );
+ mw.setCaption( "TQt Example - Directory Browser" );
+ mw.setAllColumnsShowFocus( TRUE );
+ a.setMainWidget( &mw );
+ mw.show();
+
+ return a.exec();
+}
diff --git a/examples/distributor/distributor.doc b/examples/distributor/distributor.doc
new file mode 100644
index 000000000..addcacecd
--- /dev/null
+++ b/examples/distributor/distributor.doc
@@ -0,0 +1,41 @@
+/*! \page distributor-example.html
+ \ingroup examples
+
+ \title Qt Distribution Example
+
+ This example program modifies the hard-coded paths that are
+ compiled into the Qt library.
+
+ When distributing the Qt library, the final installation prefix is
+ very rarely the same as the prefix used when doing development.
+ You can use the code from this example to modify the following
+ hard-coded paths in Qt library:
+
+ \list
+
+ \i Prefix - Normally, all other paths are relative to the \e
+ Prefix.
+
+ \i Binaries - Location of binaries distributed with Qt (for
+ example, \e{Qt Assistant}).
+
+ \i Documentation - Location of the Qt documentation.
+
+ \i Headers - Location of the Qt headers.
+
+ \i Libraries - Location of addition libraries distributed with Qt
+ (for example, the \e tqui library).
+
+ \i Plugins - Location of the Qt plugins.
+
+ \i Data - Location of applicaton specific data for all programs
+ distributed with Qt.
+
+ \endlist
+
+ <hr>
+
+ Implementation:
+
+ \include distributor/distributor.ui.h
+*/
diff --git a/examples/distributor/distributor.pro b/examples/distributor/distributor.pro
new file mode 100644
index 000000000..81d0ec5c0
--- /dev/null
+++ b/examples/distributor/distributor.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = distributor
+
+CONFIG += qt warn_on
+
+REQUIRES = full-config
+
+SOURCES += main.cpp
+FORMS = distributor.ui
diff --git a/examples/distributor/distributor.ui b/examples/distributor/distributor.ui
new file mode 100644
index 000000000..8deff8107
--- /dev/null
+++ b/examples/distributor/distributor.ui
@@ -0,0 +1,427 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>Distributor</class>
+<widget class="TQWizard">
+ <property name="name">
+ <cstring>Distributor</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>522</width>
+ <height>422</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>TQt Distribution Wizard</string>
+ </property>
+ <widget class="TQWidget">
+ <property name="name">
+ <cstring>selectLibrary</cstring>
+ </property>
+ <attribute name="title">
+ <string>&lt;b&gt;Select TQt Library File&lt;/b&gt;</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>libFilename</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>LineEditPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ </widget>
+ <widget class="TQPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>libBrowseButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Browse...</string>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;Enter the filename of the TQt library to modify, or use the &lt;i&gt;Browse&lt;/i&gt; button to browse for the library.&lt;/p&gt;
+&lt;p&gt;This wizard will allow you to modify the installation paths stored in the library.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="TQWidget">
+ <property name="name">
+ <cstring>modifyPaths</cstring>
+ </property>
+ <attribute name="title">
+ <string>&lt;b&gt;Modify Installation Paths&lt;/b&gt;</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="11" column="1">
+ <property name="name">
+ <cstring>spacer2_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>40</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQLabel" row="1" column="0">
+ <property name="name">
+ <cstring>prefixBuddy</cstring>
+ </property>
+ <property name="text">
+ <string>Installation &amp;Prefix</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>prefixPath</cstring>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="8" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>libPath</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>prefixPath</cstring>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="9" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>plgPath</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="TQPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>prefixBrowseButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Browse...</string>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="10" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>datPath</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;Enter the new &lt;i&gt;Installation Prefix&lt;/i&gt; for the selected TQt library, or use the &lt;i&gt;Browse&lt;/i&gt; button to browse for the desired directory.&lt;/p&gt;
+&lt;p&gt;Use the &lt;i&gt;Next&lt;/i&gt; button to review your choices and perform the modification.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="Line" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="6" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>docPath</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="7" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>hdrPath</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;The various paths below are set automatically according to the chosen &lt;i&gt;Installation Prefix&lt;/i&gt;. Uncheck the &lt;i&gt;Set paths from Installation Prefix&lt;/i&gt; box to enter custom values.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="5" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>binPath</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maxLength">
+ <number>255</number>
+ </property>
+ </widget>
+ <widget class="TQCheckBox" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>autoSet</cstring>
+ </property>
+ <property name="text">
+ <string>Set paths from Installation Prefix</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="6" column="0">
+ <property name="name">
+ <cstring>docBuddy</cstring>
+ </property>
+ <property name="text">
+ <string>Documentation</string>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="10" column="0">
+ <property name="name">
+ <cstring>datBuddy</cstring>
+ </property>
+ <property name="text">
+ <string>Data</string>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="7" column="0">
+ <property name="name">
+ <cstring>hdrBuddy</cstring>
+ </property>
+ <property name="text">
+ <string>Headers</string>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="8" column="0">
+ <property name="name">
+ <cstring>libBuddy</cstring>
+ </property>
+ <property name="text">
+ <string>Libraries</string>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="9" column="0">
+ <property name="name">
+ <cstring>plgBuddy</cstring>
+ </property>
+ <property name="text">
+ <string>Plugins</string>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="5" column="0">
+ <property name="name">
+ <cstring>binBuddy</cstring>
+ </property>
+ <property name="text">
+ <string>Binaries</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="TQWidget">
+ <property name="name">
+ <cstring>verifyMods</cstring>
+ </property>
+ <attribute name="title">
+ <string>&lt;b&gt;Verify Modifications&lt;/b&gt;</string>
+ </attribute>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;&lt;b&gt;Current Library File:&lt;/b&gt; %1&lt;/p&gt;
+&lt;table border=0&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;New Installation Prefix:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Binaries Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%3&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Documentation Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%4&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Headers Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%5&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Libraries Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%6&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Plugins Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%7&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td&gt;&lt;b&gt;Data Path:&lt;/b&gt;&lt;/td&gt;&lt;td&gt;%8&lt;/td&gt;&lt;/tr&gt;
+&lt;/table&gt;
+&lt;p&gt;Please verify that these options are correct. Press the &lt;i&gt;Finish&lt;/i&gt; button to apply these modifications to the TQt library. Use the &lt;i&gt;Back&lt;/i&gt; button to make corrections. Use the &lt;i&gt;Cancel&lt;/i&gt; button to abort.&lt;/p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>autoSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>binPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autoSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>docPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autoSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>hdrPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autoSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>libPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autoSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>plgPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autoSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>datPath</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>libFilename</sender>
+ <signal>textChanged(const TQString&amp;)</signal>
+ <receiver>Distributor</receiver>
+ <slot>checkLibFilename(const TQString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>libBrowseButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Distributor</receiver>
+ <slot>browseLibFilename()</slot>
+ </connection>
+ <connection>
+ <sender>prefixPath</sender>
+ <signal>textChanged(const TQString&amp;)</signal>
+ <receiver>Distributor</receiver>
+ <slot>checkInstallationPrefix(const TQString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>prefixBrowseButton</sender>
+ <signal>clicked()</signal>
+ <receiver>Distributor</receiver>
+ <slot>browseInstallationPrefix()</slot>
+ </connection>
+ <connection>
+ <sender>autoSet</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Distributor</receiver>
+ <slot>toggleAutoSet(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>libFilename</tabstop>
+ <tabstop>libBrowseButton</tabstop>
+ <tabstop>prefixPath</tabstop>
+ <tabstop>prefixBrowseButton</tabstop>
+ <tabstop>autoSet</tabstop>
+ <tabstop>binPath</tabstop>
+ <tabstop>docPath</tabstop>
+ <tabstop>hdrPath</tabstop>
+ <tabstop>libPath</tabstop>
+ <tabstop>plgPath</tabstop>
+ <tabstop>datPath</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">distributor.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">TQTimer *timer;</variable>
+</variables>
+<slots>
+ <slot>checkLibFilename( const TQString &amp; filename )</slot>
+ <slot>browseLibFilename()</slot>
+ <slot>checkLibData()</slot>
+ <slot>checkInstallationPrefix( const TQString &amp;filename )</slot>
+ <slot>browseInstallationPrefix()</slot>
+ <slot>toggleAutoSet( bool autoset )</slot>
+ <slot>accept()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function>showPage( TQWidget * page )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/distributor/distributor.ui.h b/examples/distributor/distributor.ui.h
new file mode 100644
index 000000000..c927cda5e
--- /dev/null
+++ b/examples/distributor/distributor.ui.h
@@ -0,0 +1,383 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** TQt 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.
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qeventloop.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qfileinfo.h>
+#include <qlineedit.h>
+#include <qmessagebox.h>
+#include <qpushbutton.h>
+#include <qtimer.h>
+
+
+void Distributor::init()
+{
+ timer = new TQTimer( this );
+ connect( timer, SIGNAL(timeout()), SLOT(checkLibData()) );
+
+ cancelButton()->setAutoDefault( FALSE );
+ backButton()->setAutoDefault( FALSE );
+
+ setNextEnabled( selectLibrary, FALSE );
+
+ setHelpEnabled( selectLibrary, FALSE );
+ setHelpEnabled( modifyPaths, FALSE );
+ setHelpEnabled( verifyMods, FALSE );
+
+ setFinishEnabled( verifyMods, TRUE );
+}
+
+void Distributor::showPage( TQWidget *page )
+{
+ if ( page == selectLibrary ) {
+ nextButton()->setDefault( TRUE );
+ libFilename->setFocus();
+ } else if ( page == modifyPaths ) {
+ nextButton()->setDefault( TRUE );
+ prefixPath->selectAll();
+ prefixPath->setFocus();
+ } else if ( page == verifyMods ) {
+ finishButton()->setDefault( TRUE );
+ finishButton()->setFocus();
+
+ TQString labeltext =
+ tr("<p><b>Current Library File:</b> %1</p>"
+ "<table border=0>"
+ "<tr><td><b>New Installation Prefix:</b></td><td>%2</td></tr>"
+ "<tr><td></td><td></td></tr>"
+ "<tr><td><b>Binaries Path:</b></td><td>%3</td></tr>"
+ "<tr><td><b>Documentation Path:</b></td><td>%4</td></tr>"
+ "<tr><td><b>Headers Path:</b></td><td>%5</td></tr>"
+ "<tr><td><b>Libraries Path:</b></td><td>%6</td></tr>"
+ "<tr><td><b>Plugins Path:</b></td><td>%7</td></tr>"
+ "<tr><td><b>Data Path:</b></td><td>%8</td></tr>"
+ "</table>"
+ "<p>Please verify that these options are correct. Press the "
+ "<i>Finish</i> button to apply these modifications to the TQt "
+ "library. Use the <i>Back</i> button to make corrections. Use "
+ "the <i>Cancel</i> button to abort.</p>")
+ .arg( libFilename->text() )
+ .arg( prefixPath->text() )
+ .arg( binPath->text() )
+ .arg( docPath->text() )
+ .arg( hdrPath->text() )
+ .arg( libPath->text() )
+ .arg( plgPath->text() )
+ .arg( datPath->text() );
+ textLabel4->setText( labeltext );
+ }
+
+ TQWizard::showPage( page );
+}
+
+void Distributor::checkLibFilename( const TQString &filename )
+{
+ setNextEnabled( selectLibrary, FALSE );
+
+ TQFileInfo fileinfo( filename );
+ if ( ! filename.isEmpty() && fileinfo.exists() &&
+ fileinfo.isReadable() && fileinfo.isWritable() &&
+ fileinfo.isFile() && !fileinfo.isSymLink() )
+ timer->start( 500, TRUE );
+}
+
+void Distributor::browseLibFilename()
+{
+ TQString filename =
+ TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
+ libFilename->setText( filename );
+}
+
+static char *find_pattern( char *h, const char *n, ulong hlen )
+{
+ if ( ! h || ! n || hlen == 0 )
+ return 0;
+
+#ifdef Q_OS_UNIX
+ size_t nlen;
+#else
+ ulong nlen;
+#endif
+
+ char nc = *n++;
+ nlen = strlen( n );
+ char hc;
+
+ do {
+ do {
+ hc = *h++;
+ if ( hlen-- < 1 )
+ return 0;
+ } while ( hc != nc );
+
+ if ( nlen > hlen )
+ return 0;
+ } while ( qstrncmp( h, n, nlen ) != 0 );
+ return h + nlen;
+}
+
+void Distributor::checkLibData()
+{
+ struct step {
+ const char *key;
+ TQCString value;
+ bool done;
+ } steps[7];
+
+ steps[0].key = "qt_nstpath=";
+ steps[0].done = FALSE;
+
+ steps[1].key = "qt_binpath=";
+ steps[1].done = FALSE;
+
+ steps[2].key = "qt_docpath=";
+ steps[2].done = FALSE;
+
+ steps[3].key = "qt_hdrpath=";
+ steps[3].done = FALSE;
+
+ steps[4].key = "qt_libpath=";
+ steps[4].done = FALSE;
+
+ steps[5].key = "qt_plgpath=";
+ steps[5].done = FALSE;
+
+ steps[6].key = "qt_datpath=";
+ steps[6].done = FALSE;
+
+ uint completed = 0;
+ uint total_steps = sizeof(steps) / sizeof(step);
+
+ TQFile file( libFilename->text() );
+ if ( file.open( IO_ReadOnly ) ) {
+ TQApplication::setOverrideCursor( WaitCursor );
+
+ // instead of reading in the entire file, do the search in chunks
+ char data[60000];
+ ulong offset = 0;
+
+ while ( ! file.atEnd() && completed < total_steps ) {
+ TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput );
+
+ ulong len = file.readBlock( data, sizeof(data) );
+ if ( len < 267 ) {
+ // not enough room to make any modifications... stop
+ break;
+ }
+
+ for ( uint x = 0; x < total_steps; ++x ) {
+ if ( steps[x].done ) continue;
+
+ char *s = find_pattern( data, steps[x].key, len );
+ if ( s ) {
+ ulong where = s - data;
+ if ( len - where < 256 ) {
+ // not enough space left to write the full
+ // path... move the file pointer back to just
+ // before the pattern and continue
+ offset += where - 11;
+ file.at( offset );
+ len = file.readBlock( data, sizeof(data) );
+ --x; // retry the current step
+ continue;
+ }
+
+ steps[x].value = s;
+ steps[x].done = TRUE;
+
+ ++completed;
+ }
+ }
+
+ // move to the new read position
+ offset += len - 11;
+ file.at( offset );
+ }
+
+ file.close();
+
+ TQApplication::restoreOverrideCursor();
+ }
+
+ if ( completed == total_steps ) {
+ setNextEnabled( selectLibrary, TRUE );
+
+ TQString prefix = TQFile::decodeName( steps[0].value );
+ prefixPath->setText( prefix );
+
+ TQString def_bin = prefix + TQString::fromLatin1( "/bin" );
+ TQString def_doc = prefix + TQString::fromLatin1( "/doc" );
+ TQString def_hdr = prefix + TQString::fromLatin1( "/include" );
+ TQString def_lib = prefix + TQString::fromLatin1( "/lib" );
+ TQString def_plg = prefix + TQString::fromLatin1( "/plugins" );
+ TQString def_dat = prefix;
+
+ TQString bin = TQFile::decodeName( steps[1].value );
+ TQString doc = TQFile::decodeName( steps[2].value );
+ TQString hdr = TQFile::decodeName( steps[3].value );
+ TQString lib = TQFile::decodeName( steps[4].value );
+ TQString plg = TQFile::decodeName( steps[5].value );
+ TQString dat = TQFile::decodeName( steps[6].value );
+
+ autoSet->setChecked( def_bin == bin &&
+ def_doc == doc &&
+ def_hdr == hdr &&
+ def_lib == lib &&
+ def_plg == plg &&
+ def_dat == dat );
+
+ if ( ! autoSet->isChecked() ) {
+ binPath->setText( bin );
+ docPath->setText( doc );
+ hdrPath->setText( hdr );
+ libPath->setText( lib );
+ plgPath->setText( plg );
+ datPath->setText( dat );
+ }
+ }
+}
+
+void Distributor::checkInstallationPrefix( const TQString &prefix )
+{
+ if ( autoSet->isChecked() ) {
+ binPath->setText( prefix + TQString::fromLatin1( "/bin" ) );
+ docPath->setText( prefix + TQString::fromLatin1( "/doc" ) );
+ hdrPath->setText( prefix + TQString::fromLatin1( "/include" ) );
+ libPath->setText( prefix + TQString::fromLatin1( "/lib" ) );
+ plgPath->setText( prefix + TQString::fromLatin1( "/plugins" ) );
+ datPath->setText( prefix );
+ }
+}
+
+void Distributor::browseInstallationPrefix()
+{
+ TQString prefix =
+ TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
+ prefixPath->setText( prefix );
+}
+
+
+void Distributor::toggleAutoSet( bool autoset )
+{
+ if ( autoset ) checkInstallationPrefix( prefixPath->text() );
+}
+
+void Distributor::accept()
+{
+ struct step {
+ const char *key;
+ TQCString value;
+ bool done;
+ } steps[7];
+
+ steps[0].key = "qt_nstpath=";
+ steps[0].value = TQFile::encodeName( prefixPath->text() );
+ steps[0].done = FALSE;
+
+ steps[1].key = "qt_binpath=";
+ steps[1].value = TQFile::encodeName( binPath->text() );
+ steps[1].done = FALSE;
+
+ steps[2].key = "qt_docpath=";
+ steps[2].value = TQFile::encodeName( docPath->text() );
+ steps[2].done = FALSE;
+
+ steps[3].key = "qt_hdrpath=";
+ steps[3].value = TQFile::encodeName( hdrPath->text() );
+ steps[3].done = FALSE;
+
+ steps[4].key = "qt_libpath=";
+ steps[4].value = TQFile::encodeName( libPath->text() );
+ steps[4].done = FALSE;
+
+ steps[5].key = "qt_plgpath=";
+ steps[5].value = TQFile::encodeName( plgPath->text() );
+ steps[5].done = FALSE;
+
+ steps[6].key = "qt_datpath=";
+ steps[6].value = TQFile::encodeName( datPath->text() );
+ steps[6].done = FALSE;
+
+ uint completed = 0;
+ uint total_steps = sizeof(steps) / sizeof(step);
+
+ TQFile file( libFilename->text() );
+ if ( file.open( IO_ReadWrite ) ) {
+ TQApplication::setOverrideCursor( WaitCursor );
+
+ // instead of reading in the entire file, do the search in chunks
+ char data[60000];
+ ulong offset = 0;
+
+ while ( ! file.atEnd() && completed < total_steps ) {
+ TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput );
+
+ ulong len = file.readBlock( data, sizeof(data) );
+ if ( len < 267 ) {
+ // not enough room to make any modifications... stop
+ break;
+ }
+
+ uint completed_save = completed;
+ for ( uint x = 0; x < total_steps; ++x ) {
+ if ( steps[x].done ) continue;
+
+ char *s = find_pattern( data, steps[x].key, len );
+ if ( s ) {
+ ulong where = s - data;
+ if ( len - where < 256 ) {
+ // not enough space left to write the full
+ // path... move the file pointer back to just
+ // before the pattern and continue
+ offset += where - 11;
+ file.at( offset );
+ len = file.readBlock( data, sizeof(data) );
+ --x; // retry the current step
+ continue;
+ }
+
+ qstrcpy( s, steps[x].value );
+ steps[x].done = TRUE;
+
+ ++completed;
+ }
+ }
+
+ if ( completed != completed_save ) {
+ // something changed... move file pointer back to
+ // where the data was read and write the new data
+ file.at( offset );
+ file.writeBlock( data, len );
+ }
+
+ // move to the new read position
+ offset += len - 11;
+ file.at( offset );
+ }
+
+ file.close();
+
+ TQApplication::restoreOverrideCursor();
+ }
+
+ if ( completed != total_steps ) {
+ TQMessageBox::information( this,
+ tr("TQt Distribution Wizard"),
+ tr("<p><h3>Modifications failed.</h3></p>"
+ "<p>Please make sure that you have permission "
+ "to write the selected file, and that the library "
+ "is properly built.</p>") );
+ return;
+ }
+
+ TQWizard::accept();
+}
diff --git a/examples/distributor/main.cpp b/examples/distributor/main.cpp
new file mode 100644
index 000000000..2a8a30cbe
--- /dev/null
+++ b/examples/distributor/main.cpp
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "distributor.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ Distributor w;
+ w.show();
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) );
+ return a.exec();
+}
diff --git a/examples/dragdrop/dragdrop.doc b/examples/dragdrop/dragdrop.doc
new file mode 100644
index 000000000..25d3170aa
--- /dev/null
+++ b/examples/dragdrop/dragdrop.doc
@@ -0,0 +1,14 @@
+/*! \page dragdrop-example.html
+
+ \ingroup examples
+ \title Drag and Drop
+
+ This program demonstrates Qt's drag and drop functionality.
+
+ See $QTDIR/examples/dragdrop for the source code.
+
+*/
+
+
+
+
diff --git a/examples/dragdrop/dragdrop.pro b/examples/dragdrop/dragdrop.pro
new file mode 100644
index 000000000..e560fbf96
--- /dev/null
+++ b/examples/dragdrop/dragdrop.pro
@@ -0,0 +1,13 @@
+TEMPLATE = app
+TARGET = dragdrop
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = dropsite.h \
+ secret.h
+SOURCES = dropsite.cpp \
+ main.cpp \
+ secret.cpp
diff --git a/examples/dragdrop/dropsite.cpp b/examples/dragdrop/dropsite.cpp
new file mode 100644
index 000000000..a1df3de21
--- /dev/null
+++ b/examples/dragdrop/dropsite.cpp
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Drop site example implementation
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "dropsite.h"
+#include "secret.h"
+#include <qevent.h>
+#include <qpixmap.h>
+#include <qdragobject.h>
+#include <qimage.h>
+#include <qdir.h>
+
+
+DropSite::DropSite( TQWidget * parent, const char * name )
+ : TQLabel( parent, name )
+{
+ setAcceptDrops(TRUE);
+}
+
+
+DropSite::~DropSite()
+{
+ // nothing necessary
+}
+
+
+void DropSite::dragMoveEvent( TQDragMoveEvent *e )
+{
+ // Check if you want the drag at e->pos()...
+ // Give the user some feedback - only copy is possible
+ e->acceptAction( e->action() == TQDropEvent::Copy );
+}
+
+
+void DropSite::dragEnterEvent( TQDragEnterEvent *e )
+{
+ // Check if you want the drag...
+ if ( SecretDrag::canDecode( e )
+ || TQTextDrag::canDecode( e )
+ || TQImageDrag::canDecode( e )
+ || TQUriDrag::canDecode( e ) )
+ {
+ e->accept();
+ }
+
+
+ // Give the user some feedback...
+ TQString t;
+ const char *f;
+ for( int i=0; (f=e->format( i )); i++ ) {
+ if ( *(f) ) {
+ if ( !t.isEmpty() )
+ t += "\n";
+ t += f;
+ }
+ }
+ emit message( t );
+ setBackgroundColor(white);
+}
+
+void DropSite::dragLeaveEvent( TQDragLeaveEvent * )
+{
+ // Give the user some feedback...
+ emit message("");
+ setBackgroundColor(lightGray);
+}
+
+
+void DropSite::dropEvent( TQDropEvent * e )
+{
+ setBackgroundColor(lightGray);
+
+ // Try to decode to the data you understand...
+ TQStrList strings;
+ if ( TQUriDrag::decode( e, strings ) ) {
+ TQString m("Full URLs:\n");
+ for (const char* u=strings.first(); u; u=strings.next())
+ m = m + " " + u + '\n';
+ TQStringList files;
+ if ( TQUriDrag::decodeLocalFiles( e, files ) ) {
+ m += "Files:\n";
+ for (TQStringList::Iterator i=files.begin(); i!=files.end(); ++i)
+ m = m + " " + TQDir::convertSeparators(*i) + '\n';
+ }
+ setText( m );
+ setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+ return;
+ }
+
+ TQString str;
+ if ( TQTextDrag::decode( e, str ) ) {
+ setText( str );
+ setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+ return;
+ }
+
+ TQPixmap pm;
+ if ( TQImageDrag::decode( e, pm ) ) {
+ setPixmap( pm );
+ setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+ return;
+ }
+
+ if ( SecretDrag::decode( e, str ) ) {
+ setText( str );
+ setMinimumSize( minimumSize().expandedTo( sizeHint() ) );
+ return;
+ }
+}
+
+DragMoviePlayer::DragMoviePlayer( TQDragObject* p ) :
+ TQObject(p),
+ dobj(p),
+ movie("trolltech.gif" )
+{
+ movie.connectUpdate(this,SLOT(updatePixmap(const TQRect&)));
+}
+
+void DragMoviePlayer::updatePixmap( const TQRect& )
+{
+ dobj->setPixmap(movie.framePixmap());
+}
+
+void DropSite::mousePressEvent( TQMouseEvent * /*e*/ )
+{
+ TQDragObject *drobj;
+ if ( pixmap() ) {
+ drobj = new TQImageDrag( pixmap()->convertToImage(), this );
+#if 1
+ TQPixmap pm;
+ pm.convertFromImage(pixmap()->convertToImage().smoothScale(
+ pixmap()->width()/3,pixmap()->height()/3));
+ drobj->setPixmap(pm,TQPoint(-5,-7));
+#else
+ // Try it.
+ (void)new DragMoviePlayer(drobj);
+#endif
+ } else {
+ drobj = new TQTextDrag( text(), this );
+ }
+ drobj->dragCopy();
+}
+
+
+void DropSite::backgroundColorChange( const TQColor & )
+{
+ // Reduce flicker by using repaint() rather than update()
+ repaint();
+}
diff --git a/examples/dragdrop/dropsite.h b/examples/dragdrop/dropsite.h
new file mode 100644
index 000000000..0179c5497
--- /dev/null
+++ b/examples/dragdrop/dropsite.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Drop site example implementation
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef DROPSITE_H
+#define DROPSITE_H
+
+#include <qlabel.h>
+#include <qmovie.h>
+#include "qdropsite.h"
+
+class TQDragObject;
+
+class DropSite: public TQLabel
+{
+ Q_OBJECT
+public:
+ DropSite( TQWidget * parent = 0, const char * name = 0 );
+ ~DropSite();
+
+signals:
+ void message( const TQString& );
+
+protected:
+ void dragEnterEvent( TQDragEnterEvent * );
+ void dragMoveEvent( TQDragMoveEvent * );
+ void dragLeaveEvent( TQDragLeaveEvent * );
+ void dropEvent( TQDropEvent * );
+ void backgroundColorChange( const TQColor& );
+
+ // this is a normal even
+ void mousePressEvent( TQMouseEvent * );
+};
+
+class DragMoviePlayer : public TQObject {
+ Q_OBJECT
+ TQDragObject* dobj;
+ TQMovie movie;
+public:
+ DragMoviePlayer(TQDragObject*);
+private slots:
+ void updatePixmap( const TQRect& );
+};
+
+
+#endif
diff --git a/examples/dragdrop/main.cpp b/examples/dragdrop/main.cpp
new file mode 100644
index 000000000..539c8251a
--- /dev/null
+++ b/examples/dragdrop/main.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Ritual main() for TQt applications
+**
+** Copyright (C) 1996-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "dropsite.h"
+#include "secret.h"
+#include <qlayout.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+
+static void addStuff( TQWidget * parent, bool image, bool secret = FALSE )
+{
+ TQVBoxLayout * tll = new TQVBoxLayout( parent, 10 );
+ DropSite * d = new DropSite( parent );
+ d->setFrameStyle( TQFrame::Sunken + TQFrame::WinPanel );
+ tll->addWidget( d );
+ if ( image ) {
+ TQPixmap stuff;
+ if ( !stuff.load( "trolltech.bmp" ) ) {
+ stuff = TQPixmap(20,20);
+ stuff.fill(TQt::green);
+ }
+ d->setPixmap( stuff );
+ } else {
+ d->setText("Drag and Drop");
+ }
+ d->setFont(TQFont("Helvetica",18));
+ if ( secret ) {
+ SecretSource *s = new SecretSource( 42, parent );
+ tll->addWidget( s );
+ }
+
+ TQLabel * format = new TQLabel( "\n\n\n\nNone\n\n\n\n", parent );
+ tll->addWidget( format );
+ tll->activate();
+ parent->resize( parent->sizeHint() );
+
+ TQObject::connect( d, SIGNAL(message(const TQString&)),
+ format, SLOT(setText(const TQString&)) );
+}
+
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+
+ TQWidget mw;
+ addStuff( &mw, TRUE );
+ mw.setCaption( "TQt Example - Drag and Drop" );
+ mw.show();
+
+ TQWidget mw2;
+ addStuff( &mw2, FALSE );
+ mw2.setCaption( "TQt Example - Drag and Drop" );
+ mw2.show();
+
+ TQWidget mw3;
+ addStuff( &mw3, TRUE, TRUE );
+ mw3.setCaption( "TQt Example - Drag and Drop" );
+ mw3.show();
+
+ TQObject::connect(qApp,SIGNAL(lastWindowClosed()),qApp,SLOT(tquit()));
+ return a.exec();
+}
diff --git a/examples/dragdrop/secret.cpp b/examples/dragdrop/secret.cpp
new file mode 100644
index 000000000..c90e52816
--- /dev/null
+++ b/examples/dragdrop/secret.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Custom MIME type implementation example
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "secret.h"
+#include <qevent.h>
+
+
+//create the object withe the secret byte
+SecretDrag::SecretDrag( uchar secret, TQWidget * parent, const char * name )
+ : TQStoredDrag( "secret/magic", parent, name )
+{
+ TQByteArray data(1);
+ data[0]= secret;
+ setEncodedData( data );
+}
+
+
+bool SecretDrag::canDecode( TQDragMoveEvent* e )
+{
+ return e->provides( "secret/magic" );
+}
+
+//decode it into a string
+bool SecretDrag::decode( TQDropEvent* e, TQString& str )
+{
+ TQByteArray payload = e->data( "secret/magic" );
+ if ( payload.size() ) {
+ e->accept();
+ TQString msg;
+ msg.sprintf("The secret number is %d", payload[0] );
+ str = msg;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+SecretSource::SecretSource( int secret, TQWidget *parent, const char * name )
+ : TQLabel( "Secret", parent, name )
+{
+ setBackgroundColor( blue.light() );
+ setFrameStyle( Box | Sunken );
+ setMinimumHeight( sizeHint().height()*2 );
+ setAlignment( AlignCenter );
+ mySecret = secret;
+}
+
+SecretSource::~SecretSource()
+{
+}
+
+/* XPM */
+static const char * picture_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000",
+"X c #FFFF00",
+" ..... ",
+" ..XXXXX.. ",
+" .XXXXXXXXX. ",
+" .XXXXXXXXXXX. ",
+" .XX..XXX..XX. ",
+".XXXXXXXXXXXXX. ",
+".XX...XXX...XX. ",
+".XXX..XXX..XXX. ",
+".XXXXXXXXXXXXX. ",
+".XXXXXX.XXXXXX. ",
+" .XX.XX.XX.XX. ",
+" .XXX..X..XXX. ",
+" .XXXXXXXXX. ",
+" ..XXXXX.. ",
+" ..... ",
+" "};
+
+void SecretSource::mousePressEvent( TQMouseEvent * /*e*/ )
+{
+ SecretDrag *sd = new SecretDrag( mySecret, this );
+ sd->setPixmap(TQPixmap(picture_xpm),TQPoint(8,8));
+ sd->dragCopy();
+ mySecret++;
+}
diff --git a/examples/dragdrop/secret.h b/examples/dragdrop/secret.h
new file mode 100644
index 000000000..5b027db81
--- /dev/null
+++ b/examples/dragdrop/secret.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Custom MIME type implementation example
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SECRETDRAG_H
+#define SECRETDRAG_H
+
+#include <qdragobject.h>
+#include <qlabel.h>
+
+class SecretDrag: public TQStoredDrag {
+public:
+ SecretDrag( uchar, TQWidget * parent = 0, const char * name = 0 );
+ ~SecretDrag() {};
+
+ static bool canDecode( TQDragMoveEvent* e );
+ static bool decode( TQDropEvent* e, TQString& s );
+};
+
+
+class SecretSource: public TQLabel
+{
+public:
+ SecretSource( int secret, TQWidget *parent = 0, const char * name = 0 );
+ ~SecretSource();
+
+protected:
+ void mousePressEvent( TQMouseEvent * );
+private:
+ int mySecret;
+};
+
+#endif
diff --git a/examples/dragdrop/trolltech.bmp b/examples/dragdrop/trolltech.bmp
new file mode 100644
index 000000000..220861e2e
--- /dev/null
+++ b/examples/dragdrop/trolltech.bmp
Binary files differ
diff --git a/examples/dragdrop/trolltech.gif b/examples/dragdrop/trolltech.gif
new file mode 100644
index 000000000..f674369ef
--- /dev/null
+++ b/examples/dragdrop/trolltech.gif
Binary files differ
diff --git a/examples/drawdemo/README b/examples/drawdemo/README
new file mode 100644
index 000000000..273004043
--- /dev/null
+++ b/examples/drawdemo/README
@@ -0,0 +1,2 @@
+The drawdemo program demonstrates several drawing functions and printer
+output.
diff --git a/examples/drawdemo/drawdemo.cpp b/examples/drawdemo/drawdemo.cpp
new file mode 100644
index 000000000..63211057e
--- /dev/null
+++ b/examples/drawdemo/drawdemo.cpp
@@ -0,0 +1,312 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qwidget.h>
+#include <qpainter.h>
+#include <qprinter.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qapplication.h>
+#include <math.h>
+
+//
+// First we define the functionality our demo should present
+// to the user. You might add different demo-modes if you wish so.
+//
+
+//
+// This function draws a color wheel.
+// The coordinate system x=(0..500), y=(0..500) spans the paint device.
+//
+
+void drawColorWheel( TQPainter *p )
+{
+ TQFont f( "times", 18, TQFont::Bold );
+ p->setFont( f );
+ p->setPen( TQt::black );
+ p->setWindow( 0, 0, 500, 500 ); // defines coordinate system
+
+ for ( int i=0; i<36; i++ ) { // draws 36 rotated rectangles
+
+ TQWMatrix matrix;
+ matrix.translate( 250.0F, 250.0F ); // move to center
+ matrix.shear( 0.0F, 0.3F ); // twist it
+ matrix.rotate( (float)i*10 ); // rotate 0,10,20,.. degrees
+ p->setWorldMatrix( matrix ); // use this world matrix
+
+ TQColor c;
+ c.setHsv( i*10, 255, 255 ); // rainbow effect
+ p->setBrush( c ); // solid fill with color c
+ p->drawRect( 70, -10, 80, 10 ); // draw the rectangle
+
+ TQString n;
+ n.sprintf( "H=%d", i*10 );
+ p->drawText( 80+70+5, 0, n ); // draw the hue number
+ }
+}
+
+
+//
+// This function draws a few lines of text using different fonts.
+//
+
+void drawFonts( TQPainter *p )
+{
+ static const char *fonts[] = { "Helvetica", "Courier", "Times", 0 };
+ static int sizes[] = { 10, 12, 18, 24, 36, 0 };
+ int f = 0;
+ int y = 0;
+ while ( fonts[f] ) {
+ int s = 0;
+ while ( sizes[s] ) {
+ TQFont font( fonts[f], sizes[s] );
+ p->setFont( font );
+ TQFontMetrics fm = p->fontMetrics();
+ y += fm.ascent();
+ p->drawText( 10, y, "Quartz Glyph Job Vex'd Cwm Finks" );
+ y += fm.descent();
+ s++;
+ }
+ f++;
+ }
+}
+
+
+//
+// This function draws some shapes
+//
+
+void drawShapes( TQPainter *p )
+{
+ TQBrush b1( TQt::blue );
+ TQBrush b2( TQt::green, TQt::Dense6Pattern ); // green 12% fill
+ TQBrush b3( TQt::NoBrush ); // void brush
+ TQBrush b4( TQt::CrossPattern ); // black cross pattern
+
+ p->setPen( TQt::red );
+ p->setBrush( b1 );
+ p->drawRect( 10, 10, 200, 100 );
+ p->setBrush( b2 );
+ p->drawRoundRect( 10, 150, 200, 100, 20, 20 );
+ p->setBrush( b3 );
+ p->drawEllipse( 250, 10, 200, 100 );
+ p->setBrush( b4 );
+ p->drawPie( 250, 150, 200, 100, 45*16, 90*16 );
+}
+
+
+typedef void (*draw_func)(TQPainter*);
+
+struct DrawThing {
+ draw_func f;
+ const char *name;
+};
+
+//
+// All previously implemented functions are collected
+// in the following "table".
+// If you implement different functionality, your new draw
+// function must be assigned here with a function pointer and
+// description.
+// Leave the zeros at the end, they will be used
+// as markers referring to the end of the array.
+//
+
+DrawThing ourDrawFunctions[] = {
+// name of the function, title presented to the user
+ { drawColorWheel, "Draw color wheel" },
+ { drawFonts, "Draw fonts" },
+ { drawShapes, "Draw shapes" },
+ { 0, 0 } };
+
+
+
+class DrawView : public TQWidget
+{
+ Q_OBJECT
+public:
+ DrawView();
+ ~DrawView();
+public slots:
+ void updateIt( int );
+ void printIt();
+protected:
+ void drawIt( TQPainter * );
+ void paintEvent( TQPaintEvent * );
+ void resizeEvent( TQResizeEvent * );
+private:
+ TQPrinter *printer;
+ TQButtonGroup *bgroup;
+ TQPushButton *print;
+ int drawindex;
+ int maxindex;
+};
+
+
+//
+// Construct the DrawView with buttons.
+//
+
+DrawView::DrawView()
+{
+ setCaption( "TQt Draw Demo Application" );
+ setBackgroundMode(PaletteBase);
+
+ // Create a button group to contain all buttons
+ bgroup = new TQButtonGroup( this );
+ bgroup->resize( 200, 200 );
+ connect( bgroup, SIGNAL(clicked(int)), SLOT(updateIt(int)) );
+
+ // Calculate the size for the radio buttons
+ int maxwidth = 80;
+ int maxheight = 10;
+ int i;
+ const char *n;
+ TQFontMetrics fm = bgroup->fontMetrics();
+
+ // Find out the longest function description.
+ // Here we make use of the last "0,0"-entry in the
+ // ourDrawFunctions-array.
+ for ( i=0; (n=ourDrawFunctions[i].name) != 0; i++ ) {
+ int w = fm.width( n );
+ maxwidth = TQMAX(w,maxwidth); // TQMAX is a macro defined in qglobal.h
+ // and returns the biggest of to values.
+ // Due to its macro nature one should use it with care and with
+ // constant parameters only.
+ }
+
+ maxwidth = maxwidth + 30; // allow 30 pixels for radiobuttons
+
+ for ( i=0; (n=ourDrawFunctions[i].name) != 0; i++ ) {
+ TQRadioButton *rb = new TQRadioButton( n, bgroup );
+ rb->setGeometry( 10, i*30+10, maxwidth, 30 );
+
+ maxheight += 30;
+
+ if ( i == 0 )
+ rb->setChecked( TRUE );
+ }
+
+ maxheight += 10; // maxheight is now 10 pixels upper margin
+ // plus number_of_drawfunctions * 30
+ // plus 10 pixels lower margin
+
+ drawindex = 0; // draw first thing
+ maxindex = i;
+
+ maxwidth += 20; // add some margin, this results in the
+ // final width of bgroup
+
+ bgroup->resize( maxwidth, maxheight ); // resize bgroup to its final size
+ // when no printersupport is provided
+
+
+// If -- at compile time -- printer support will be disabled,
+// we won't set up printing functionality.
+
+#ifndef QT_NO_PRINTER
+
+ printer = new TQPrinter;
+
+ // Create and setup the print button
+ print = new TQPushButton( "Print...", bgroup );
+ print->resize( 80, 30 );
+ print->move( maxwidth/2 - print->width()/2, maxindex*30+20 );
+ connect( print, SIGNAL(clicked()), SLOT(printIt()) );
+
+ // Resize bgroup to its final size when printersupport is given.
+ bgroup->resize( maxwidth, print->y()+print->height()+10 );
+
+#endif
+
+ resize( 640,300 );
+}
+
+//
+// Clean up.
+//
+DrawView::~DrawView()
+{
+#ifndef QT_NO_PRINTER
+ delete printer;
+#endif
+}
+
+//
+// Called when a radio button is clicked.
+//
+
+void DrawView::updateIt( int index )
+{
+ if ( index < maxindex ) {
+ drawindex = index;
+ update();
+ }
+}
+
+//
+// Calls the drawing function as specified by the radio buttons.
+//
+
+void DrawView::drawIt( TQPainter *p )
+{
+ (*ourDrawFunctions[drawindex].f)(p);
+}
+
+//
+// Called when the print button is clicked.
+//
+
+void DrawView::printIt()
+{
+ if ( printer->setup( this ) ) {
+ TQPainter paint;
+ if( !paint.begin( printer ) )
+ return;
+ drawIt( &paint );
+ }
+}
+
+//
+// Called when the widget needs to be updated.
+//
+
+void DrawView::paintEvent( TQPaintEvent * )
+{
+ TQPainter paint( this );
+ drawIt( &paint );
+}
+
+//
+// Called when the widget has been resized.
+// Moves the button group to the upper right corner
+// of the widget.
+
+void DrawView::resizeEvent( TQResizeEvent * )
+{
+ bgroup->move( width()-bgroup->width(), 0 );
+}
+
+
+//
+// Create and display our widget.
+//
+
+#include "drawdemo.moc"
+
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+ DrawView draw;
+ app.setMainWidget( &draw );
+ draw.setCaption("TQt Example - Drawdemo");
+ draw.show();
+ return app.exec();
+}
diff --git a/examples/drawdemo/drawdemo.doc b/examples/drawdemo/drawdemo.doc
new file mode 100644
index 000000000..f25bd7ee6
--- /dev/null
+++ b/examples/drawdemo/drawdemo.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page drawdemo-example.html
+
+ \ingroup examples
+ \title Draw Demo
+
+ This example demonstrates several drawing functions and printer output.
+ You can easily add you own drawing functions.
+
+ <hr>
+
+ Implementation:
+
+ \include drawdemo/drawdemo.cpp
+*/
+
diff --git a/examples/drawdemo/drawdemo.pro b/examples/drawdemo/drawdemo.pro
new file mode 100644
index 000000000..92d70c542
--- /dev/null
+++ b/examples/drawdemo/drawdemo.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = drawdemo
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = drawdemo.cpp
diff --git a/examples/drawlines/README b/examples/drawlines/README
new file mode 100644
index 000000000..2a7c577c6
--- /dev/null
+++ b/examples/drawlines/README
@@ -0,0 +1,3 @@
+The connect program connects points with lines. Drag the mouse
+inside the widget and release it. It was inspired by an example in a
+Windows book.
diff --git a/examples/drawlines/connect.cpp b/examples/drawlines/connect.cpp
new file mode 100644
index 000000000..cfd785ba7
--- /dev/null
+++ b/examples/drawlines/connect.cpp
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qwidget.h>
+#include <qpainter.h>
+#include <qapplication.h>
+#include <stdlib.h>
+
+
+const int MAXPOINTS = 2000; // maximum number of points
+const int MAXCOLORS = 40;
+
+
+//
+// ConnectWidget - draws connected lines
+//
+
+class ConnectWidget : public TQWidget
+{
+public:
+ ConnectWidget( TQWidget *parent=0, const char *name=0 );
+ ~ConnectWidget();
+protected:
+ void paintEvent( TQPaintEvent * );
+ void mousePressEvent( TQMouseEvent *);
+ void mouseReleaseEvent( TQMouseEvent *);
+ void mouseMoveEvent( TQMouseEvent *);
+private:
+ TQPoint *points; // point array
+ TQColor *colors; // color array
+ int count; // count = number of points
+ bool down; // TRUE if mouse down
+};
+
+
+//
+// Constructs a ConnectWidget.
+//
+
+ConnectWidget::ConnectWidget( TQWidget *parent, const char *name )
+ : TQWidget( parent, name, WStaticContents )
+{
+ setBackgroundColor( white ); // white background
+ count = 0;
+ down = FALSE;
+ points = new TQPoint[MAXPOINTS];
+ colors = new TQColor[MAXCOLORS];
+ for ( int i=0; i<MAXCOLORS; i++ ) // init color array
+ colors[i] = TQColor( rand()&255, rand()&255, rand()&255 );
+}
+
+ConnectWidget::~ConnectWidget()
+{
+ delete[] points; // cleanup
+ delete[] colors;
+}
+
+
+//
+// Handles paint events for the connect widget.
+//
+
+void ConnectWidget::paintEvent( TQPaintEvent * )
+{
+ TQPainter paint( this );
+ for ( int i=0; i<count-1; i++ ) { // connect all points
+ for ( int j=i+1; j<count; j++ ) {
+ paint.setPen( colors[rand()%MAXCOLORS] ); // set random pen color
+ paint.drawLine( points[i], points[j] ); // draw line
+ }
+ }
+}
+
+
+//
+// Handles mouse press events for the connect widget.
+//
+
+void ConnectWidget::mousePressEvent( TQMouseEvent * )
+{
+ down = TRUE;
+ count = 0; // start recording points
+ erase(); // erase widget contents
+}
+
+
+//
+// Handles mouse release events for the connect widget.
+//
+
+void ConnectWidget::mouseReleaseEvent( TQMouseEvent * )
+{
+ down = FALSE; // done recording points
+ update(); // draw the lines
+}
+
+
+//
+// Handles mouse move events for the connect widget.
+//
+
+void ConnectWidget::mouseMoveEvent( TQMouseEvent *e )
+{
+ if ( down && count < MAXPOINTS ) {
+ TQPainter paint( this );
+ points[count++] = e->pos(); // add point
+ paint.drawPoint( e->pos() ); // plot point
+ }
+}
+
+
+//
+// Create and display a ConnectWidget.
+//
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ ConnectWidget connect;
+#ifndef QT_NO_WIDGET_TOPEXTRA // for TQt/Embedded minimal build
+ connect.setCaption( "TQt Example - Draw lines");
+#endif
+ a.setMainWidget( &connect );
+ connect.show();
+ return a.exec();
+}
diff --git a/examples/drawlines/drawlines.doc b/examples/drawlines/drawlines.doc
new file mode 100644
index 000000000..f0abeec3b
--- /dev/null
+++ b/examples/drawlines/drawlines.doc
@@ -0,0 +1,20 @@
+
+/*
+*/
+/*! \page drawlines-example.html
+
+ \ingroup examples
+ \title Connect the Points
+
+ This example shows very simple mouse-based user interaction and
+ painting without any world transform matrix or other advanced
+ features. Run the program, click the button, move the mouse,
+ release the button, and watch the lines get drawn.
+
+ <hr>
+
+ Implementation:
+
+ \include drawlines/connect.cpp
+*/
+
diff --git a/examples/drawlines/drawlines.pro b/examples/drawlines/drawlines.pro
new file mode 100644
index 000000000..7c4eeb8c1
--- /dev/null
+++ b/examples/drawlines/drawlines.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+TARGET = drawlines
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+
+HEADERS =
+SOURCES = connect.cpp
diff --git a/examples/examples.pro b/examples/examples.pro
new file mode 100644
index 000000000..b9fe09ff2
--- /dev/null
+++ b/examples/examples.pro
@@ -0,0 +1,123 @@
+TEMPLATE = subdirs
+
+unix:!embedded:!mac:CONFIG += x11
+
+SUBDIRS = aclock \
+ action \
+ action/toggleaction \
+ addressbook \
+ application \
+ buttongroups \
+ checklists \
+ cursor \
+ customlayout \
+ dclock \
+ demo \
+ dirview \
+ distributor \
+ dragdrop \
+ drawdemo \
+ drawlines \
+ extension \
+ fonts \
+ forever \
+ gridview \
+ hello \
+ helpdemo \
+ helpviewer \
+ i18n \
+ layout \
+ life \
+ lineedits \
+ listboxcombo \
+ listbox \
+ listviews \
+ menu \
+ movies \
+ picture \
+ popup \
+ process \
+ progress \
+ progressbar \
+ qdir \
+ qfd \
+ qmag \
+ qtl \
+ qwerty \
+ rangecontrols \
+ richtext \
+ rot13 \
+ scribble \
+ scrollview \
+ showimg \
+ splitter \
+ tabdialog \
+ tetrix \
+ textedit \
+ themes \
+ tictac \
+ tooltip \
+ toplevel \
+ tux \
+ widgets \
+ wizard \
+ xform
+
+thread:SUBDIRS += thread/prodcons \
+ thread/semaphores
+
+canvas:SUBDIRS += canvas
+canvas:table:SUBDIRS += chart
+
+opengl:SUBDIRS += opengl/box \
+ opengl/gear \
+ opengl/glpixmap \
+ opengl/overlay \
+ opengl/sharedbox \
+ opengl/texture
+
+x11:nas:SUBDIRS += sound
+mac|win32:SUBDIRS += sound
+
+iconview:SUBDIRS += fileiconview \
+ iconview \
+ iconview/simple_dd
+
+
+network:SUBDIRS += network/archivesearch \
+ network/clientserver/client \
+ network/clientserver/server \
+ network/ftpclient \
+ network/httpd \
+ network/infoprotocol/infoclient \
+ network/infoprotocol/infoserver \
+ network/infoprotocol/infourlclient \
+ network/mail \
+ network/networkprotocol \
+ network/remotecontrol
+
+workspace:SUBDIRS+= mdi
+
+table:SUBDIRS += table/statistics \
+ table/small-table-demo \
+ regexptester \
+ table/bigtable \
+ helpsystem
+
+tablet:SUBDIRS += tablet
+
+sql:SUBDIRS += sql
+
+xml:SUBDIRS += xml/outliner \
+ xml/tagreader \
+ xml/tagreader-with-features
+
+embedded:SUBDIRS += launcher
+
+embedded:SUBDIRS -= showimg
+
+win32:SUBDIRS += trayicon
+embedded:SUBDIRS += trayicon
+
+x11:SUBDIRS += biff \
+ desktop
diff --git a/examples/extension/dialogform.ui b/examples/extension/dialogform.ui
new file mode 100644
index 000000000..edb70c76c
--- /dev/null
+++ b/examples/extension/dialogform.ui
@@ -0,0 +1,206 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>DialogForm</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>DialogForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>288</width>
+ <height>145</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Dialog</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>sessionsCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Save/Restore &amp;Sessions</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>loggingCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Log Activities</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</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="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>detailsPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Details &gt;&gt;&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</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>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DialogForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DialogForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>detailsPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DialogForm</receiver>
+ <slot>toggleDetails()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">extension.h</include>
+ <include location="local" impldecl="in implementation">dialogform.ui.h</include>
+</includes>
+<variables>
+ <variable>bool extensionShown;</variable>
+</variables>
+<slots>
+ <slot>toggleDetails()</slot>
+</slots>
+<functions>
+ <function access="private">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/extension/dialogform.ui.h b/examples/extension/dialogform.ui.h
new file mode 100644
index 000000000..d6f873f33
--- /dev/null
+++ b/examples/extension/dialogform.ui.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions use TQt 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 DialogForm::init()
+{
+ extensionShown = FALSE;
+ setExtension( new Extension( this ) );
+ setOrientation( Vertical );
+}
+
+
+void DialogForm::toggleDetails()
+{
+ extensionShown = !extensionShown;
+ showExtension( extensionShown );
+ TQString text = tr( "&Details " );
+ text += TQString( extensionShown ? "<<<" : ">>>" );
+ detailsPushButton->setText( text );
+}
diff --git a/examples/extension/extension.doc b/examples/extension/extension.doc
new file mode 100644
index 000000000..98b4a3373
--- /dev/null
+++ b/examples/extension/extension.doc
@@ -0,0 +1,41 @@
+/*!
+ \page extension-dialog-example.html
+
+ \ingroup step-by-step-examples
+
+
+ \title An Extension Dialog Example
+
+ This example demonstrates how to create an extension dialog.
+
+ Essentially all that is necessary is to create a standard dialog
+ and then create a QWidget form to be used as the extension. See
+ the article in \link http://doc.trolltech.com/qq/ Qt
+ Quarterly\endlink issue #3.
+
+
+ <hr>
+
+
+ Project file:
+
+ \include extension/extension.pro
+
+ <hr>
+
+ <hr>
+
+ Implementation:
+
+ \include extension/mainform.ui.h
+ \include extension/dialogform.ui.h
+ \include extension/extension.ui.h
+
+ <hr>
+
+ Main:
+
+ \include extension/main.cpp
+
+
+*/
diff --git a/examples/extension/extension.pro b/examples/extension/extension.pro
new file mode 100644
index 000000000..7cc65985a
--- /dev/null
+++ b/examples/extension/extension.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config nocrosscompiler
+
+SOURCES += main.cpp
+FORMS = mainform.ui \
+ dialogform.ui \
+ extension.ui
+DBFILE = extension.db
diff --git a/examples/extension/extension.ui b/examples/extension/extension.ui
new file mode 100644
index 000000000..32dcc48b7
--- /dev/null
+++ b/examples/extension/extension.ui
@@ -0,0 +1,114 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>Extension</class>
+<widget class="TQWidget">
+ <property name="name">
+ <cstring>Extension</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>258</width>
+ <height>128</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Extension</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Log &amp;File</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>logfileLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="TQLineEdit">
+ <property name="name">
+ <cstring>logfileLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>browsePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Browse...</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQButtonGroup">
+ <property name="name">
+ <cstring>ButtonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Log What?</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>logActionsCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Actions</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>logErrorsCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Errors</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<includes>
+ <include location="local" impldecl="in implementation">extension.ui.h</include>
+</includes>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/extension/extension.ui.h b/examples/extension/extension.ui.h
new file mode 100644
index 000000000..e43b8f3fd
--- /dev/null
+++ b/examples/extension/extension.ui.h
@@ -0,0 +1,7 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions use TQt 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.
+*****************************************************************************/
diff --git a/examples/extension/main.cpp b/examples/extension/main.cpp
new file mode 100644
index 000000000..608ef06a6
--- /dev/null
+++ b/examples/extension/main.cpp
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "mainform.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ MainForm *w = new MainForm;
+ w->show();
+ a.connect( &a, SIGNAL( lastWindowClosed() ), w, SLOT( tquit() ) );
+ return a.exec();
+}
diff --git a/examples/extension/mainform.ui b/examples/extension/mainform.ui
new file mode 100644
index 000000000..db156785b
--- /dev/null
+++ b/examples/extension/mainform.ui
@@ -0,0 +1,74 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MainForm</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>MainForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>284</width>
+ <height>120</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Main Form</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>optionsPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Options...</string>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>tquitPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>optionsPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MainForm</receiver>
+ <slot>optionsDlg()</slot>
+ </connection>
+ <connection>
+ <sender>tquitPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MainForm</receiver>
+ <slot>tquit()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">mainform.ui.h</include>
+</includes>
+<variables>
+ <variable>bool log_errors;</variable>
+ <variable>bool log_warnings;</variable>
+ <variable>bool log_actions;</variable>
+ <variable>bool logging;</variable>
+ <variable>bool sessions;</variable>
+ <variable>TQString log_filename;</variable>
+</variables>
+<slots>
+ <slot>optionsDlg()</slot>
+ <slot>tquit()</slot>
+</slots>
+<functions>
+ <function access="private">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/extension/mainform.ui.h b/examples/extension/mainform.ui.h
new file mode 100644
index 000000000..82fc700d0
--- /dev/null
+++ b/examples/extension/mainform.ui.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions use TQt 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.
+*****************************************************************************/
+#include "dialogform.h"
+#include "extension.h"
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+
+void MainForm::init()
+{
+ sessions = FALSE;
+ logging = FALSE;
+ log_filename = TQString::null;
+ log_errors = TRUE;
+ log_actions = TRUE;
+}
+
+void MainForm::optionsDlg()
+{
+ DialogForm *dlg = new DialogForm( this, "dialog", TRUE );
+ Extension *ext = (Extension*)dlg->extension()->qt_cast( "Extension" );
+ if ( !ext )
+ return;
+ dlg->sessionsCheckBox->setChecked( sessions );
+ dlg->loggingCheckBox->setChecked( logging );
+ ext->logfileLineEdit->setText( log_filename );
+ ext->logErrorsCheckBox->setChecked( log_errors );
+
+ if ( dlg->exec() ) {
+ sessions = dlg->sessionsCheckBox->isChecked();
+ logging = dlg->loggingCheckBox->isChecked();
+ log_filename = ext->logfileLineEdit->text();
+ log_errors = ext->logErrorsCheckBox->isChecked();
+ }
+}
+
+
+void MainForm::tquit()
+{
+ TQApplication::exit( 0 );
+}
diff --git a/examples/fileiconview/fileiconview.doc b/examples/fileiconview/fileiconview.doc
new file mode 100644
index 000000000..0bce6c406
--- /dev/null
+++ b/examples/fileiconview/fileiconview.doc
@@ -0,0 +1,44 @@
+/*
+*/
+/*! \page fileiconview-example.html
+
+ \ingroup examples
+ \title Simple Filemanager
+
+ This example implements a simple and not fully functional file manager using
+ a widget derived from QIconView to display the current directory.
+ To display the directory tree the
+ widget written in the <a href="dirview-example.html">dirview</a> example is
+ used.
+
+ <hr>
+
+ Header file of the file icon view:
+
+ \include fileiconview/qfileiconview.h
+
+ <hr>
+
+ Implementation of the file icon view:
+
+ \include fileiconview/qfileiconview.cpp
+
+ <hr>
+
+ Header file of the main window:
+
+ \include fileiconview/mainwindow.h
+
+ <hr>
+
+ Implementation of the main window:
+
+ \include fileiconview/mainwindow.cpp
+
+ <hr>
+
+ Main:
+
+ \include fileiconview/main.cpp
+*/
+
diff --git a/examples/fileiconview/fileiconview.pro b/examples/fileiconview/fileiconview.pro
new file mode 100644
index 000000000..48e972d7c
--- /dev/null
+++ b/examples/fileiconview/fileiconview.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+TARGET = fileiconview
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = iconview full-config
+
+HEADERS = mainwindow.h \
+ qfileiconview.h \
+ ../dirview/dirview.h
+SOURCES = main.cpp \
+ mainwindow.cpp \
+ qfileiconview.cpp \
+ ../dirview/dirview.cpp
diff --git a/examples/fileiconview/main.cpp b/examples/fileiconview/main.cpp
new file mode 100644
index 000000000..916ab1d1f
--- /dev/null
+++ b/examples/fileiconview/main.cpp
@@ -0,0 +1,26 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "mainwindow.h"
+#include "qfileiconview.h"
+
+#include <qapplication.h>
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ FileMainWindow mw;
+ mw.resize( 680, 480 );
+ a.setMainWidget( &mw );
+ mw.fileView()->setDirectory( "/" );
+ mw.show();
+ return a.exec();
+}
diff --git a/examples/fileiconview/mainwindow.cpp b/examples/fileiconview/mainwindow.cpp
new file mode 100644
index 000000000..c237f9aa6
--- /dev/null
+++ b/examples/fileiconview/mainwindow.cpp
@@ -0,0 +1,228 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "mainwindow.h"
+#include "qfileiconview.h"
+#include "../dirview/dirview.h"
+
+#include <qsplitter.h>
+#include <qprogressbar.h>
+#include <qlabel.h>
+#include <qstatusbar.h>
+#include <qtoolbar.h>
+#include <qcombobox.h>
+#include <qpixmap.h>
+#include <qtoolbutton.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+
+static const char* cdtoparent_xpm[]={
+ "15 13 3 1",
+ ". c None",
+ "* c #000000",
+ "a c #ffff99",
+ "..*****........",
+ ".*aaaaa*.......",
+ "***************",
+ "*aaaaaaaaaaaaa*",
+ "*aaaa*aaaaaaaa*",
+ "*aaa***aaaaaaa*",
+ "*aa*****aaaaaa*",
+ "*aaaa*aaaaaaaa*",
+ "*aaaa*aaaaaaaa*",
+ "*aaaa******aaa*",
+ "*aaaaaaaaaaaaa*",
+ "*aaaaaaaaaaaaa*",
+ "***************"};
+
+static const char* newfolder_xpm[] = {
+ "15 14 4 1",
+ " c None",
+ ". c #000000",
+ "+ c #FFFF00",
+ "@ c #FFFFFF",
+ " . ",
+ " ",
+ " . ",
+ " . . ",
+ " .... . . . ",
+ " .+@+@. . . ",
+ ".......... . .",
+ ".@+@+@+@+@.. ",
+ ".+@+@+@+@+. . ",
+ ".@+@+@+@+@. . ",
+ ".+@+@+@+@+. ",
+ ".@+@+@+@+@. ",
+ ".+@+@+@+@+. ",
+ "........... "};
+
+FileMainWindow::FileMainWindow()
+ : TQMainWindow()
+{
+ setup();
+}
+
+void FileMainWindow::show()
+{
+ TQMainWindow::show();
+}
+
+void FileMainWindow::setup()
+{
+ TQSplitter *splitter = new TQSplitter( this );
+
+ dirlist = new DirectoryView( splitter, "dirlist", TRUE );
+ dirlist->addColumn( "Name" );
+ dirlist->addColumn( "Type" );
+ Directory *root = new Directory( dirlist, "/" );
+ root->setOpen( TRUE );
+ splitter->setResizeMode( dirlist, TQSplitter::KeepSize );
+
+ fileview = new TQtFileIconView( "/", splitter );
+ fileview->setSelectionMode( TQIconView::Extended );
+
+ setCentralWidget( splitter );
+
+ TQToolBar *toolbar = new TQToolBar( this, "toolbar" );
+ setRightJustification( TRUE );
+
+ (void)new TQLabel( tr( " Path: " ), toolbar );
+
+ pathCombo = new TQComboBox( TRUE, toolbar );
+ pathCombo->setAutoCompletion( TRUE );
+ toolbar->setStretchableWidget( pathCombo );
+ connect( pathCombo, SIGNAL( activated( const TQString & ) ),
+ this, SLOT ( changePath( const TQString & ) ) );
+
+ toolbar->addSeparator();
+
+ TQPixmap pix;
+
+ pix = TQPixmap( cdtoparent_xpm );
+ upButton = new TQToolButton( pix, "One directory up", TQString::null,
+ this, SLOT( cdUp() ), toolbar, "cd up" );
+
+ pix = TQPixmap( newfolder_xpm );
+ mkdirButton = new TQToolButton( pix, "New Folder", TQString::null,
+ this, SLOT( newFolder() ), toolbar, "new folder" );
+
+ connect( dirlist, SIGNAL( folderSelected( const TQString & ) ),
+ fileview, SLOT ( setDirectory( const TQString & ) ) );
+ connect( fileview, SIGNAL( directoryChanged( const TQString & ) ),
+ this, SLOT( directoryChanged( const TQString & ) ) );
+ connect( fileview, SIGNAL( startReadDir( int ) ),
+ this, SLOT( slotStartReadDir( int ) ) );
+ connect( fileview, SIGNAL( readNextDir() ),
+ this, SLOT( slotReadNextDir() ) );
+ connect( fileview, SIGNAL( readDirDone() ),
+ this, SLOT( slotReadDirDone() ) );
+
+ setDockEnabled( DockLeft, FALSE );
+ setDockEnabled( DockRight, FALSE );
+
+ label = new TQLabel( statusBar() );
+ statusBar()->addWidget( label, 2, TRUE );
+ progress = new TQProgressBar( statusBar() );
+ statusBar()->addWidget( progress, 1, TRUE );
+
+ connect( fileview, SIGNAL( enableUp() ),
+ this, SLOT( enableUp() ) );
+ connect( fileview, SIGNAL( disableUp() ),
+ this, SLOT( disableUp() ) );
+ connect( fileview, SIGNAL( enableMkdir() ),
+ this, SLOT( enableMkdir() ) );
+ connect( fileview, SIGNAL( disableMkdir() ),
+ this, SLOT( disableMkdir() ) );
+}
+
+void FileMainWindow::setPathCombo()
+{
+ TQString dir = caption();
+ int i = 0;
+ bool found = FALSE;
+ for ( i = 0; i < pathCombo->count(); ++i ) {
+ if ( pathCombo->text( i ) == dir) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if ( found )
+ pathCombo->setCurrentItem( i );
+ else {
+ pathCombo->insertItem( dir );
+ pathCombo->setCurrentItem( pathCombo->count() - 1 );
+ }
+
+}
+
+void FileMainWindow::directoryChanged( const TQString &dir )
+{
+ setCaption( dir );
+ setPathCombo();
+}
+
+void FileMainWindow::slotStartReadDir( int dirs )
+{
+ label->setText( tr( " Reading Directory..." ) );
+ progress->reset();
+ progress->setTotalSteps( dirs );
+}
+
+void FileMainWindow::slotReadNextDir()
+{
+ int p = progress->progress();
+ progress->setProgress( ++p );
+}
+
+void FileMainWindow::slotReadDirDone()
+{
+ label->setText( tr( " Reading Directory Done." ) );
+ progress->setProgress( progress->totalSteps() );
+}
+
+void FileMainWindow::cdUp()
+{
+ TQDir dir = fileview->currentDir();
+ dir.cd( ".." );
+ fileview->setDirectory( dir );
+}
+
+void FileMainWindow::newFolder()
+{
+ fileview->newDirectory();
+}
+
+void FileMainWindow::changePath( const TQString &path )
+{
+ if ( TQFileInfo( path ).exists() )
+ fileview->setDirectory( path );
+ else
+ setPathCombo();
+}
+
+void FileMainWindow::enableUp()
+{
+ upButton->setEnabled( TRUE );
+}
+
+void FileMainWindow::disableUp()
+{
+ upButton->setEnabled( FALSE );
+}
+
+void FileMainWindow::enableMkdir()
+{
+ mkdirButton->setEnabled( TRUE );
+}
+
+void FileMainWindow::disableMkdir()
+{
+ mkdirButton->setEnabled( FALSE );
+}
diff --git a/examples/fileiconview/mainwindow.h b/examples/fileiconview/mainwindow.h
new file mode 100644
index 000000000..0d79fd61e
--- /dev/null
+++ b/examples/fileiconview/mainwindow.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef MAINWIN_H
+#define MAINWIN_H
+
+#include <qmainwindow.h>
+
+class TQtFileIconView;
+class DirectoryView;
+class TQProgressBar;
+class TQLabel;
+class TQComboBox;
+class TQToolButton;
+
+class FileMainWindow : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ FileMainWindow();
+
+ TQtFileIconView *fileView() { return fileview; }
+ DirectoryView *dirList() { return dirlist; }
+
+ void show();
+
+protected:
+ void setup();
+ void setPathCombo();
+
+ TQtFileIconView *fileview;
+ DirectoryView *dirlist;
+ TQProgressBar *progress;
+ TQLabel *label;
+ TQComboBox *pathCombo;
+ TQToolButton *upButton, *mkdirButton;
+
+protected slots:
+ void directoryChanged( const TQString & );
+ void slotStartReadDir( int dirs );
+ void slotReadNextDir();
+ void slotReadDirDone();
+ void cdUp();
+ void newFolder();
+ void changePath( const TQString &path );
+ void enableUp();
+ void disableUp();
+ void enableMkdir();
+ void disableMkdir();
+
+};
+
+#endif
diff --git a/examples/fileiconview/qfileiconview.cpp b/examples/fileiconview/qfileiconview.cpp
new file mode 100644
index 000000000..2f7950f77
--- /dev/null
+++ b/examples/fileiconview/qfileiconview.cpp
@@ -0,0 +1,835 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qfileiconview.h"
+#include <qpainter.h>
+#include <qstringlist.h>
+#include <qpixmap.h>
+#include <qmime.h>
+#include <qstrlist.h>
+#include <qdragobject.h>
+#include <qmessagebox.h>
+#include <qevent.h>
+#include <qpopupmenu.h>
+#include <qcursor.h>
+#include <qapplication.h>
+#include <qwmatrix.h>
+
+#include <stdlib.h>
+
+static const char * file_icon[]={
+ "32 32 17 1",
+ "# c #000000",
+ "a c #ffffff",
+ "j c #808080",
+ "n c #a0a0a4",
+ "g c #c0c0c0",
+ "m c #004000",
+ "o c #000000",
+ "l c #004040",
+ "k c #404000",
+ "i c #c0c000",
+ "h c #ffff00",
+ "b c #ffffc0",
+ "e c #ff8000",
+ "f c #c05800",
+ "c c #ffa858",
+ "d c #ffdca8",
+ ". c None",
+ "................................",
+ "................................",
+ "................................",
+ "................................",
+ ".............#....###...........",
+ "...###......#a##.#aba##.........",
+ "..#cdb#....#aaaa#aaaaaa##.......",
+ "..#ecdb#..#aaaa#aaaaaaaba##.....",
+ "..#fecdb##aaaa#aaaaaaaaaaab##...",
+ "...#fecdb#aaa#aaaaaaabaabaaaa##.",
+ "....#fecdb#a#baaaaa#baaaaaabaaa#",
+ ".....#fecdb#aaaaab#a##baaaaaaa#.",
+ ".....##fecdb#bbba#aaaa##baaab#..",
+ "....#bb#fecdb#ba#aaaaaaa##aa#...",
+ "...#bbbb#fecdb##aaabaaaaaa##....",
+ "..#bbbb#b#fecdb#aaaaaaabaaaa##..",
+ ".#bbbb#bbb#fecdg#aaaaaaaaaaaba#.",
+ "#hhbb#bbbbb#fegg#iiaaaaaaaaaaaa#",
+ "#jhhhklibbbk#ggj#aaiiaaaaaaaaa#j",
+ ".#mjhhhkmikab####aaabiiaaaaaa#j.",
+ "...##jhhhmaaibbaaiibaaaiiaab#n..",
+ ".....##j#baaaiiabaaiibaabaa#n...",
+ "......##baibaabiibaaaiiabb#j....",
+ "......#bbbbiiaabbiiaaaaabon.....",
+ ".....#bbbbbbbiiabbaiiaab#n......",
+ ".....#jbbbbbbbbiibaabba#n.......",
+ "......##jbbbbbbbbiiaabmj........",
+ "........##jbbbbbbbbbb#j.........",
+ "..........##nbbbbbbbmj..........",
+ "............##jbbbb#j...........",
+ "..............#mjj#n............",
+ "................##n............."};
+
+static const char * folder_icon[]={
+ "32 32 11 1",
+ "# c #000000",
+ "b c #c0c000",
+ "d c #585858",
+ "a c #ffff00",
+ "i c #400000",
+ "h c #a0a0a4",
+ "e c #000000",
+ "c c #ffffff",
+ "f c #303030",
+ "g c #c0c0c0",
+ ". c None",
+ "...###..........................",
+ "...#aa##........................",
+ ".###baaa##......................",
+ ".#cde#baaa##....................",
+ ".#cccdeebaaa##..##f.............",
+ ".#cccccdeebaaa##aaa##...........",
+ ".#cccccccdeebaaaaaaaa##.........",
+ ".#cccccccccdeebababaaa#.........",
+ ".#cccccgcgghhebbbbbbbaa#........",
+ ".#ccccccgcgggdebbbbbbba#........",
+ ".#cccgcgcgcgghdeebiebbba#.......",
+ ".#ccccgcggggggghdeddeeba#.......",
+ ".#cgcgcgcggggggggghghdebb#......",
+ ".#ccgcggggggggghghghghd#b#......",
+ ".#cgcgcggggggggghghghhd#b#......",
+ ".#gcggggggggghghghhhhhd#b#......",
+ ".#cgcggggggggghghghhhhd#b#......",
+ ".#ggggggggghghghhhhhhhdib#......",
+ ".#gggggggggghghghhhhhhd#b#......",
+ ".#hhggggghghghhhhhhhhhd#b#......",
+ ".#ddhhgggghghghhhhhhhhd#b#......",
+ "..##ddhhghghhhhhhhhhhhdeb#......",
+ "....##ddhhhghhhhhhhhhhd#b#......",
+ "......##ddhhhhhhhhhhhhd#b#......",
+ "........##ddhhhhhhhhhhd#b#......",
+ "..........##ddhhhhhhhhd#b#......",
+ "............##ddhhhhhhd#b###....",
+ "..............##ddhhhhd#b#####..",
+ "................##ddhhd#b######.",
+ "..................##dddeb#####..",
+ "....................##d#b###....",
+ "......................####......"};
+
+
+static const char * link_icon[]={
+ "32 32 12 1",
+ "# c #000000",
+ "h c #a0a0a4",
+ "b c #c00000",
+ "d c #585858",
+ "i c #400000",
+ "c c #ffffff",
+ "e c #000000",
+ "g c #c0c0c0",
+ "a c #ff0000",
+ "f c #303030",
+ "n c white",
+ ". c None",
+ "...###..........................",
+ "...#aa##........................",
+ ".###baaa##......................",
+ ".#cde#baaa##....................",
+ ".#cccdeebaaa##..##f.............",
+ ".#cccccdeebaaa##aaa##...........",
+ ".#cccccccdeebaaaaaaaa##.........",
+ ".#cccccccccdeebababaaa#.........",
+ ".#cccccgcgghhebbbbbbbaa#........",
+ ".#ccccccgcgggdebbbbbbba#........",
+ ".#cccgcgcgcgghdeebiebbba#.......",
+ ".#ccccgcggggggghdeddeeba#.......",
+ ".#cgcgcgcggggggggghghdebb#......",
+ ".#ccgcggggggggghghghghd#b#......",
+ ".#cgcgcggggggggghghghhd#b#......",
+ ".#gcggggggggghghghhhhhd#b#......",
+ ".#cgcggggggggghghghhhhd#b#......",
+ ".#ggggggggghghghhhhhhhdib#......",
+ ".#gggggggggghghghhhhhhd#b#......",
+ ".#hhggggghghghhhhhhhhhd#b#......",
+ ".#ddhhgggghghghhhhhhhhd#b#......",
+ "..##ddhhghghhhhhhhhhhhdeb#......",
+ "############hhhhhhhhhhd#b#......",
+ "#nnnnnnnnnn#hhhhhhhhhhd#b#......",
+ "#nnnnnnnnnn#hhhhhhhhhhd#b#......",
+ "#nn#nn#nnnn#ddhhhhhhhhd#b#......",
+ "#nn##n##nnn###ddhhhhhhd#b###....",
+ "#nnn#####nn#..##ddhhhhd#b#####..",
+ "#nnnnn##nnn#....##ddhhd#b######.",
+ "#nnnnn#nnnn#......##dddeb#####..",
+ "#nnnnnnnnnn#........##d#b###....",
+ "############..........####......"};
+
+static const char * folder_locked_icon[]={
+ "32 32 12 1",
+ "# c #000000",
+ "g c #808080",
+ "h c #c0c0c0",
+ "f c #c05800",
+ "c c #ffffff",
+ "d c #585858",
+ "b c #ffa858",
+ "a c #ffdca8",
+ "e c #000000",
+ "i c #a0a0a4",
+ "j c #c0c0c0",
+ ". c None",
+ "...###..........................",
+ "...#aa##........................",
+ ".###baaa##......................",
+ ".#cde#baaa##....................",
+ ".#cccdeeba#######...............",
+ ".#cccccde##fffff##..............",
+ ".#cccccc##fffgggg#..............",
+ ".#ccccccc#ffg####a##............",
+ ".#ccccchc#ffg#eebbaa##..........",
+ ".#ccccccc#ffg#ddeebbba##........",
+ ".#ccchccc#ffg#ihddeebbba##......",
+ ".#cccccaa#ffg#ihhhddeeba##......",
+ ".#chchhbbaafg#ihhhihidebb#......",
+ ".#cchccbbbbaa#ihhihihid#b#......",
+ ".#chchhbb#bbbaaiihihiid#b#......",
+ ".#hchhcbb#fbbbafhiiiiid#b#......",
+ ".#chchhbb#ffgbbfihiiiid#b#......",
+ ".#hhhhhbb#ffg#bfiiiiiid#b#......",
+ ".#hhhhhbbaffg#bfiiiiiid#b#......",
+ ".#iihhhjbbaab#bfiiiiiid#b#......",
+ ".#ddiihhh#bbbabfiiiiiid#b#......",
+ "..##ddiih#ffbbbfiiiiiid#b#......",
+ "....##ddi#ffg#biiiiiiid#b#......",
+ "......##d#ffg#iiiiiiiid#b#......",
+ "........##ffg#iiiiiiiid#b#......",
+ ".........#ffg#iiiiiiiid#b#......",
+ ".........#ffg#ddiiiiiid#b###....",
+ ".........##fg###ddiiiid#b#####..",
+ "...........####.##ddiid#b######.",
+ "..................##dddeb#####..",
+ "....................##d#b###....",
+ "......................####......"};
+
+static TQPixmap *iconFolderLockedLarge = 0;
+static TQPixmap *iconFolderLarge = 0;
+static TQPixmap *iconFileLarge = 0;
+static TQPixmap *iconLinkLarge = 0;
+static TQPixmap *iconFolderLockedSmall = 0;
+static TQPixmap *iconFolderSmall = 0;
+static TQPixmap *iconFileSmall = 0;
+static TQPixmap *iconLinkSmall = 0;
+
+static void cleanup()
+{
+ delete iconFolderLockedLarge;
+ iconFolderLockedLarge = 0;
+ delete iconFolderLarge;
+ iconFolderLarge = 0;
+ delete iconFileLarge;
+ iconFileLarge = 0;
+ delete iconLinkLarge;
+ iconLinkLarge = 0;
+ delete iconFolderLockedSmall;
+ iconFolderLockedSmall = 0;
+ delete iconFolderSmall;
+ iconFolderSmall = 0;
+ delete iconFileSmall;
+ iconFileSmall = 0;
+ delete iconLinkSmall;
+ iconLinkSmall = 0;
+}
+
+/*****************************************************************************
+ *
+ * Class TQtFileIconDrag
+ *
+ *****************************************************************************/
+
+TQtFileIconDrag::TQtFileIconDrag( TQWidget * dragSource, const char* name )
+ : TQIconDrag( dragSource, name )
+{
+}
+
+const char* TQtFileIconDrag::format( int i ) const
+{
+ if ( i == 0 )
+ return "application/x-qiconlist";
+ else if ( i == 1 )
+ return "text/uri-list";
+ else
+ return 0;
+}
+
+TQByteArray TQtFileIconDrag::encodedData( const char* mime ) const
+{
+ TQByteArray a;
+ if ( TQString( mime ) == "application/x-qiconlist" ) {
+ a = TQIconDrag::encodedData( mime );
+ } else if ( TQString( mime ) == "text/uri-list" ) {
+ TQString s = urls.join( "\r\n" );
+ a.resize( s.length() );
+ memcpy( a.data(), s.latin1(), s.length() );
+ }
+ return a;
+}
+
+bool TQtFileIconDrag::canDecode( TQMimeSource* e )
+{
+ return e->provides( "application/x-qiconlist" ) ||
+ e->provides( "text/uri-list" );
+}
+
+void TQtFileIconDrag::append( const TQIconDragItem &item, const TQRect &pr,
+ const TQRect &tr, const TQString &url )
+{
+ TQIconDrag::append( item, pr, tr );
+ TQString ourUrl = url;
+#ifdef Q_WS_WIN
+ if (ourUrl.length() > 2 && ourUrl[1] != ':') {
+ TQDir dir(ourUrl);
+ ourUrl = dir.absPath();
+ }
+#endif
+ urls << TQUriDrag::localFileToUri(ourUrl);
+}
+
+/*****************************************************************************
+ *
+ * Class TQtFileIconViewItem
+ *
+ *****************************************************************************/
+
+TQtFileIconViewItem::TQtFileIconViewItem( TQtFileIconView *parent, TQFileInfo *fi )
+ : TQIconViewItem( parent, fi->fileName() ), itemFileName( fi->filePath() ),
+ itemFileInfo( fi ), checkSetText( FALSE )
+{
+ vm = TQtFileIconView::Large;
+
+ if ( itemFileInfo->isDir() )
+ itemType = Dir;
+ else if ( itemFileInfo->isFile() )
+ itemType = File;
+ if ( itemFileInfo->isSymLink() )
+ itemType = Link;
+
+ viewModeChanged( ( (TQtFileIconView*)iconView() )->viewMode() );
+
+ if ( itemFileInfo->fileName() == "." ||
+ itemFileInfo->fileName() == ".." )
+ setRenameEnabled( FALSE );
+
+ checkSetText = TRUE;
+
+ TQObject::connect( &timer, SIGNAL( timeout() ),
+ iconView(), SLOT( openFolder() ) );
+}
+
+void TQtFileIconViewItem::paintItem( TQPainter *p, const TQColorGroup &cg )
+{
+ if ( itemFileInfo->isSymLink() ) {
+ TQFont f( p->font() );
+ f.setItalic( TRUE );
+ p->setFont( f );
+ }
+
+ TQIconViewItem::paintItem( p, cg );
+}
+
+void TQtFileIconViewItem::viewModeChanged( TQtFileIconView::ViewMode m )
+{
+ vm = m;
+ setDropEnabled( itemType == Dir && TQDir( itemFileName ).isReadable() );
+ calcRect();
+}
+
+TQPixmap *TQtFileIconViewItem::pixmap() const
+{
+ switch ( itemType ) {
+ case Dir:
+ {
+ if ( !TQDir( itemFileName ).isReadable() ) {
+ if ( vm == TQtFileIconView::Small )
+ return iconFolderLockedSmall;
+ else
+ return iconFolderLockedLarge;
+ } else {
+ if ( vm == TQtFileIconView::Small )
+ return iconFolderSmall;
+ else
+ return iconFolderLarge;
+ }
+ }
+ case Link:
+ {
+ if ( vm == TQtFileIconView::Small )
+ return iconLinkSmall;
+ else
+ return iconLinkLarge;
+ }
+ default:
+ {
+ if ( vm == TQtFileIconView::Small )
+ return iconFileSmall;
+ else
+ return iconFileLarge;
+ }
+ }
+}
+
+TQtFileIconViewItem::~TQtFileIconViewItem()
+{
+ delete itemFileInfo;
+}
+
+void TQtFileIconViewItem::setText( const TQString &text )
+{
+ if ( checkSetText ) {
+ if ( text == "." || text == "." || text.isEmpty() )
+ return;
+ TQDir dir( itemFileInfo->dir() );
+ if ( dir.rename( itemFileInfo->fileName(), text ) ) {
+ itemFileName = itemFileInfo->dirPath( TRUE ) + "/" + text;
+ delete itemFileInfo;
+ itemFileInfo = new TQFileInfo( itemFileName );
+ TQIconViewItem::setText( text );
+ }
+ } else {
+ TQIconViewItem::setText( text );
+ }
+}
+
+bool TQtFileIconViewItem::acceptDrop( const TQMimeSource *e ) const
+{
+ if ( type() == Dir && e->provides( "text/uri-list" ) &&
+ dropEnabled() )
+ return TRUE;
+
+ return FALSE;
+}
+
+void TQtFileIconViewItem::dropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & )
+{
+ timer.stop();
+
+ if ( !TQUriDrag::canDecode( e ) ) {
+ e->ignore();
+ return;
+ }
+
+ TQStringList lst;
+ TQUriDrag::decodeLocalFiles( e, lst );
+
+ TQString str;
+ if ( e->action() == TQDropEvent::Copy )
+ str = "Copy\n\n";
+ else
+ str = "Move\n\n";
+ for ( uint i = 0; i < lst.count(); ++i )
+ str += TQString( " %1\n" ).arg( lst[i] );
+ str += TQString( "\n"
+ "To\n\n"
+ " %1" ).arg( filename() );
+
+ TQMessageBox::information( iconView(), e->action() == TQDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" );
+ if ( e->action() == TQDropEvent::Move )
+ TQMessageBox::information( iconView(), "Remove" , str, "Not Implemented" );
+ e->acceptAction();
+}
+
+void TQtFileIconViewItem::dragEntered()
+{
+ if ( type() != Dir ||
+ type() == Dir && !TQDir( itemFileName ).isReadable() )
+ return;
+
+ ( (TQtFileIconView*)iconView() )->setOpenItem( this );
+ timer.start( 1500 );
+}
+
+void TQtFileIconViewItem::dragLeft()
+{
+ if ( type() != Dir ||
+ type() == Dir && !TQDir( itemFileName ).isReadable() )
+ return;
+
+ timer.stop();
+}
+
+/*****************************************************************************
+ *
+ * Class TQtFileIconView
+ *
+ *****************************************************************************/
+
+TQtFileIconView::TQtFileIconView( const TQString &dir, TQWidget *parent, const char *name )
+ : TQIconView( parent, name ), viewDir( dir ), newFolderNum( 0 )
+{
+ if ( !iconFolderLockedLarge ) {
+ qAddPostRoutine( cleanup );
+ TQWMatrix m;
+ m.scale( 0.6, 0.6 );
+ TQPixmap iconpix( folder_locked_icon );
+ iconFolderLockedLarge = new TQPixmap( folder_locked_icon );
+ iconpix = iconpix.xForm( m );
+ iconFolderLockedSmall = new TQPixmap( iconpix );
+ iconpix = TQPixmap( folder_icon );
+ iconFolderLarge = new TQPixmap( folder_icon );
+ iconpix = iconpix.xForm( m );
+ iconFolderSmall = new TQPixmap( iconpix );
+ iconpix = TQPixmap( file_icon );
+ iconFileLarge = new TQPixmap( file_icon );
+ iconpix = iconpix.xForm( m );
+ iconFileSmall = new TQPixmap( iconpix );
+ iconpix = TQPixmap( link_icon );
+ iconLinkLarge = new TQPixmap( link_icon );
+ iconpix = iconpix.xForm( m );
+ iconLinkSmall = new TQPixmap( iconpix );
+ }
+
+ vm = Large;
+
+ setGridX( 75 );
+ setResizeMode( Adjust );
+ setWordWrapIconText( FALSE );
+
+ connect( this, SIGNAL( doubleClicked( TQIconViewItem * ) ),
+ this, SLOT( itemDoubleClicked( TQIconViewItem * ) ) );
+ connect( this, SIGNAL( returnPressed( TQIconViewItem * ) ),
+ this, SLOT( itemDoubleClicked( TQIconViewItem * ) ) );
+ connect( this, SIGNAL( dropped( TQDropEvent *, const TQValueList<TQIconDragItem> & ) ),
+ this, SLOT( slotDropped( TQDropEvent *, const TQValueList<TQIconDragItem> & ) ) );
+ connect( this, SIGNAL( contextMenuRequested( TQIconViewItem *, const TQPoint & ) ),
+ this, SLOT( slotRightPressed( TQIconViewItem * ) ) );
+
+ setHScrollBarMode( AlwaysOff );
+ setVScrollBarMode( Auto );
+
+ setAutoArrange( TRUE );
+ setSorting( TRUE );
+ openItem = 0;
+}
+
+void TQtFileIconView::openFolder()
+{
+ if ( !openItem )
+ return;
+ if ( openItem->type() != TQtFileIconViewItem::Dir ||
+ openItem->type() == TQtFileIconViewItem::Dir &&
+ !TQDir( openItem->itemFileName ).isReadable() )
+ return;
+
+ openItem->timer.stop();
+ setDirectory( openItem->itemFileName );
+}
+
+void TQtFileIconView::setDirectory( const TQString &dir )
+{
+ viewDir = TQDir( dir );
+ readDir( viewDir );
+}
+
+void TQtFileIconView::setDirectory( const TQDir &dir )
+{
+ viewDir = dir;
+ readDir( viewDir );
+}
+
+void TQtFileIconView::newDirectory()
+{
+ setAutoArrange( FALSE );
+ selectAll( FALSE );
+ if ( viewDir.mkdir( TQString( "New Folder %1" ).arg( ++newFolderNum ) ) ) {
+ TQFileInfo *fi = new TQFileInfo( viewDir, TQString( "New Folder %1" ).arg( newFolderNum ) );
+ TQtFileIconViewItem *item = new TQtFileIconViewItem( this, new TQFileInfo( *fi ) );
+ item->setKey( TQString( "000000%1" ).arg( fi->fileName() ) );
+ delete fi;
+ repaintContents( contentsX(), contentsY(), contentsWidth(), contentsHeight(), FALSE );
+ ensureItemVisible( item );
+ item->setSelected( TRUE, TRUE );
+ setCurrentItem( item );
+ repaintItem( item );
+ qApp->processEvents();
+ item->rename();
+ }
+ setAutoArrange( TRUE );
+}
+
+TQDir TQtFileIconView::currentDir()
+{
+ return viewDir;
+}
+
+static bool isRoot( const TQString &s )
+{
+#if defined(Q_OS_UNIX)
+ if ( s == "/" )
+ return TRUE;
+#elif defined(Q_OS_WIN32)
+ TQString p = s;
+ if ( p.length() == 3 &&
+ p.right( 2 ) == ":/" )
+ return TRUE;
+ if ( p[ 0 ] == '/' && p[ 1 ] == '/' ) {
+ int slashes = p.contains( '/' );
+ if ( slashes <= 3 )
+ return TRUE;
+ if ( slashes == 4 && p[ (int)p.length() - 1 ] == '/' )
+ return TRUE;
+ }
+#endif
+
+ return FALSE;
+}
+
+void TQtFileIconView::readDir( const TQDir &dir )
+{
+ if ( !dir.isReadable() )
+ return;
+
+ if ( isRoot( dir.absPath() ) )
+ emit disableUp();
+ else
+ emit enableUp();
+
+ clear();
+
+ emit directoryChanged( dir.absPath() );
+
+ const TQFileInfoList *filist = dir.entryInfoList( TQDir::DefaultFilter, TQDir::DirsFirst | TQDir::Name );
+
+ emit startReadDir( filist->count() );
+
+ TQFileInfoListIterator it( *filist );
+ TQFileInfo *fi;
+ bool allowRename = FALSE, allowRenameSet = FALSE;
+ while ( ( fi = it.current() ) != 0 ) {
+ ++it;
+ if ( fi && fi->fileName() == ".." && ( fi->dirPath() == "/" || fi->dirPath().isEmpty() ) )
+ continue;
+ emit readNextDir();
+ TQtFileIconViewItem *item = new TQtFileIconViewItem( this, new TQFileInfo( *fi ) );
+ if ( fi->isDir() )
+ item->setKey( TQString( "000000%1" ).arg( fi->fileName() ) );
+ else
+ item->setKey( fi->fileName() );
+ if ( !allowRenameSet ) {
+ if ( !TQFileInfo( fi->absFilePath() ).isWritable() ||
+ item->text() == "." || item->text() == ".." )
+ allowRename = FALSE;
+ else
+ allowRename = TRUE;
+ if ( item->text() == "." || item->text() == ".." )
+ allowRenameSet = FALSE;
+ else
+ allowRenameSet = TRUE;
+ }
+ item->setRenameEnabled( allowRename );
+ }
+
+ if ( !TQFileInfo( dir.absPath() ).isWritable() )
+ emit disableMkdir();
+ else
+ emit enableMkdir();
+
+ emit readDirDone();
+}
+
+void TQtFileIconView::itemDoubleClicked( TQIconViewItem *i )
+{
+ TQtFileIconViewItem *item = ( TQtFileIconViewItem* )i;
+
+ if ( item->type() == TQtFileIconViewItem::Dir ) {
+ viewDir = TQDir( item->filename() );
+ readDir( viewDir );
+ } else if ( item->type() == TQtFileIconViewItem::Link &&
+ TQFileInfo( TQFileInfo( item->filename() ).readLink() ).isDir() ) {
+ viewDir = TQDir( TQFileInfo( item->filename() ).readLink() );
+ readDir( viewDir );
+ }
+}
+
+TQDragObject *TQtFileIconView::dragObject()
+{
+ if ( !currentItem() )
+ return 0;
+
+ TQPoint orig = viewportToContents( viewport()->mapFromGlobal( TQCursor::pos() ) );
+ TQtFileIconDrag *drag = new TQtFileIconDrag( viewport() );
+ drag->setPixmap( *currentItem()->pixmap(),
+ TQPoint( currentItem()->pixmapRect().width() / 2, currentItem()->pixmapRect().height() / 2 ) );
+ for ( TQtFileIconViewItem *item = (TQtFileIconViewItem*)firstItem(); item;
+ item = (TQtFileIconViewItem*)item->nextItem() ) {
+ if ( item->isSelected() ) {
+ TQIconDragItem id;
+ id.setData( TQCString( item->filename() ) );
+ drag->append( id,
+ TQRect( item->pixmapRect( FALSE ).x() - orig.x(),
+ item->pixmapRect( FALSE ).y() - orig.y(),
+ item->pixmapRect().width(), item->pixmapRect().height() ),
+ TQRect( item->textRect( FALSE ).x() - orig.x(),
+ item->textRect( FALSE ).y() - orig.y(),
+ item->textRect().width(), item->textRect().height() ),
+ TQString( item->filename() ) );
+ }
+ }
+
+ return drag;
+}
+
+void TQtFileIconView::keyPressEvent( TQKeyEvent *e )
+{
+ if ( e->key() == Key_N &&
+ ( e->state() & ControlButton ) )
+ newDirectory();
+ else
+ TQIconView::keyPressEvent( e );
+}
+
+void TQtFileIconView::slotDropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & )
+{
+ if ( openItem )
+ openItem->timer.stop();
+ if ( !TQUriDrag::canDecode( e ) ) {
+ e->ignore();
+ return;
+ }
+
+ TQStringList lst;
+ TQUriDrag::decodeLocalFiles( e, lst );
+
+ TQString str;
+ if ( e->action() == TQDropEvent::Copy )
+ str = "Copy\n\n";
+ else
+ str = "Move\n\n";
+ for ( uint i = 0; i < lst.count(); ++i )
+ str += TQString( " %1\n" ).arg( TQDir::convertSeparators(lst[i]) );
+ str += TQString( "\n"
+ "To\n\n"
+ " %1" ).arg( viewDir.absPath() );
+
+ TQMessageBox::information( this, e->action() == TQDropEvent::Copy ? "Copy" : "Move" , str, "Not Implemented" );
+ if ( e->action() == TQDropEvent::Move )
+ TQMessageBox::information( this, "Remove" , TQDir::convertSeparators(lst.join("\n")), "Not Implemented" );
+ e->acceptAction();
+ openItem = 0;
+}
+
+void TQtFileIconView::viewLarge()
+{
+ setViewMode( Large );
+}
+
+void TQtFileIconView::viewSmall()
+{
+ setViewMode( Small );
+}
+
+void TQtFileIconView::viewBottom()
+{
+ setItemTextPos( Bottom );
+}
+
+void TQtFileIconView::viewRight()
+{
+ setItemTextPos( Right );
+}
+
+void TQtFileIconView::flowEast()
+{
+ setHScrollBarMode( AlwaysOff );
+ setVScrollBarMode( Auto );
+ setArrangement( LeftToRight );
+}
+
+void TQtFileIconView::flowSouth()
+{
+ setVScrollBarMode( AlwaysOff );
+ setHScrollBarMode( Auto );
+ setArrangement( TopToBottom );
+}
+
+void TQtFileIconView::sortAscending()
+{
+ sort( TRUE );
+}
+
+void TQtFileIconView::sortDescending()
+{
+ sort( FALSE );
+}
+
+void TQtFileIconView::itemTextTruncate()
+{
+ setWordWrapIconText( FALSE );
+}
+
+void TQtFileIconView::itemTextWordWrap()
+{
+ setWordWrapIconText( TRUE );
+}
+
+void TQtFileIconView::slotRightPressed( TQIconViewItem *item )
+{
+ if ( !item ) { // right pressed on viewport
+ TQPopupMenu menu( this );
+
+ menu.insertItem( "&Large view", this, SLOT( viewLarge() ) );
+ menu.insertItem( "&Small view", this, SLOT( viewSmall() ) );
+ menu.insertSeparator();
+ menu.insertItem( "Text at the &bottom", this, SLOT( viewBottom() ) );
+ menu.insertItem( "Text at the &right", this, SLOT( viewRight() ) );
+ menu.insertSeparator();
+ menu.insertItem( "Arrange l&eft to right", this, SLOT( flowEast() ) );
+ menu.insertItem( "Arrange t&op to bottom", this, SLOT( flowSouth() ) );
+ menu.insertSeparator();
+ menu.insertItem( "&Truncate item text", this, SLOT( itemTextTruncate() ) );
+ menu.insertItem( "&Wordwrap item text", this, SLOT( itemTextWordWrap() ) );
+ menu.insertSeparator();
+ menu.insertItem( "Arrange items in &grid", this, SLOT( arrangeItemsInGrid() ) );
+ menu.insertSeparator();
+ menu.insertItem( "Sort &ascending", this, SLOT( sortAscending() ) );
+ menu.insertItem( "Sort &descending", this, SLOT( sortDescending() ) );
+
+ menu.setMouseTracking( TRUE );
+ menu.exec( TQCursor::pos() );
+ } else { // on item
+ TQPopupMenu menu( this );
+
+ int RENAME_ITEM = menu.insertItem( "Rename Item" );
+ int REMOVE_ITEM = menu.insertItem( "Remove Item" );
+
+ menu.setMouseTracking( TRUE );
+ int id = menu.exec( TQCursor::pos() );
+
+ if ( id == -1 )
+ return;
+
+ if ( id == RENAME_ITEM && item->renameEnabled() ) {
+ item->rename();
+ } else if ( id == REMOVE_ITEM ) {
+ delete item;
+ TQMessageBox::information( this, "Not implemented!", "Deleting files not implemented yet,\n"
+ "The item has only been removed from the view! " );
+ }
+ }
+}
+
+void TQtFileIconView::setViewMode( ViewMode m )
+{
+ if ( m == vm )
+ return;
+
+ vm = m;
+ TQtFileIconViewItem *item = (TQtFileIconViewItem*)firstItem();
+ for ( ; item; item = (TQtFileIconViewItem*)item->nextItem() )
+ item->viewModeChanged( vm );
+
+ arrangeItemsInGrid();
+}
diff --git a/examples/fileiconview/qfileiconview.h b/examples/fileiconview/qfileiconview.h
new file mode 100644
index 000000000..4a2e4b118
--- /dev/null
+++ b/examples/fileiconview/qfileiconview.h
@@ -0,0 +1,170 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TQTFILEICONVIEW_H
+#define TQTFILEICONVIEW_H
+
+
+#include <qiconset.h>
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qtimer.h>
+#include <qiconview.h>
+
+class TQtFileIconView;
+class TQDragObject;
+class TQResizeEvent;
+
+/*****************************************************************************
+ *
+ * Class TQtFileIconDrag
+ *
+ *****************************************************************************/
+
+class TQtFileIconDrag : public TQIconDrag
+{
+ Q_OBJECT
+
+public:
+ TQtFileIconDrag( TQWidget * dragSource, const char* name = 0 );
+
+ const char* format( int i ) const;
+ TQByteArray encodedData( const char* mime ) const;
+ static bool canDecode( TQMimeSource* e );
+ void append( const TQIconDragItem &item, const TQRect &pr, const TQRect &tr, const TQString &url );
+
+private:
+ TQStringList urls;
+
+};
+
+/*****************************************************************************
+ *
+ * Class TQtFileIconView
+ *
+ *****************************************************************************/
+class TQtFileIconViewItem;
+class TQtFileIconView : public TQIconView
+{
+ Q_OBJECT
+
+public:
+ TQtFileIconView( const TQString &dir, TQWidget *parent = 0, const char *name = 0 );
+
+ enum ViewMode { Large, Small };
+
+ void setViewMode( ViewMode m );
+ ViewMode viewMode() const { return vm; }
+ void setOpenItem( TQtFileIconViewItem *i ) {
+ openItem = i;
+ }
+
+public slots:
+ void setDirectory( const TQString &dir );
+ void setDirectory( const TQDir &dir );
+ void newDirectory();
+ TQDir currentDir();
+
+signals:
+ void directoryChanged( const TQString & );
+ void startReadDir( int dirs );
+ void readNextDir();
+ void readDirDone();
+ void enableUp();
+ void disableUp();
+ void enableMkdir();
+ void disableMkdir();
+
+protected slots:
+ void itemDoubleClicked( TQIconViewItem *i );
+ void slotDropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & );
+
+ void viewLarge();
+ void viewSmall();
+ void viewBottom();
+ void viewRight();
+ void flowEast();
+ void flowSouth();
+ void itemTextTruncate();
+ void itemTextWordWrap();
+ void sortAscending();
+ void sortDescending();
+ void arrangeItemsInGrid() {
+ TQIconView::arrangeItemsInGrid( TRUE );
+ }
+
+ void slotRightPressed( TQIconViewItem *item );
+ void openFolder();
+
+protected:
+ void readDir( const TQDir &dir );
+ virtual TQDragObject *dragObject();
+
+ virtual void keyPressEvent( TQKeyEvent *e );
+
+ TQDir viewDir;
+ int newFolderNum;
+ TQSize sz;
+ TQPixmap pix;
+ ViewMode vm;
+ TQtFileIconViewItem *openItem;
+
+};
+
+/*****************************************************************************
+ *
+ * Class TQtFileIconViewItem
+ *
+ *****************************************************************************/
+
+class TQtFileIconViewItem : public TQIconViewItem
+{
+ friend class TQtFileIconView;
+
+public:
+ enum ItemType {
+ File = 0,
+ Dir,
+ Link
+ };
+
+ TQtFileIconViewItem( TQtFileIconView *parent, TQFileInfo *fi );
+
+ virtual ~TQtFileIconViewItem();
+
+ ItemType type() const
+ { return itemType; }
+ TQString filename() const { return itemFileName; }
+
+ virtual bool acceptDrop( const TQMimeSource *e ) const;
+
+ virtual void setText( const TQString &text );
+ virtual TQPixmap *pixmap() const;
+
+ virtual void dragEntered();
+ virtual void dragLeft();
+
+ void viewModeChanged( TQtFileIconView::ViewMode m );
+ void paintItem( TQPainter *p, const TQColorGroup &cg );
+
+protected:
+ virtual void dropped( TQDropEvent *e, const TQValueList<TQIconDragItem> & );
+
+ TQString itemFileName;
+ TQFileInfo *itemFileInfo;
+ ItemType itemType;
+ bool checkSetText;
+ TQTimer timer;
+ TQtFileIconView::ViewMode vm;
+
+};
+
+
+#endif
diff --git a/examples/fonts/fonts.pro b/examples/fonts/fonts.pro
new file mode 100644
index 000000000..8659474bd
--- /dev/null
+++ b/examples/fonts/fonts.pro
@@ -0,0 +1,5 @@
+TEMPLATE = subdirs
+
+CONFIG += ordered
+
+SUBDIRS = simple-qfont-demo
diff --git a/examples/fonts/simple-qfont-demo/simple-qfont-demo.cpp b/examples/fonts/simple-qfont-demo/simple-qfont-demo.cpp
new file mode 100644
index 000000000..2e9f8d3a6
--- /dev/null
+++ b/examples/fonts/simple-qfont-demo/simple-qfont-demo.cpp
@@ -0,0 +1,14 @@
+
+#include "viewer.h"
+
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+ Viewer * textViewer = new Viewer();
+ textViewer->setCaption( "TQt Example - Simple TQFont Demo" );
+ app.setMainWidget( textViewer );
+ textViewer->show();
+ return app.exec();
+}
diff --git a/examples/fonts/simple-qfont-demo/simple-qfont-demo.doc b/examples/fonts/simple-qfont-demo/simple-qfont-demo.doc
new file mode 100644
index 000000000..8b0a3657e
--- /dev/null
+++ b/examples/fonts/simple-qfont-demo/simple-qfont-demo.doc
@@ -0,0 +1,28 @@
+/*! \page simple-font-demo-example.html
+
+ \ingroup qfont-examples
+
+ \title A simple demonstration of QFont member functions
+
+ This example demonstrates the use of various
+ QFont member functions.
+
+ <hr>
+
+ The main window API (viewer.h):
+
+ \include fonts/simple-qfont-demo/viewer.h
+
+ <hr>
+
+ The main window implementation (viewer.cpp):
+
+ \include fonts/simple-qfont-demo/viewer.cpp
+
+ <hr>
+
+ main() program (simple-qfont-demo.cpp):
+
+ \include fonts/simple-qfont-demo/simple-qfont-demo.cpp
+
+*/
diff --git a/examples/fonts/simple-qfont-demo/simple-qfont-demo.pro b/examples/fonts/simple-qfont-demo/simple-qfont-demo.pro
new file mode 100644
index 000000000..a85e83ce4
--- /dev/null
+++ b/examples/fonts/simple-qfont-demo/simple-qfont-demo.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = fontdemo
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = viewer.h
+SOURCES = simple-qfont-demo.cpp \
+ viewer.cpp
diff --git a/examples/fonts/simple-qfont-demo/viewer.cpp b/examples/fonts/simple-qfont-demo/viewer.cpp
new file mode 100644
index 000000000..505cd42b3
--- /dev/null
+++ b/examples/fonts/simple-qfont-demo/viewer.cpp
@@ -0,0 +1,160 @@
+
+#include "viewer.h"
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtextview.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+
+Viewer::Viewer()
+ :TQWidget()
+{
+ setFontSubstitutions();
+
+ TQString greeting_heb = TQString::fromUtf8( "\327\251\327\234\327\225\327\235" );
+ TQString greeting_ru = TQString::fromUtf8( "\320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265" );
+ TQString greeting_en( "Hello" );
+
+ greetings = new TQTextView( this, "textview" );
+
+ greetings->setText( greeting_en + "\n" +
+ greeting_ru + "\n" +
+ greeting_heb );
+
+ fontInfo = new TQTextView( this, "fontinfo" );
+
+ setDefault();
+
+ defaultButton = new TQPushButton( "Default", this,
+ "pushbutton1" );
+ defaultButton->setFont( TQFont( "times" ) );
+ connect( defaultButton, SIGNAL( clicked() ),
+ this, SLOT( setDefault() ) );
+
+ sansSerifButton = new TQPushButton( "Sans Serif", this,
+ "pushbutton2" );
+ sansSerifButton->setFont( TQFont( "Helvetica", 12 ) );
+ connect( sansSerifButton, SIGNAL( clicked() ),
+ this, SLOT( setSansSerif() ) );
+
+ italicsButton = new TQPushButton( "Italics", this,
+ "pushbutton3" );
+ italicsButton->setFont( TQFont( "lucida", 12, TQFont::Bold, TRUE ) );
+ connect( italicsButton, SIGNAL( clicked() ),
+ this, SLOT( setItalics() ) );
+
+ layout();
+}
+
+void Viewer::setDefault()
+{
+ TQFont font( "Bavaria" );
+ font.setPointSize( 24 );
+
+ font.setWeight( TQFont::Bold );
+ font.setUnderline( TRUE );
+
+ greetings->setFont( font );
+
+ showFontInfo( font );
+}
+
+void Viewer::setSansSerif()
+{
+ TQFont font( "Newyork", 18 );
+ font.setStyleHint( TQFont::SansSerif );
+ greetings->setFont( font );
+
+ showFontInfo( font );
+}
+
+void Viewer::setItalics()
+{
+ TQFont font( "Tokyo" );
+ font.setPointSize( 32 );
+ font.setWeight( TQFont::Bold );
+ font.setItalic( TRUE );
+
+ greetings->setFont( font );
+
+ showFontInfo( font );
+}
+
+void Viewer::showFontInfo( TQFont & font )
+{
+ TQFontInfo info( font );
+
+ TQString messageText;
+ messageText = "Font requested: \"" +
+ font.family() + "\" " +
+ TQString::number( font.pointSize() ) + "pt<BR>" +
+ "Font used: \"" +
+ info.family() + "\" " +
+ TQString::number( info.pointSize() ) + "pt<P>";
+
+ TQStringList substitutions = TQFont::substitutes( font.family() );
+
+ if ( ! substitutions.isEmpty() ){
+ messageText += "The following substitutions exist for " + \
+ font.family() + ":<UL>";
+
+ TQStringList::Iterator i = substitutions.begin();
+ while ( i != substitutions.end() ){
+ messageText += "<LI>\"" + (* i) + "\"";
+ i++;
+ }
+ messageText += "</UL>";
+ } else {
+ messageText += "No substitutions exist for " + \
+ font.family() + ".";
+ }
+
+ fontInfo->setText( messageText );
+}
+
+void Viewer::setFontSubstitutions()
+{
+ TQStringList substitutes;
+ substitutes.append( "Times" );
+ substitutes += "Mincho",
+ substitutes << "Arabic Newspaper" << "crox";
+
+ TQFont::insertSubstitutions( "Bavaria", substitutes );
+
+ TQFont::insertSubstitution( "Tokyo", "Lucida" );
+}
+
+
+// For those who prefer to use TQt Designer for creating GUIs
+// the following function might not be of particular interest:
+// all it does is creating the widget layout.
+
+void Viewer::layout()
+{
+ TQHBoxLayout * textViewContainer = new TQHBoxLayout();
+ textViewContainer->addWidget( greetings );
+ textViewContainer->addWidget( fontInfo );
+
+ TQHBoxLayout * buttonContainer = new TQHBoxLayout();
+
+ buttonContainer->addWidget( defaultButton );
+ buttonContainer->addWidget( sansSerifButton );
+ buttonContainer->addWidget( italicsButton );
+
+ int maxButtonHeight = defaultButton->height();
+
+ if ( sansSerifButton->height() > maxButtonHeight )
+ maxButtonHeight = sansSerifButton->height();
+ if ( italicsButton->height() > maxButtonHeight )
+ maxButtonHeight = italicsButton->height();
+
+ defaultButton->setFixedHeight( maxButtonHeight );
+ sansSerifButton->setFixedHeight( maxButtonHeight );
+ italicsButton->setFixedHeight( maxButtonHeight );
+
+ TQVBoxLayout * container = new TQVBoxLayout( this );
+ container->addLayout( textViewContainer );
+ container->addLayout( buttonContainer );
+
+ resize( 700, 250 );
+}
diff --git a/examples/fonts/simple-qfont-demo/viewer.h b/examples/fonts/simple-qfont-demo/viewer.h
new file mode 100644
index 000000000..1f72470a6
--- /dev/null
+++ b/examples/fonts/simple-qfont-demo/viewer.h
@@ -0,0 +1,37 @@
+
+#ifndef VIEWER_H
+#define VIEWER_H
+
+
+#include <qwidget.h>
+#include <qfont.h>
+
+class TQTextView;
+class TQPushButton;
+
+class Viewer : public TQWidget
+{
+Q_OBJECT
+
+public:
+ Viewer();
+
+private slots:
+ void setDefault();
+ void setSansSerif();
+ void setItalics();
+
+private:
+ void setFontSubstitutions();
+ void layout();
+ void showFontInfo( TQFont & );
+
+ TQTextView * greetings;
+ TQTextView * fontInfo;
+
+ TQPushButton * defaultButton;
+ TQPushButton * sansSerifButton;
+ TQPushButton * italicsButton;
+};
+
+#endif
diff --git a/examples/forever/README b/examples/forever/README
new file mode 100644
index 000000000..b3fbbb679
--- /dev/null
+++ b/examples/forever/README
@@ -0,0 +1,4 @@
+The forever program draws filled rectangles with random color and random
+position and size.
+
+WARNING: This program has a strobe effect.
diff --git a/examples/forever/forever.cpp b/examples/forever/forever.cpp
new file mode 100644
index 000000000..278572541
--- /dev/null
+++ b/examples/forever/forever.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qapplication.h>
+#include <stdlib.h> // defines rand() function
+
+#include "forever.h"
+
+
+//
+// Forever - a widget that draws rectangles forever.
+//
+
+//
+// Constructs a Forever widget.
+//
+
+Forever::Forever( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ for (int a=0; a<numColors; a++) {
+ colors[a] = TQColor( rand()&255,
+ rand()&255,
+ rand()&255 );
+ }
+ rectangles = 0;
+ startTimer( 0 ); // run continuous timer
+ TQTimer * counter = new TQTimer( this );
+ connect( counter, SIGNAL(timeout()),
+ this, SLOT(updateCaption()) );
+ counter->start( 1000 );
+}
+
+
+void Forever::updateCaption()
+{
+ TQString s;
+ s.sprintf( "TQt Example - Forever - %d rectangles/second", rectangles );
+ rectangles = 0;
+ setCaption( s );
+}
+
+
+//
+// Handles paint events for the Forever widget.
+//
+
+void Forever::paintEvent( TQPaintEvent * )
+{
+ TQPainter paint( this ); // painter object
+ int w = width();
+ int h = height();
+ if(w <= 0 || h <= 0)
+ return;
+ paint.setPen( NoPen ); // do not draw outline
+ paint.setBrush( colors[rand() % numColors]);// set random brush color
+
+ TQPoint p1( rand()%w, rand()%h ); // p1 = top left
+ TQPoint p2( rand()%w, rand()%h ); // p2 = bottom right
+
+ TQRect r( p1, p2 );
+ paint.drawRect( r ); // draw filled rectangle
+}
+
+//
+// Handles timer events for the Forever widget.
+//
+
+void Forever::timerEvent( TQTimerEvent * )
+{
+ for ( int i=0; i<100; i++ ) {
+ repaint( FALSE ); // repaint, don't erase
+ rectangles++;
+ }
+}
+
+
+//
+// Create and display Forever widget.
+//
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv ); // create application object
+ Forever always; // create widget
+ always.resize( 400, 250 ); // start up with size 400x250
+ a.setMainWidget( &always ); // set as main widget
+ always.setCaption("TQt Example - Forever");
+ always.show(); // show widget
+ return a.exec(); // run event loop
+}
diff --git a/examples/forever/forever.doc b/examples/forever/forever.doc
new file mode 100644
index 000000000..be5633328
--- /dev/null
+++ b/examples/forever/forever.doc
@@ -0,0 +1,25 @@
+
+/*
+*/
+/*! \page forever-example.html
+
+ \ingroup examples
+ \title A Rectangle Draw "Benchmark"
+
+ This example continuously draws rectangles in a window and
+ has another widget that counts the number of rectangles that
+ are drawn per second.
+
+ <hr>
+
+ Header file:
+
+ \include forever/forever.h
+
+ <hr>
+
+ Implementation:
+
+ \include forever/forever.cpp
+*/
+
diff --git a/examples/forever/forever.h b/examples/forever/forever.h
new file mode 100644
index 000000000..480e5691c
--- /dev/null
+++ b/examples/forever/forever.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Definition of something or other
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef FOREVER_H
+#define FOREVER_H
+
+#include <qwidget.h>
+
+
+const int numColors = 120;
+
+
+class Forever : public TQWidget
+{
+ Q_OBJECT
+public:
+ Forever( TQWidget *parent=0, const char *name=0 );
+protected:
+ void paintEvent( TQPaintEvent * );
+ void timerEvent( TQTimerEvent * );
+private slots:
+ void updateCaption();
+private:
+ int rectangles;
+ TQColor colors[numColors];
+};
+
+
+#endif
diff --git a/examples/forever/forever.pro b/examples/forever/forever.pro
new file mode 100644
index 000000000..2886d983a
--- /dev/null
+++ b/examples/forever/forever.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = forever
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = small-config
+
+HEADERS = forever.h
+SOURCES = forever.cpp
diff --git a/examples/gridview/gridview.cpp b/examples/gridview/gridview.cpp
new file mode 100644
index 000000000..647e3cc4c
--- /dev/null
+++ b/examples/gridview/gridview.cpp
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qgridview.h>
+#include <qpainter.h>
+
+// Grid size
+const int numRows = 100;
+const int numCols = 100;
+
+class MyGridView : public TQGridView
+{
+public:
+ MyGridView() {
+ setNumRows( ::numRows );
+ setNumCols( ::numCols );
+ setCellWidth( fontMetrics().width( TQString("%1 / %2").arg(numRows()).arg(numCols())));
+ setCellHeight( 2*fontMetrics().lineSpacing() );
+ setCaption( tr( "TQt Example - This is a grid with 100 x 100 cells" ) );
+ }
+
+protected:
+ void paintCell( TQPainter *p, int row, int col ) {
+ p->drawLine( cellWidth()-1, 0, cellWidth()-1, cellHeight()-1 );
+ p->drawLine( 0, cellHeight()-1, cellWidth()-1, cellHeight()-1 );
+ p->drawText( cellRect(), AlignCenter, TQString("%1 / %1").arg(row).arg(col) );
+ }
+};
+
+// The program starts here.
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+
+ MyGridView gridview;
+ app.setMainWidget( &gridview );
+ gridview.show();
+ return app.exec();
+}
diff --git a/examples/gridview/gridview.pro b/examples/gridview/gridview.pro
new file mode 100644
index 000000000..f1c02488f
--- /dev/null
+++ b/examples/gridview/gridview.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = gridview
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = medium-config
+
+HEADERS =
+SOURCES = gridview.cpp
diff --git a/examples/hello/README b/examples/hello/README
new file mode 100644
index 000000000..1d9560106
--- /dev/null
+++ b/examples/hello/README
@@ -0,0 +1,3 @@
+Since the classic "hello world" program is too trivial in Qt, We made
+this one - it draws the words "hello world" moving around and in
+rainbow colors.
diff --git a/examples/hello/hello.cpp b/examples/hello/hello.cpp
new file mode 100644
index 000000000..55f8356e0
--- /dev/null
+++ b/examples/hello/hello.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "hello.h"
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+
+
+/*
+ Constructs a Hello widget. Starts a 40 ms animation timer.
+*/
+
+Hello::Hello( const char *text, TQWidget *parent, const char *name )
+ : TQWidget(parent,name), t(text), b(0)
+{
+ TQTimer *timer = new TQTimer(this);
+ connect( timer, SIGNAL(timeout()), SLOT(animate()) );
+ timer->start( 40 );
+
+ resize( 260, 130 );
+}
+
+
+/*
+ This private slot is called each time the timer fires.
+*/
+
+void Hello::animate()
+{
+ b = (b + 1) & 15;
+ repaint( FALSE );
+}
+
+
+/*
+ Handles mouse button release events for the Hello widget.
+
+ We emit the clicked() signal when the mouse is released inside
+ the widget.
+*/
+
+void Hello::mouseReleaseEvent( TQMouseEvent *e )
+{
+ if ( rect().contains( e->pos() ) )
+ emit clicked();
+}
+
+
+/*
+ Handles paint events for the Hello widget.
+
+ Flicker-free update. The text is first drawn in the pixmap and the
+ pixmap is then blt'ed to the screen.
+*/
+
+void Hello::paintEvent( TQPaintEvent * )
+{
+ static int sin_tbl[16] = {
+ 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38};
+
+ if ( t.isEmpty() )
+ return;
+
+ // 1: Compute some sizes, positions etc.
+ TQFontMetrics fm = fontMetrics();
+ int w = fm.width(t) + 20;
+ int h = fm.height() * 2;
+ int pmx = width()/2 - w/2;
+ int pmy = height()/2 - h/2;
+
+ // 2: Create the pixmap and fill it with the widget's background
+ TQPixmap pm( w, h );
+ pm.fill( this, pmx, pmy );
+
+ // 3: Paint the pixmap. Cool wave effect
+ TQPainter p;
+ int x = 10;
+ int y = h/2 + fm.descent();
+ int i = 0;
+ p.begin( &pm );
+ p.setFont( font() );
+ while ( !t[i].isNull() ) {
+ int i16 = (b+i) & 15;
+ p.setPen( TQColor((15-i16)*16,255,255,TQColor::Hsv) );
+ p.drawText( x, y-sin_tbl[i16]*h/800, t.mid(i,1), 1 );
+ x += fm.width( t[i] );
+ i++;
+ }
+ p.end();
+
+ // 4: Copy the pixmap to the Hello widget
+ bitBlt( this, pmx, pmy, &pm );
+}
diff --git a/examples/hello/hello.doc b/examples/hello/hello.doc
new file mode 100644
index 000000000..8c001a2b8
--- /dev/null
+++ b/examples/hello/hello.doc
@@ -0,0 +1,30 @@
+
+/*
+*/
+/*! \page hello-example.html
+
+ \ingroup examples
+ \title Hello, World
+
+ This example brings up the words "Hello, World" moving up and down,
+ and in different colors.
+
+ <hr>
+
+ Header file:
+
+ \include hello/hello.h
+
+ <hr>
+
+ Implementation:
+
+ \include hello/hello.cpp
+
+ <hr>
+
+ Main:
+
+ \include hello/main.cpp
+*/
+
diff --git a/examples/hello/hello.h b/examples/hello/hello.h
new file mode 100644
index 000000000..c519a3351
--- /dev/null
+++ b/examples/hello/hello.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef HELLO_H
+#define HELLO_H
+
+#include <qwidget.h>
+
+
+class Hello : public TQWidget
+{
+ Q_OBJECT
+public:
+ Hello( const char *text, TQWidget *parent=0, const char *name=0 );
+signals:
+ void clicked();
+protected:
+ void mouseReleaseEvent( TQMouseEvent * );
+ void paintEvent( TQPaintEvent * );
+private slots:
+ void animate();
+private:
+ TQString t;
+ int b;
+};
+
+#endif
diff --git a/examples/hello/hello.pro b/examples/hello/hello.pro
new file mode 100644
index 000000000..de15e8ef2
--- /dev/null
+++ b/examples/hello/hello.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+TARGET = hello
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+HEADERS = hello.h
+SOURCES = hello.cpp \
+ main.cpp
diff --git a/examples/hello/main.cpp b/examples/hello/main.cpp
new file mode 100644
index 000000000..45e9e58e7
--- /dev/null
+++ b/examples/hello/main.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "hello.h"
+#include <qapplication.h>
+
+
+/*
+ The program starts here. It parses the command line and builds a message
+ string to be displayed by the Hello widget.
+*/
+
+int main( int argc, char **argv )
+{
+ TQApplication a(argc,argv);
+ TQString s;
+ for ( int i=1; i<argc; i++ ) {
+ s += argv[i];
+ if ( i<argc-1 )
+ s += " ";
+ }
+ if ( s.isEmpty() )
+ s = "Hello, World";
+ Hello h( s );
+#ifndef QT_NO_WIDGET_TOPEXTRA // for TQt/Embedded minimal build
+ h.setCaption( "TQt says hello" );
+#endif
+ TQObject::connect( &h, SIGNAL(clicked()), &a, SLOT(tquit()) );
+ h.setFont( TQFont("times",32,TQFont::Bold) ); // default font
+ h.setBackgroundColor( TQt::white ); // default bg color
+ a.setMainWidget( &h );
+ h.show();
+ return a.exec();
+}
diff --git a/examples/helpdemo/about.txt b/examples/helpdemo/about.txt
new file mode 100644
index 000000000..f47564d56
--- /dev/null
+++ b/examples/helpdemo/about.txt
@@ -0,0 +1 @@
+About text for the demo help example.
diff --git a/examples/helpdemo/doc/handbook.png b/examples/helpdemo/doc/handbook.png
new file mode 100644
index 000000000..3bd2b928b
--- /dev/null
+++ b/examples/helpdemo/doc/handbook.png
Binary files differ
diff --git a/examples/helpdemo/doc/helpdemo.adp b/examples/helpdemo/doc/helpdemo.adp
new file mode 100644
index 000000000..fbc0fc55d
--- /dev/null
+++ b/examples/helpdemo/doc/helpdemo.adp
@@ -0,0 +1,27 @@
+<!DOCTYPE DCF>
+
+<assistantconfig version="3.2.0">
+
+<profile>
+ <property name="name">HelpExample</property>
+ <property name="title">Help Example</property>
+ <property name="applicationicon">logo.png</property>
+ <property name="startpage">index.html</property>
+ <property name="aboutmenutext">About Help</property>
+ <property name="abouturl">../about.txt</property>
+ <property name="assistantdocs">../../../doc/html</property>
+</profile>
+
+<DCF ref="index.html" icon="handbook.png" title="Help example">
+ <section ref="./manual.html" title="How to use this Example">
+ <keyword ref="./manual.html#onlydoc">Example Profile</keyword>
+ <keyword ref="./manual.html#lineedit">Filename</keyword>
+ <keyword ref="./manual.html#hide">Hide Sidebar</keyword>
+ <keyword ref="./manual.html#openqabutton">Open Assistant</keyword>
+ <keyword ref="./manual.html#closeqabutton">Close Assistant</keyword>
+ <keyword ref="./manual.html#displaybutton">Display</keyword>
+ <keyword ref="./manual.html#closebutton">Close</keyword>
+ </section>
+</DCF>
+
+</assistantconfig>
diff --git a/examples/helpdemo/doc/index.html b/examples/helpdemo/doc/index.html
new file mode 100644
index 000000000..9f1fb212c
--- /dev/null
+++ b/examples/helpdemo/doc/index.html
@@ -0,0 +1,41 @@
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>Help example</title>
+ </head>
+ <body style="font-size:12pt;font-family:helvetica">
+ <p><h2>Help example</h2></p>
+
+ <p>
+ This example demonstrates how to use TQt Assistant as help system
+ for your own application. You can control TQt Assistant either directly
+ using e.g. the open button or indirectly by pressing F1.
+ </p>
+
+ <p>
+ This example provides a context sensitive help, i.e. pressing F1 will
+ show the help for the item under the mouse cursor.
+ </p>
+
+ <p>
+ In order to run TQt Assistant as a custom help tool for this
+ application properly you have to specify a profile. A profile
+ is a file format similar to the documentation content files
+ that assistant used up to TQt 3.1. Once such a profile has been
+ specified TQt Assistant can be run with the option <code>-profile</code>
+ and then the filename of the profile. The HelpDemo example does
+ this for you if you press the <i>Run TQt Assistant customized for
+ HelpDemo</i>.
+ </p>
+
+ <p>
+ TQt Assistant can also display arbitrary pages with the
+ <i>Display</i> button or using the context help (F1), but TQt
+ Assistant won't be customized for this example application.
+ </p>
+
+ <ul>
+ <li><a href="manual.html">How to use this example</a></li>
+ </ul>
+ </body>
+</html>
diff --git a/examples/helpdemo/doc/logo.png b/examples/helpdemo/doc/logo.png
new file mode 100644
index 000000000..16f7d1f3a
--- /dev/null
+++ b/examples/helpdemo/doc/logo.png
Binary files differ
diff --git a/examples/helpdemo/doc/manual.html b/examples/helpdemo/doc/manual.html
new file mode 100644
index 000000000..8410a99d5
--- /dev/null
+++ b/examples/helpdemo/doc/manual.html
@@ -0,0 +1,65 @@
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <title>How to use this Example</title>
+ </head>
+ <body style="font-size:12pt;font-family:helvetica">
+ <p><h2>How to use this Example</h2></p>
+ <p>There are three ways to get help in this example:
+ <ul>
+ <li>
+ Press F1. Depending where your mouse position is you get either the
+ help for the item under the mouse cursor or the general help for this
+ example.
+ </li>
+ <li>
+ Press the right mouse button to invoke a context menu, then click
+ 'Help'. The displayed help page is choose as described above.
+ </li>
+ <li>
+ Use the buttons to control TQt Assistant directly. For a further
+ explanation see below.
+ </li>
+ </ul>
+
+ <br><br><br><br><br><br>
+ <p><a name="openqabutton"><h3>Open Assistant Button</h3></a></p>
+ <p>Click this button to open TQt Assistant. If it is already open nothing
+ will happen. The displayed page is the one that was last displayed.</p>
+
+ <br><br><br><br><br><br>
+ <p><a name="closeqabutton"><h3>Close Assistant Button</h3></a></p>
+ <p>Click this button to close TQt Assistant. If it is not running nothing
+ will happen.</p>
+
+ <br><br><br><br><br><br>
+ <p><a name="onlydoc"><h3>Run TQt Assistant customized for HelpDemo</h3></a></p>
+ <p>Check this item in order to run TQt Assistant as a customized help tool for
+ the HelpDemo example. Checking or unchecking has no effect if TQt
+ Assistant is already running. To apply changes you have to restart
+ TQt Assistant. Please see the <code>HelpDemo::setAssistantArguments()</code>
+ function to see how TQt Assistant can be started in customized mode.
+ </p>
+
+ <br><br><br><br><br><br>
+ <p><a name="hide"><h3>Hide Sidebar on Startup</h3></a></p>
+ <p>Check this item to run TQt Assistant with the sidebar hidden.
+ Checking or unchecking has no effect if TQt Assistant is already running.
+ To apply changes you have to restart TQt Assistant.</p>
+
+ <br><br><br><br><br><br>
+ <p><a name="lineedit"><h3>Filename</h3></a></p>
+ <p>Enter the file name of a help page you want to get displayed here. The path
+ can be specified as an absolute or relative path.</p>
+
+ <br><br><br><br><br><br>
+ <p><a name="displaybutton"><h3>Display Button</h3></a></p>
+ <p>Click this button in order to get the help page which is specified in the file name
+ line edit displayed. If TQt Assistant is currently not open, it will be
+ opened automatically.</p>
+
+ <br><br><br><br><br><br>
+ <p><a name="closebutton"><h3>Close Button</h3></a></p>
+ <p>Click this button to tquit this example application.</p>
+ </body>
+</html>
diff --git a/examples/helpdemo/helpdemo.cpp b/examples/helpdemo/helpdemo.cpp
new file mode 100644
index 000000000..835d18185
--- /dev/null
+++ b/examples/helpdemo/helpdemo.cpp
@@ -0,0 +1,119 @@
+#include <qassistantclient.h>
+#include <qmessagebox.h>
+#include <qlineedit.h>
+#include <qaction.h>
+#include <qpopupmenu.h>
+#include <qcheckbox.h>
+#include <qprocess.h>
+#include <qpushbutton.h>
+#include <qdir.h>
+
+#include "helpdemo.h"
+
+HelpDemo::HelpDemo( TQWidget *parent, const char *name )
+ : HelpDemoBase( parent, name )
+{
+ leFileName->setText( "./doc/index.html" );
+ assistant = new TQAssistantClient( TQDir( "../../bin" ).absPath(), this );
+ widgets.insert( (TQWidget*)openTQAButton, "./doc/manual.html#openqabutton" );
+ widgets.insert( (TQWidget*)closeTQAButton, "./doc/manual.html#closeqabutton" );
+ widgets.insert( (TQWidget*)checkOnlyExampleDoc, "./doc/manual.html#onlydoc" );
+ widgets.insert( (TQWidget*)checkHide, "./doc/manual.html#hide" );
+ widgets.insert( (TQWidget*)leFileName, "./doc/manual.html#lineedit" );
+ widgets.insert( (TQWidget*)displayButton, "./doc/manual.html#displaybutton" );
+ widgets.insert( (TQWidget*)closeButton, "./doc/manual.html#closebutton" );
+
+ menu = new TQPopupMenu( this );
+
+ TQAction *helpAction = new TQAction( "Show Help", TQKeySequence(tr("F1")), this );
+ helpAction->addTo( menu );
+
+ connect( helpAction, SIGNAL(activated()), this, SLOT(showHelp()) );
+ connect( assistant, SIGNAL(assistantOpened()), this, SLOT(assistantOpened()) );
+ connect( assistant, SIGNAL(assistantClosed()), this, SLOT(assistantClosed()));
+ connect( assistant, SIGNAL(error(const TQString&)),
+ this, SLOT(showAssistantErrors(const TQString&)) );
+ closeTQAButton->setEnabled(FALSE);
+}
+
+HelpDemo::~HelpDemo()
+{
+}
+
+void HelpDemo::contextMenuEvent( TQContextMenuEvent *e )
+{
+ TQWidget *w = lookForWidget();
+ if ( menu->exec( e->globalPos() ) != -1 )
+ showHelp( w );
+}
+
+TQWidget* HelpDemo::lookForWidget()
+{
+ TQPtrDictIterator<char> it( widgets );
+ TQWidget *w;
+ while ( (w = (TQWidget*)(it.currentKey())) != 0 ) {
+ ++it;
+ if ( w->hasMouse() )
+ return w;
+ }
+ return 0;
+}
+
+void HelpDemo::showHelp()
+{
+ showHelp( lookForWidget() );
+}
+
+void HelpDemo::showHelp( TQWidget *w )
+{
+ if ( w )
+ assistant->showPage( TQString( widgets[w] ) );
+ else
+ assistant->showPage( "./doc/index.html" );
+}
+
+void HelpDemo::setAssistantArguments()
+{
+ TQStringList cmdLst;
+ if ( checkHide->isChecked() )
+ cmdLst << "-hideSidebar";
+ if ( checkOnlyExampleDoc->isChecked() )
+ cmdLst << "-profile"
+ << TQString("doc") + TQDir::separator() + TQString("helpdemo.adp");
+ assistant->setArguments( cmdLst );
+}
+
+void HelpDemo::openAssistant()
+{
+ if ( !assistant->isOpen() )
+ assistant->openAssistant();
+}
+
+void HelpDemo::closeAssistant()
+{
+ if ( assistant->isOpen() )
+ assistant->closeAssistant();
+}
+
+void HelpDemo::displayPage()
+{
+ assistant->showPage( leFileName->text() );
+}
+
+void HelpDemo::showAssistantErrors( const TQString &err )
+{
+ TQMessageBox::critical( this, "Assistant Error", err );
+
+}
+
+void HelpDemo::assistantOpened()
+{
+ closeTQAButton->setEnabled( TRUE );
+ openTQAButton->setEnabled( FALSE );
+}
+
+void HelpDemo::assistantClosed()
+{
+ closeTQAButton->setEnabled( FALSE );
+ openTQAButton->setEnabled( TRUE );
+}
diff --git a/examples/helpdemo/helpdemo.h b/examples/helpdemo/helpdemo.h
new file mode 100644
index 000000000..c98f26528
--- /dev/null
+++ b/examples/helpdemo/helpdemo.h
@@ -0,0 +1,42 @@
+#ifndef HELPDEMO_H
+#define HELPDEMO_H
+
+#include <qptrdict.h>
+
+#include "helpdemobase.h"
+
+class TQAssistantClient;
+class TQPopupMenu;
+
+class HelpDemo : public HelpDemoBase
+{
+ Q_OBJECT
+
+public:
+ HelpDemo( TQWidget *parent = 0, const char *name = 0 );
+ ~HelpDemo();
+
+protected:
+ void contextMenuEvent( TQContextMenuEvent *e );
+
+private slots:
+ void setAssistantArguments();
+ void openAssistant();
+ void closeAssistant();
+ void displayPage();
+ void showAssistantErrors( const TQString &err );
+ void assistantOpened();
+ void assistantClosed();
+ void showHelp();
+
+private:
+ TQWidget* lookForWidget();
+ void showHelp( TQWidget *w );
+
+ TQPtrDict<char> widgets;
+ TQAssistantClient *assistant;
+ TQPopupMenu *menu;
+
+};
+
+#endif
diff --git a/examples/helpdemo/helpdemo.pro b/examples/helpdemo/helpdemo.pro
new file mode 100644
index 000000000..ff62776dc
--- /dev/null
+++ b/examples/helpdemo/helpdemo.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on
+LIBS += -lqassistantclient
+unix {
+ UI_DIR = .ui
+ MOC_DIR = .moc
+ OBJECTS_DIR = .obj
+}
+
+REQUIRES = full-config
+
+SOURCES += helpdemo.cpp main.cpp
+HEADERS += helpdemo.h
+FORMS = helpdemobase.ui
diff --git a/examples/helpdemo/helpdemobase.ui b/examples/helpdemo/helpdemobase.ui
new file mode 100644
index 000000000..75e4b7237
--- /dev/null
+++ b/examples/helpdemo/helpdemobase.ui
@@ -0,0 +1,239 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>HelpDemoBase</class>
+<widget class="TQWidget">
+ <property name="name">
+ <cstring>HelpDemoBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>315</width>
+ <height>346</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Help Example</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </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>301</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>closeButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQFrame" row="1" column="0">
+ <property name="name">
+ <cstring>frame5</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQPushButton" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>openTQAButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Open Assistant</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQPushButton" row="4" column="3">
+ <property name="name">
+ <cstring>displayButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Display</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQCheckBox" row="3" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>checkHide</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hide Sidebar when Opening</string>
+ </property>
+ <property name="accel">
+ <string>Alt+H</string>
+ </property>
+ </widget>
+ <widget class="TQPushButton" row="1" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>closeTQAButton</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lose Assistant</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Filename:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leFileName</cstring>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="4" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>leFileName</cstring>
+ </property>
+ </widget>
+ <widget class="TQCheckBox" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>checkOnlyExampleDoc</cstring>
+ </property>
+ <property name="text">
+ <string>Run TQt Assistant customized for HelpDemo</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="TQTextEdit" row="0" column="0">
+ <property name="name">
+ <cstring>textEdit1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;
+This example demonstrates how TQt Assistant can be used as a help system for your application. If the button &lt;i&gt;"Run TQt Assistant customized for HelpDemo"&lt;/i&gt; is checked TQt Assistant will be customized for this application.
+&lt;/p&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <enum>WidgetWidth</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>closeButton</sender>
+ <signal>clicked()</signal>
+ <receiver>HelpDemoBase</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>openTQAButton</sender>
+ <signal>clicked()</signal>
+ <receiver>HelpDemoBase</receiver>
+ <slot>openAssistant()</slot>
+ </connection>
+ <connection>
+ <sender>closeTQAButton</sender>
+ <signal>clicked()</signal>
+ <receiver>HelpDemoBase</receiver>
+ <slot>closeAssistant()</slot>
+ </connection>
+ <connection>
+ <sender>displayButton</sender>
+ <signal>clicked()</signal>
+ <receiver>HelpDemoBase</receiver>
+ <slot>displayPage()</slot>
+ </connection>
+ <connection>
+ <sender>checkOnlyExampleDoc</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>HelpDemoBase</receiver>
+ <slot>setAssistantArguments()</slot>
+ </connection>
+ <connection>
+ <sender>checkHide</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>HelpDemoBase</receiver>
+ <slot>setAssistantArguments()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>displayPage()</slot>
+ <slot>openAssistant()</slot>
+ <slot>closeAssistant()</slot>
+ <slot>setAssistantArguments()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/helpdemo/main.cpp b/examples/helpdemo/main.cpp
new file mode 100644
index 000000000..c044c1797
--- /dev/null
+++ b/examples/helpdemo/main.cpp
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "helpdemo.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ HelpDemo help;
+ help.show();
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) );
+ return a.exec();
+}
diff --git a/examples/helpsystem/appicon.png b/examples/helpsystem/appicon.png
new file mode 100644
index 000000000..a50dc9ccb
--- /dev/null
+++ b/examples/helpsystem/appicon.png
Binary files differ
diff --git a/examples/helpsystem/helpsystem.doc b/examples/helpsystem/helpsystem.doc
new file mode 100644
index 000000000..d44808800
--- /dev/null
+++ b/examples/helpsystem/helpsystem.doc
@@ -0,0 +1,221 @@
+/*!
+ \page helpsystem-example.html
+
+ \ingroup examples
+ \title Helpsystem
+
+ This example demonstrates the different Qt classes
+ that can be used to provide context sensitive help
+ in an application.
+
+ It uses QToolTip and QWhatsThis to provide both static and
+ dynamic balloon help for the widgets in the application, and
+ QToolTipGroup to display extended information for each tooltip
+ in the statusbar. QAssistantClient is used to display help
+ pages using Qt Assistant.
+
+ The application has a user interface based on a
+ QMainWindow with a menubar, statusbar and a toolbar, and uses
+ a QTable as the central widget.
+ \quotefile helpsystem/tooltip.h
+ \skipto : public QToolTip
+ \printuntil };
+
+ Two QToolTip subclasses implement dynamic tooltips for
+ QHeader and QTable by reimplementing maybeTip(). The
+ constructors differ from the QToolTip constructor in having a
+ QHeader and a QTable respectively as the first parameter for
+ the constructor instead of a QWidget. This is because
+ we want to ensure that only headers and tables can be
+ passed as arguments. A QToolTipGroup can be provided as the
+ second argument to show tooltips in, for example a statusbar.
+
+ \printuntil };
+
+ The TableToolTip class keeps a reference to the QTable
+ as a member for easier access of the QTable object later on.
+
+ \quotefile helpsystem/tooltip.cpp
+ \skipto HeaderToolTip::HeaderToolTip
+ \printuntil }
+
+ The HeaderToolTip constructor propagates the parameters
+ to the QToolTip constructor.
+ \printuntil }
+
+ The implementation of maybeTip() uses the QHeader API
+ to get the section at the requested position and uses
+ QToolTip::tip() to display the section's label in a
+ tooltip. The second string is used by QToolTipGroup and will
+ show up in the statusbar.
+
+ \printuntil }
+
+ Since QTable is a QScrollView all user interaction
+ happens on QTable's viewport() . The TableToolTip
+ constructor passes the viewport() and the tooltip
+ group to the QToolTip constructor, and initializes the table
+ member with the QTable pointer itself.
+ \printto moveTopLeft
+
+ The implementation of maybeTip() uses the QTable API
+ to get information about the cell at the requested position.
+ The QTable API expects contents coordinates, and since the
+ requested point is relative to the viewport we need to translate
+ the coordinates before we can use QTable's functions.
+ \printuntil }
+ \quotefile helpsystem/whatsthis.h
+ \skipto class WhatsThis
+
+ We translate the cell's geometry back to viewport coordinates
+ so that the tooltip disappears when the mouse cursor leaves
+ the cell, and use QToolTip::tip() to display the cell's label
+ in a tooltip and to provide text for the QToolTipGroup as before.
+ \printuntil };
+ \quotefile helpsystem/whatsthis.cpp
+ \skipto WhatsThis::WhatsThis
+
+
+ The WhatsThis class is a subclass of both QObject and
+ QWhatsThis and serves as a base class for the HeaderWhatsThis
+ and TableWhatsThis classes. \footnote Note that moc retquires that QObject
+ is the first base class. \endfootnote WhatsThis
+ reimplements clicked() which will be called when the user clicks
+ inside the "What's this?" window. It also declares a signal
+ linkClicked() which will be emitted when a hyperlink is clicked.
+ \printuntil }
+
+ The WhatsThis constructor takes two parameters, the first is the
+ widget we want to provide WhatsThis for, and the second is the
+ one which receives the events. Normally this is the same widget,
+ but some widgets, like QTable, are more complex and have a
+ viewport() widget which receives the events. If such a widget
+ is passed to the constructor it will propagate the parameter to
+ the QWhatsThis constructor and store the QWidget pointer itself
+ in it's member variable to allow easier use of the QWidget API
+ later on.
+ \skipto bool WhatsThis::clicked
+ \printuntil }
+ \quotefile helpsystem/whatsthis.h
+ \skipto class HeaderWhatsThis
+
+ The implementation of clicked() emits the linkClicked() signal
+ if a hyperlink has been clicked.
+ \printuntil };
+
+ \printuntil };
+
+ \quotefile helpsystem/whatsthis.cpp
+ \skipto HeaderWhatsThis::HeaderWhatsThis
+
+ The HeaderWhatsThis and TableWhatsThis classes reimplement
+ text() to make it possible to return texts depending on the
+ mouse click's position. All the other functionality is
+ already provided by the generic WhatsThis base class. We ensure
+ type safety here in the same manner as in the tooltip classes.
+ \printuntil }
+
+ The HeaderWhatsThis constructor propagates the parameter to the
+ WhatsThis constructor.
+ \printto TableWhatsThis::TableWhatsThis
+
+ The implementation of text() uses the QHeader API to determine
+ whether we have a horizontal or a vertical header and returns
+ a string which states the header's orientation and section.
+ \footnote
+ Note that we have to explicitly scope the orientation
+ (QObject or QWhatsThis) since HeaderWhatsThis uses multiple
+ inheritance. \endfootnote
+ \printuntil }
+
+ Since QTable is a scrollview and has a viewport() which receives
+ the events, we propagate the table itself and the table's
+ viewport() to the WhatsThis constructor.
+ \printuntil }
+ \printuntil }
+ \printuntil }
+ \printuntil }
+
+ The implementation of text() uses the QTable API to get
+ information about the cell at the requested position.
+ The QTable API expects contents coordinates, so we need to
+ translate the point as shown earlier for the tooltip classes.
+ We use the rtti() function to figure out the item's type
+ and return a string accordingly.
+
+ \quotefile helpsystem/mainwindow.h
+ \skipto class MainWindow
+ \printuntil };
+
+ A QMainWindow is used to create a user interface that uses the
+ above classes in addition to Qt Assistant to provide context
+ sensitive help in the application.
+
+ The MainWindow class declares a slot called assistantSlot()
+ which creates an instance of Qt Assistant when it is called.
+ The class keeps references to the tooltip classes as members
+ because they are not QObjects and need to be deleted explicitly.
+ The class has a reference to QAssistantClient as a
+ member as well, to allow easier access to Qt Assistant later on.
+
+ \quotefile helpsystem/mainwindow.cpp
+ \skipto MainWindow::MainWindow
+ \printuntil assistant
+
+ The MainWindow constructor creates an instance of
+ QAssistantClient using QString::null as the first argument
+ so that the system path is used.
+ \printto QWhatsThis::whatsThisButton
+
+ A QTable is used as the central widget and the table, the menus
+ and the toolbar are populated.
+ \printto // create
+
+ The static function whatsThisButton() creates a QToolButton
+ which will enter "What's this?" mode when clicked.
+ \printto // set up
+
+ A QToolTipGroup is created and will show and remove tooltips
+ in the statusbar as the tooltips are displayed on the widgets.
+ \printto // set up whats this
+
+ The tooltips are set up. The static function add() sets up a
+ tooltip on the Assistant toolbutton. Tooltip objects are created
+ using the QToolTip subclasses, the constructor's first parameter
+ specifies the widget we want to add dynamic tooltips for and the
+ second argument specifies the QToolTipGroup they should belong
+ to.
+ \printto // connections
+
+ The WhatsThis help is set up. The static function add() adds
+ What's This? help for the toolbutton which opens Assistant.
+ Instances of the two WhatsThis subclasses are created for the
+ headers and the table. What's This? help is also added for the
+ menu items.
+ \printto MainWindow::~MainWindow
+
+ Signals and slots are connected, so that the relevant pages will
+ be displayed in Qt Assistant when clicking on a hyperlink or on
+ the assistant button.
+ \printuntil }
+
+ The destructor deletes the tooltips. We need to delete the
+ tooltips explicitly since QToolTip is, as mentioned above, not
+ a subclass of QObject and the instances of QToolTip not will be
+ deleted when the widget is deleted.
+ \printuntil }
+
+ The assistantSlot() uses applicationDirPath() to find the
+ location of the documentation files and shows the specified page
+ in Qt Assistant.
+ \quotefile helpsystem/main.cpp
+ \skipto #include
+ \printuntil }
+
+ The main function is a standard implementation opening
+ the application main window.
+
+ To build the example go to the helpsystem directory
+ (QTDIR/examples/helpsystem) run qmake to generate the makefile,
+ and use the make tool to build the library.
+*/
diff --git a/examples/helpsystem/helpsystem.pro b/examples/helpsystem/helpsystem.pro
new file mode 100644
index 000000000..5f528049a
--- /dev/null
+++ b/examples/helpsystem/helpsystem.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+LIBS += -lqassistantclient
+
+REQUIRES = full-config table
+
+SOURCES += main.cpp tooltip.cpp mainwindow.cpp whatsthis.cpp
+HEADERS += tooltip.h mainwindow.h whatsthis.h
diff --git a/examples/helpsystem/main.cpp b/examples/helpsystem/main.cpp
new file mode 100644
index 000000000..43c2b73c5
--- /dev/null
+++ b/examples/helpsystem/main.cpp
@@ -0,0 +1,22 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "mainwindow.h"
+
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ MainWindow main;
+ main.show();
+ app.setMainWidget( &main );
+ return app.exec();
+}
+
diff --git a/examples/helpsystem/mainwindow.cpp b/examples/helpsystem/mainwindow.cpp
new file mode 100644
index 000000000..e7e4ef9a9
--- /dev/null
+++ b/examples/helpsystem/mainwindow.cpp
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qassistantclient.h>
+#include <qfiledialog.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qstatusbar.h>
+#include <qtable.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+
+#include "mainwindow.h"
+#include "tooltip.h"
+#include "whatsthis.h"
+
+MainWindow::MainWindow()
+{
+ statusBar();
+ assistant = new TQAssistantClient( TQDir("../../bin").absPath(), this );
+
+ TQTable* table = new TQTable( 2, 3, this );
+ setCentralWidget( table );
+
+ // populate table
+ TQStringList comboEntries;
+ comboEntries << "one" << "two" << "three" << "four";
+ TQComboTableItem* comboItem1 = new TQComboTableItem( table, comboEntries );
+ TQComboTableItem* comboItem2 = new TQComboTableItem( table, comboEntries );
+ TQCheckTableItem* checkItem1 = new TQCheckTableItem( table, "Check me" );
+ TQCheckTableItem* checkItem2 = new TQCheckTableItem( table, "Check me" );
+
+ table->setItem( 0, 0, comboItem1 );
+ table->setItem( 1, 0, comboItem2 );
+
+ table->setItem( 1, 1, checkItem1 );
+ table->setItem( 0, 1, checkItem2 );
+
+ table->setText( 1, 2, "Text" );
+
+ table->horizontalHeader()->setLabel( 0, " Combos" );
+ table->horizontalHeader()->setLabel( 1, "Checkboxes" );
+ table->verticalHeader()->setLabel( 0, "1" );
+ table->verticalHeader()->setLabel( 1, "2" );
+
+
+ // populate menubar
+ TQPopupMenu* fileMenu = new TQPopupMenu( this );
+ TQPopupMenu* helpMenu = new TQPopupMenu( this );
+
+ menuBar()->insertItem( "&File", fileMenu );
+ menuBar()->insertItem( "&Help", helpMenu );
+
+ int fileId = fileMenu->insertItem( "E&xit", this, SLOT(close()) );
+
+ int helpId = helpMenu->insertItem( "Open Assistant", this, SLOT(assistantSlot()) );
+
+ // populate toolbar
+ TQToolBar* toolbar = new TQToolBar( this );
+ TQToolButton* assistantButton = new TQToolButton( toolbar );
+ assistantButton->setIconSet( TQPixmap("appicon.png") );
+ TQWhatsThis::whatsThisButton( toolbar );
+
+ //create tooltipgroup
+ TQToolTipGroup * tipGroup = new TQToolTipGroup( this );
+ connect( tipGroup, SIGNAL(showTip(const TQString&)), statusBar(),
+ SLOT(message(const TQString&)) );
+ connect( tipGroup, SIGNAL(removeTip()), statusBar(), SLOT(clear()) );
+
+ // set up tooltips
+ TQToolTip::add( assistantButton, tr ("Open Assistant"), tipGroup, "Opens TQt Assistant" );
+
+ horizontalTip = new HeaderToolTip( table->horizontalHeader(), tipGroup );
+ verticalTip = new HeaderToolTip( table->verticalHeader(), tipGroup );
+
+ cellTip = new TableToolTip( table, tipGroup );
+
+ // set up whats this
+ TQWhatsThis::add ( assistantButton, "This is a toolbutton which opens Assistant" );
+
+ HeaderWhatsThis *horizontalWhatsThis = new HeaderWhatsThis( table->horizontalHeader() );
+ HeaderWhatsThis *verticalWhatsThis = new HeaderWhatsThis( table->verticalHeader() );
+
+ TableWhatsThis *cellWhatsThis = new TableWhatsThis( table );
+
+ fileMenu->setWhatsThis( fileId, "Click here to exit the application" );
+ helpMenu->setWhatsThis( helpId, "Click here to open Assistant" );
+
+ // connections
+ connect( assistantButton, SIGNAL(clicked()), this, SLOT(assistantSlot()) );
+ connect( horizontalWhatsThis, SIGNAL(linkClicked(const TQString&)), assistant,
+ SLOT(showPage(const TQString&)) );
+ connect( verticalWhatsThis, SIGNAL(linkClicked(const TQString&)), assistant,
+ SLOT(showPage(const TQString&)) );
+ connect( cellWhatsThis, SIGNAL(linkClicked(const TQString&)), assistant,
+ SLOT(showPage(const TQString&)) );
+}
+
+MainWindow::~MainWindow()
+{
+ delete horizontalTip;
+ delete verticalTip;
+ delete cellTip;
+}
+
+void MainWindow::assistantSlot()
+{
+ TQString docsPath = TQDir("../../doc").absPath();
+ assistant->showPage( TQString("%1/html/qassistantclient.html").arg(docsPath) );
+}
diff --git a/examples/helpsystem/mainwindow.h b/examples/helpsystem/mainwindow.h
new file mode 100644
index 000000000..32c7239c8
--- /dev/null
+++ b/examples/helpsystem/mainwindow.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qmainwindow.h>
+
+class HeaderToolTip;
+class TableToolTip;
+class TQAssistantClient;
+
+class MainWindow : public TQMainWindow
+{
+ Q_OBJECT
+public:
+ MainWindow();
+ ~MainWindow();
+
+public slots:
+ void assistantSlot();
+
+private:
+ HeaderToolTip *horizontalTip;
+ HeaderToolTip *verticalTip;
+ TableToolTip *cellTip;
+ TQAssistantClient *assistant;
+};
diff --git a/examples/helpsystem/tooltip.cpp b/examples/helpsystem/tooltip.cpp
new file mode 100644
index 000000000..407afa84a
--- /dev/null
+++ b/examples/helpsystem/tooltip.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qtooltip.h>
+#include <qtable.h>
+
+#include "tooltip.h"
+
+HeaderToolTip::HeaderToolTip( TQHeader *header, TQToolTipGroup *group )
+: TQToolTip( header, group )
+{
+}
+
+void HeaderToolTip::maybeTip ( const TQPoint& p )
+{
+ TQHeader *header = (TQHeader*)parentWidget();
+
+ int section = 0;
+
+ if ( header->orientation() == Horizontal )
+ section = header->sectionAt( header->offset() + p.x() );
+ else
+ section = header->sectionAt( header->offset() + p.y() );
+
+ TQString tipString = header->label( section );
+ tip( header->sectionRect( section ), tipString, "This is a section in a header" );
+}
+
+TableToolTip::TableToolTip( TQTable *tipTable, TQToolTipGroup *group )
+: TQToolTip( tipTable->viewport(), group ), table( tipTable )
+{
+}
+
+
+void TableToolTip::maybeTip ( const TQPoint &p )
+{
+ TQPoint cp = table->viewportToContents( p );
+ int row = table->rowAt( cp.y() );
+ int col = table->columnAt( cp.x() );
+
+ TQString tipString = table->text( row, col );
+
+ TQRect cr = table->cellGeometry( row, col );
+ cr.moveTopLeft( table->contentsToViewport( cr.topLeft() ) );
+ tip( cr, tipString, "This is a cell in a table" );
+}
diff --git a/examples/helpsystem/tooltip.h b/examples/helpsystem/tooltip.h
new file mode 100644
index 000000000..69c3bb74f
--- /dev/null
+++ b/examples/helpsystem/tooltip.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TOOLTIP_H
+#define TOOLTIP_H
+
+#include <qtooltip.h>
+
+
+class TQTable;
+class TQHeader;
+
+class HeaderToolTip : public TQToolTip
+{
+public:
+ HeaderToolTip( TQHeader *header, TQToolTipGroup *group = 0 );
+
+protected:
+ void maybeTip ( const TQPoint &p );
+};
+
+class TableToolTip : public TQToolTip
+{
+public:
+ TableToolTip( TQTable* table, TQToolTipGroup *group = 0 );
+
+protected:
+ void maybeTip( const TQPoint &p );
+
+private:
+ TQTable *table;
+};
+
+
+#endif
diff --git a/examples/helpsystem/whatsthis.cpp b/examples/helpsystem/whatsthis.cpp
new file mode 100644
index 000000000..b8511cbe9
--- /dev/null
+++ b/examples/helpsystem/whatsthis.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qdir.h>
+#include <qheader.h>
+#include <qtable.h>
+
+#include "whatsthis.h"
+
+WhatsThis::WhatsThis( TQWidget *w, TQWidget *watch )
+: TQWhatsThis( watch ? watch : w ), widget( w )
+{
+}
+
+TQWidget *WhatsThis::parentWidget() const
+{
+ return widget;
+}
+
+bool WhatsThis::clicked( const TQString &link )
+{
+ if ( !link.isEmpty() )
+ emit linkClicked( link );
+
+ return TRUE;
+}
+
+HeaderWhatsThis::HeaderWhatsThis( TQHeader *h )
+: WhatsThis( h )
+{
+}
+
+TQString HeaderWhatsThis::text( const TQPoint &p )
+{
+ TQHeader *header = (TQHeader*)parentWidget();
+
+ TQString orient;
+ int section;
+ if ( header->orientation() == TQObject::Horizontal ) {
+ orient = "horizontal";
+ section = header->sectionAt( p.x() );
+ } else {
+ orient = "vertical";
+ section = header->sectionAt( p.y() );
+ }
+ if( section == -1 )
+ return "This is empty space.";
+ TQString docsPath = TQDir("../../doc").absPath();
+ return TQString("This is section number %1 in the %2 <a href=%2/html/qheader.html>header</a>.").
+ arg(section + 1).
+ arg(orient).
+ arg(docsPath);
+}
+
+TableWhatsThis::TableWhatsThis( TQTable *t )
+: WhatsThis( t, t->viewport() )
+{
+}
+
+
+TQString TableWhatsThis::text( const TQPoint &p )
+{
+ TQTable *table = (TQTable*)parentWidget();
+
+ TQPoint cp = table->viewportToContents( p );
+ int row = table->rowAt( cp.y() );
+ int col = table->columnAt( cp.x() );
+
+ if ( row == -1 || col == -1 )
+ return "This is empty space.";
+
+ TQTableItem* i = table->item( row,col );
+ if ( !i )
+ return "This is an empty cell.";
+
+ TQString docsPath = TQDir("../../doc").absPath();
+
+ if ( TQTableItem::RTTI == i->rtti() ) {
+ return TQString("This is a <a href=%1/html/qtableitem.html>TQTableItem</a>.").
+ arg(docsPath);
+ } else if ( TQComboTableItem::RTTI == i->rtti() ) {
+ return TQString("This is a <a href=%1/html/qcombotableitem.html>TQComboTableItem</a>."
+ "<br>It can be used to provide multiple-choice items in a table.").
+ arg(docsPath);
+ } else if ( TQCheckTableItem::RTTI == i->rtti() ) {
+ return TQString("This is a <a href=%1/html/qchecktableitem.html>TQCheckTableItem</a>."
+ "<br>It provide <a href=%1/html/qcheckbox.html>checkboxes</a> in tables.").
+ arg(docsPath).arg(docsPath);
+ }
+
+ return "This is a user defined table item.";
+}
diff --git a/examples/helpsystem/whatsthis.h b/examples/helpsystem/whatsthis.h
new file mode 100644
index 000000000..d15aad421
--- /dev/null
+++ b/examples/helpsystem/whatsthis.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef WHATSTHIS_H
+#define WHATSTHIS_H
+
+#include <qwhatsthis.h>
+
+class TQHeader;
+class TQTable;
+
+class WhatsThis : public TQObject, public TQWhatsThis
+{
+ Q_OBJECT
+public:
+ WhatsThis( TQWidget *w, TQWidget *watch = 0 );
+
+ bool clicked( const TQString &link );
+ TQWidget *parentWidget() const;
+
+signals:
+ void linkClicked( const TQString &link );
+
+private:
+ TQWidget *widget;
+};
+
+class HeaderWhatsThis : public WhatsThis
+{
+public:
+ HeaderWhatsThis( TQHeader *h );
+
+ TQString text( const TQPoint &p );
+};
+
+class TableWhatsThis : public WhatsThis
+{
+public:
+ TableWhatsThis( TQTable *t );
+
+ TQString text( const TQPoint &p );
+};
+
+#endif
diff --git a/examples/helpviewer/back.xpm b/examples/helpviewer/back.xpm
new file mode 100644
index 000000000..7dc5b72cb
--- /dev/null
+++ b/examples/helpviewer/back.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static char*back[]={
+"16 16 5 1",
+"# c #000000",
+"a c #ffffff",
+"c c #808080",
+"b c #c0c0c0",
+". c None",
+"................",
+".......#........",
+"......##........",
+".....#a#........",
+"....#aa########.",
+"...#aabaaaaaaa#.",
+"..#aabbbbbbbbb#.",
+"...#abbbbbbbbb#.",
+"...c#ab########.",
+"....c#a#ccccccc.",
+".....c##c.......",
+"......c#c.......",
+".......cc.......",
+"........c.......",
+"................",
+"......................"};
+
diff --git a/examples/helpviewer/forward.xpm b/examples/helpviewer/forward.xpm
new file mode 100644
index 000000000..2ed813482
--- /dev/null
+++ b/examples/helpviewer/forward.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static char*forward[]={
+"16 16 5 1",
+"# c #000000",
+"a c #ffffff",
+"c c #808080",
+"b c #c0c0c0",
+". c None",
+"................",
+"................",
+".........#......",
+".........##.....",
+".........#a#....",
+"..########aa#...",
+"..#aaaaaaabaa#..",
+"..#bbbbbbbbbaa#.",
+"..#bbbbbbbbba#..",
+"..########ba#c..",
+"..ccccccc#a#c...",
+"........c##c....",
+"........c#c.....",
+"........cc......",
+"........c.......",
+"................",
+"................"};
+
diff --git a/examples/helpviewer/helpviewer.doc b/examples/helpviewer/helpviewer.doc
new file mode 100644
index 000000000..b3d344bdb
--- /dev/null
+++ b/examples/helpviewer/helpviewer.doc
@@ -0,0 +1,28 @@
+/*
+*/
+/*! \page helpviewer-example.html
+
+ \ingroup examples
+ \title Simple HTML Help Browser
+
+ This example implements a simple HTML help browser using
+ Qt's richtext capabilities.
+
+ <hr>
+
+ Header file:
+
+ \include helpviewer/helpwindow.h
+
+ <hr>
+
+ Implementation:
+
+ \include helpviewer/helpwindow.cpp
+
+ <hr>
+
+ Main:
+
+ \include helpviewer/main.cpp
+*/
diff --git a/examples/helpviewer/helpviewer.pro b/examples/helpviewer/helpviewer.pro
new file mode 100644
index 000000000..580a604f6
--- /dev/null
+++ b/examples/helpviewer/helpviewer.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = helpviewer
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = helpwindow.h
+SOURCES = helpwindow.cpp \
+ main.cpp
diff --git a/examples/helpviewer/helpwindow.cpp b/examples/helpviewer/helpwindow.cpp
new file mode 100644
index 000000000..4ee587989
--- /dev/null
+++ b/examples/helpviewer/helpwindow.cpp
@@ -0,0 +1,315 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. 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 TQString& home_, const TQString& _path,
+ TQWidget* parent, const char *name )
+ : TQMainWindow( parent, name, WDestructiveClose ),
+ pathCombo( 0 )
+{
+ readHistory();
+ readBookmarks();
+
+ browser = new TQTextBrowser( this );
+
+ browser->mimeSourceFactory()->setFilePath( _path );
+ browser->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+ connect( browser, SIGNAL( sourceChanged(const TQString& ) ),
+ this, SLOT( sourceChanged( const TQString&) ) );
+
+ setCentralWidget( browser );
+
+ if ( !home_.isEmpty() )
+ browser->setSource( home_ );
+
+ connect( browser, SIGNAL( highlighted( const TQString&) ),
+ statusBar(), SLOT( message( const TQString&)) );
+
+ resize( 640,700 );
+
+ TQPopupMenu* file = new TQPopupMenu( this );
+ file->insertItem( tr("&New Window"), this, SLOT( newWindow() ), CTRL+Key_N );
+ file->insertItem( tr("&Open File"), this, SLOT( openFile() ), CTRL+Key_O );
+ file->insertItem( tr("&Print"), this, SLOT( print() ), CTRL+Key_P );
+ file->insertSeparator();
+ file->insertItem( tr("&Close"), this, SLOT( close() ), CTRL+Key_Q );
+ file->insertItem( tr("E&xit"), qApp, SLOT( closeAllWindows() ), CTRL+Key_X );
+
+ // The same three icons are used twice each.
+ TQIconSet icon_back( TQPixmap("back.xpm") );
+ TQIconSet icon_forward( TQPixmap("forward.xpm") );
+ TQIconSet icon_home( TQPixmap("home.xpm") );
+
+ TQPopupMenu* go = new TQPopupMenu( this );
+ backwardId = go->insertItem( icon_back,
+ tr("&Backward"), browser, SLOT( backward() ),
+ CTRL+Key_Left );
+ forwardId = go->insertItem( icon_forward,
+ tr("&Forward"), browser, SLOT( forward() ),
+ CTRL+Key_Right );
+ go->insertItem( icon_home, tr("&Home"), browser, SLOT( home() ) );
+
+ TQPopupMenu* help = new TQPopupMenu( this );
+ help->insertItem( tr("&About"), this, SLOT( about() ) );
+ help->insertItem( tr("About &TQt"), this, SLOT( aboutTQt() ) );
+
+ hist = new TQPopupMenu( this );
+ TQStringList::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 TQPopupMenu( this );
+ bookm->insertItem( tr( "Add Bookmark" ), this, SLOT( addBookmark() ) );
+ bookm->insertSeparator();
+
+ TQStringList::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()->insertSeparator();
+ menuBar()->insertItem( tr("&Help"), help );
+
+ 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 ) ) );
+
+
+ TQToolBar* toolbar = new TQToolBar( this );
+ addToolBar( toolbar, "Toolbar");
+ TQToolButton* button;
+
+ button = new TQToolButton( icon_back, tr("Backward"), "", browser, SLOT(backward()), toolbar );
+ connect( browser, SIGNAL( backwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+ button->setEnabled( FALSE );
+ button = new TQToolButton( icon_forward, tr("Forward"), "", browser, SLOT(forward()), toolbar );
+ connect( browser, SIGNAL( forwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) );
+ button->setEnabled( FALSE );
+ button = new TQToolButton( icon_home, tr("Home"), "", browser, SLOT(home()), toolbar );
+
+ toolbar->addSeparator();
+
+ pathCombo = new TQComboBox( TRUE, toolbar );
+ connect( pathCombo, SIGNAL( activated( const TQString & ) ),
+ this, SLOT( pathSelected( const TQString & ) ) );
+ 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::sourceChanged( const TQString& url )
+{
+ if ( browser->documentTitle().isNull() )
+ setCaption( "TQt Example - Helpviewer - " + url );
+ else
+ setCaption( "TQt Example - Helpviewer - " + browser->documentTitle() ) ;
+
+ if ( !url.isEmpty() && pathCombo ) {
+ bool exists = FALSE;
+ int i;
+ for ( i = 0; i < pathCombo->count(); ++i ) {
+ if ( pathCombo->text( i ) == url ) {
+ exists = TRUE;
+ break;
+ }
+ }
+ if ( !exists ) {
+ pathCombo->insertItem( url, 0 );
+ pathCombo->setCurrentItem( 0 );
+ mHistory[ hist->insertItem( url ) ] = url;
+ } else
+ pathCombo->setCurrentItem( i );
+ }
+}
+
+HelpWindow::~HelpWindow()
+{
+ history = mHistory.values();
+
+ TQFile f( TQDir::currentDirPath() + "/.history" );
+ f.open( IO_WriteOnly );
+ TQDataStream s( &f );
+ s << history;
+ f.close();
+
+ bookmarks = mBookmarks.values();
+
+ TQFile f2( TQDir::currentDirPath() + "/.bookmarks" );
+ f2.open( IO_WriteOnly );
+ TQDataStream s2( &f2 );
+ s2 << bookmarks;
+ f2.close();
+}
+
+void HelpWindow::about()
+{
+ TQMessageBox::about( this, "HelpViewer Example",
+ "<p>This example implements a simple HTML help viewer "
+ "using TQt's rich text capabilities</p>"
+ "<p>It's just about 400 lines of C++ code, so don't expect too much :-)</p>"
+ );
+}
+
+
+void HelpWindow::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQBrowser" );
+}
+
+void HelpWindow::openFile()
+{
+#ifndef QT_NO_FILEDIALOG
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::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
+ TQPrinter printer( TQPrinter::HighResolution );
+ printer.setFullPage(TRUE);
+ if ( printer.setup( this ) ) {
+ TQPainter p( &printer );
+ if( !p.isActive() ) // starting printing failed
+ return;
+ TQPaintDeviceMetrics metrics(p.device());
+ int dpiy = metrics.logicalDpiY();
+ int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins
+ TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );
+ TQSimpleRichText richText( browser->text(),
+ TQFont(),
+ browser->context(),
+ browser->styleSheet(),
+ browser->mimeSourceFactory(),
+ view.height() );
+ richText.setWidth( &p, view.width() );
+ int page = 1;
+ do {
+ richText.draw( &p, margin, margin, view, colorGroup() );
+ view.moveBy( 0, view.height() );
+ p.translate( 0 , -view.height() );
+ p.drawText( view.right() - p.fontMetrics().width( TQString::number(page) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, TQString::number(page) );
+ if ( view.top() - margin >= richText.height() )
+ break;
+ printer.newPage();
+ page++;
+ } while (TRUE);
+ }
+#endif
+}
+
+void HelpWindow::pathSelected( const TQString &_path )
+{
+ browser->setSource( _path );
+ if ( mHistory.values().contains(_path) )
+ mHistory[ hist->insertItem( _path ) ] = _path;
+}
+
+void HelpWindow::readHistory()
+{
+ if ( TQFile::exists( TQDir::currentDirPath() + "/.history" ) ) {
+ TQFile f( TQDir::currentDirPath() + "/.history" );
+ f.open( IO_ReadOnly );
+ TQDataStream s( &f );
+ s >> history;
+ f.close();
+ while ( history.count() > 20 )
+ history.remove( history.begin() );
+ }
+}
+
+void HelpWindow::readBookmarks()
+{
+ if ( TQFile::exists( TQDir::currentDirPath() + "/.bookmarks" ) ) {
+ TQFile f( TQDir::currentDirPath() + "/.bookmarks" );
+ f.open( IO_ReadOnly );
+ TQDataStream 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() ) ] = browser->context();
+}
diff --git a/examples/helpviewer/helpwindow.h b/examples/helpviewer/helpwindow.h
new file mode 100644
index 000000000..19247de2e
--- /dev/null
+++ b/examples/helpviewer/helpwindow.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. 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 TQComboBox;
+class TQPopupMenu;
+
+class HelpWindow : public TQMainWindow
+{
+ Q_OBJECT
+public:
+ HelpWindow( const TQString& home_, const TQString& path, TQWidget* parent = 0, const char *name=0 );
+ ~HelpWindow();
+
+private slots:
+ void setBackwardAvailable( bool );
+ void setForwardAvailable( bool );
+
+ void sourceChanged( const TQString& );
+ void about();
+ void aboutTQt();
+ void openFile();
+ void newWindow();
+ void print();
+
+ void pathSelected( const TQString & );
+ void histChosen( int );
+ void bookmChosen( int );
+ void addBookmark();
+
+private:
+ void readHistory();
+ void readBookmarks();
+
+ TQTextBrowser* browser;
+ TQComboBox *pathCombo;
+ int backwardId, forwardId;
+ TQStringList history, bookmarks;
+ TQMap<int, TQString> mHistory, mBookmarks;
+ TQPopupMenu *hist, *bookm;
+
+};
+
+
+
+
+
+#endif
+
diff --git a/examples/helpviewer/home.xpm b/examples/helpviewer/home.xpm
new file mode 100644
index 000000000..9c1369d9f
--- /dev/null
+++ b/examples/helpviewer/home.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+/* Drawn by Mark Donohoe for the K Desktop Environment */
+/* See http://www.kde.org */
+static char*home[]={
+"16 16 4 1",
+"# c #000000",
+"a c #ffffff",
+"b c #c0c0c0",
+". c None",
+"........... ....",
+" ....##.......",
+"..#...####......",
+"..#..#aabb#.....",
+"..#.#aaaabb#....",
+"..##aaaaaabb#...",
+"..#aaaaaaaabb#..",
+".#aaaaaaaaabbb#.",
+"###aaaaaaaabb###",
+"..#aaaaaaaabb#..",
+"..#aaa###aabb#..",
+"..#aaa#.#aabb#..",
+"..#aaa#.#aabb#..",
+"..#aaa#.#aabb#..",
+"..#aaa#.#aabb#..",
+"..#####.######..",
+"................"};
+
diff --git a/examples/helpviewer/main.cpp b/examples/helpviewer/main.cpp
new file mode 100644
index 000000000..20ddd2deb
--- /dev/null
+++ b/examples/helpviewer/main.cpp
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "helpwindow.h"
+#include <qapplication.h>
+#include <qdir.h>
+#include <stdlib.h>
+
+
+int main( int argc, char ** argv )
+{
+ TQApplication::setColorSpec( TQApplication::ManyColor );
+ TQApplication a(argc, argv);
+
+ TQString home;
+ if (argc > 1) {
+ home = argv[1];
+ } else {
+ // Use a hard coded path. It is only an example.
+ home = TQDir( "../../doc/html/index.html" ).absPath();
+ }
+
+ HelpWindow *help = new HelpWindow(home, ".", 0, "help viewer");
+ help->setCaption("TQt Example - Helpviewer");
+ if ( TQApplication::desktop()->width() > 400
+ && TQApplication::desktop()->height() > 500 )
+ help->show();
+ else
+ help->showMaximized();
+
+ TQObject::connect( &a, SIGNAL(lastWindowClosed()),
+ &a, SLOT(tquit()) );
+
+ return a.exec();
+}
diff --git a/examples/i18n/README b/examples/i18n/README
new file mode 100644
index 000000000..2f740f45b
--- /dev/null
+++ b/examples/i18n/README
@@ -0,0 +1,9 @@
+To add a language "XX":
+
+ 1. Add mywidget_XX.ts to the TRANSLATIONS entry of i18n.pro.
+ 2. Run 'lupdate i18n.pro'.
+ 3. Run 'linguist mywidget_XX.ts' and translate the strings.
+ 4. Run 'lrelease i18n.pro'.
+ 5. Run './i18n XX'.
+
+Contributions are welcome. Send them to qt-bugs@trolltech.com.
diff --git a/examples/i18n/i18n.doc b/examples/i18n/i18n.doc
new file mode 100644
index 000000000..3f31627ca
--- /dev/null
+++ b/examples/i18n/i18n.doc
@@ -0,0 +1,34 @@
+/*
+*/
+/*! \page i18n-example.html
+
+ \ingroup examples
+ \title Internationalization
+
+ This example shows how to internationalize applications. Start it with
+ <pre># i18n de</pre>
+ to get a german version and with
+ <pre># i18n en</pre>
+ to get the english version.
+
+ Refer also to <a href="i18n.html">the internationalization documentation</a>.
+
+ <hr>
+
+ Header file:
+
+ \include i18n/mywidget.h
+
+ <hr>
+
+ Implementation:
+
+ \include i18n/mywidget.cpp
+
+ <hr>
+
+ Main:
+
+ \include i18n/main.cpp
+*/
+
diff --git a/examples/i18n/i18n.pro b/examples/i18n/i18n.pro
new file mode 100644
index 000000000..f0b84e247
--- /dev/null
+++ b/examples/i18n/i18n.pro
@@ -0,0 +1,23 @@
+TEMPLATE = app
+TARGET = i18n
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = mywidget.h
+SOURCES = main.cpp \
+ mywidget.cpp
+TRANSLATIONS = mywidget_cs.ts \
+ mywidget_de.ts \
+ mywidget_el.ts \
+ mywidget_en.ts \
+ mywidget_eo.ts \
+ mywidget_fr.ts \
+ mywidget_it.ts \
+ mywidget_jp.ts \
+ mywidget_ko.ts \
+ mywidget_no.ts \
+ mywidget_ru.ts \
+ mywidget_zh.ts
diff --git a/examples/i18n/main.cpp b/examples/i18n/main.cpp
new file mode 100644
index 000000000..2c9fb2fc3
--- /dev/null
+++ b/examples/i18n/main.cpp
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qtranslator.h>
+#include <qfileinfo.h>
+#include <qmessagebox.h>
+#include <qcheckbox.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qbuttongroup.h>
+#include <qpushbutton.h>
+#include <qsignalmapper.h>
+#include <qtextcodec.h>
+#include <stdlib.h>
+
+#if defined(Q_OS_UNIX)
+#include <unistd.h>
+#endif
+
+#include "mywidget.h"
+
+//#define USE_I18N_FONT
+
+class TQVDialog : public TQDialog {
+public:
+ TQVDialog(TQWidget *parent=0, const char *name=0, bool modal=FALSE,
+ WFlags f=0) : TQDialog(parent,name,modal,f)
+ {
+ TQVBoxLayout* vb = new TQVBoxLayout(this,8);
+ vb->setAutoAdd(TRUE);
+ hb = 0;
+ sm = new TQSignalMapper(this);
+ connect(sm,SIGNAL(mapped(int)),this,SLOT(done(int)));
+ }
+ void addButtons( const TQString& cancel=TQString::null,
+ const TQString& ok=TQString::null,
+ const TQString& mid1=TQString::null,
+ const TQString& mid2=TQString::null,
+ const TQString& mid3=TQString::null)
+ {
+ addButton(ok.isNull() ? TQObject::tr("OK") : ok, 1);
+ if ( !mid1.isNull() ) addButton(mid1,2);
+ if ( !mid2.isNull() ) addButton(mid2,3);
+ if ( !mid3.isNull() ) addButton(mid3,4);
+ addButton(cancel.isNull() ? TQObject::tr("Cancel") : cancel, 0);
+ }
+
+ void addButton( const TQString& text, int result )
+ {
+ if ( !hb )
+ hb = new TQHBox(this);
+ TQPushButton *c = new TQPushButton(text, hb);
+ sm->setMapping(c,result);
+ connect(c,SIGNAL(clicked()),sm,SLOT(map()));
+ }
+
+private:
+ TQSignalMapper *sm;
+ TQHBox *hb;
+};
+
+MyWidget* showLang(TQString lang)
+{
+
+ static TQTranslator *translator = 0;
+
+ qApp->setPalette(TQPalette(TQColor(220-rand()%64,220-rand()%64,220-rand()%64)));
+
+ lang = "mywidget_" + lang + ".qm";
+ TQFileInfo fi( lang );
+
+ if ( !fi.exists() ) {
+ TQMessageBox::warning( 0, "File error",
+ TQString("Cannot find translation for language: "+lang+
+ "\n(try eg. 'de', 'ko' or 'no')") );
+ return 0;
+ }
+ if ( translator ) {
+ qApp->removeTranslator( translator );
+ delete translator;
+ }
+ translator = new TQTranslator( 0 );
+ translator->load( lang, "." );
+ qApp->installTranslator( translator );
+ MyWidget *m = new MyWidget;
+ m->setCaption("TQt Example - i18n - " + m->caption() );
+ return m;
+}
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+
+ const char* qm[]=
+ { "ar", "cs", "de", "el", "en", "eo", "fr", "it", "jp", "ko", "no", "ru", "zh", 0 };
+
+#if defined(Q_OS_UNIX)
+ srand( getpid() << 2 );
+#endif
+
+ TQString lang;
+ if ( argc == 2 )
+ lang = argv[1];
+
+ if ( argc != 2 || lang == "all" ) {
+ TQVDialog dlg(0,0,TRUE);
+ TQCheckBox* qmb[sizeof(qm)/sizeof(qm[0])];
+ int r;
+ if ( lang == "all" ) {
+ r = 2;
+ } else {
+ TQButtonGroup *bg = new TQButtonGroup(4,TQt::Vertical,"Choose Locales",&dlg);
+ TQString loc = TQTextCodec::locale();
+ for ( int i=0; qm[i]; i++ ) {
+ qmb[i] = new TQCheckBox((const char*)qm[i],bg);
+ qmb[i]->setChecked( loc == qm[i] );
+ }
+ dlg.addButtons("Cancel","OK","All");
+ r = dlg.exec();
+ }
+ if ( r ) {
+ TQRect screen = qApp->desktop()->availableGeometry();
+ bool tight = screen.width() < 1024;
+ int x=screen.left()+5;
+ int y=screen.top()+25;
+ for ( int i=0; qm[i]; i++ ) {
+ if ( r == 2 || qmb[i]->isChecked() ) {
+ MyWidget* w = showLang((const char*)qm[i]);
+
+ if( w == 0 ) exit( 0 );
+ TQObject::connect(w, SIGNAL(closed()), qApp, SLOT(tquit()));
+ w->setGeometry(x,y,197,356);
+ w->show();
+ if ( tight ) {
+ x += 8;
+ y += 8;
+ } else {
+ x += 205;
+ if ( x > 1000 ) {
+ x = 5;
+ y += 384;
+ }
+ }
+ }
+ }
+ } else {
+ exit( 0 );
+ }
+ } else {
+ TQString lang = argv[1];
+ TQWidget* m = showLang(lang);
+ app.setMainWidget( m );
+ m->setCaption("TQt Example - i18n");
+ m->show();
+ }
+
+#ifdef USE_I18N_FONT
+ memorymanager->savePrerenderedFont(font.handle(),FALSE);
+#endif
+
+ // While we run "all", kill them all
+ return app.exec();
+
+}
diff --git a/examples/i18n/mywidget.cpp b/examples/i18n/mywidget.cpp
new file mode 100644
index 000000000..94e21144e
--- /dev/null
+++ b/examples/i18n/mywidget.cpp
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qlabel.h>
+#include <qlistbox.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qaccel.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qstatusbar.h>
+#include <qapplication.h>
+
+#include "mywidget.h"
+
+MyWidget::MyWidget( TQWidget* parent, const char* name )
+ : TQMainWindow( parent, name )
+{
+ TQVBox* central = new TQVBox(this);
+ central->setMargin( 5 );
+ central->setSpacing( 5 );
+ setCentralWidget(central);
+
+ TQPopupMenu* file = new TQPopupMenu(this);
+ file->insertItem( tr("E&xit"), qApp, SLOT(tquit()),
+ TQAccel::stringToKey(tr("Ctrl+Q")) );
+ menuBar()->insertItem( tr("&File"), file );
+
+ setCaption( tr( "Internationalization Example" ) );
+
+ TQString l;
+ statusBar()->message( tr("Language: English") );
+
+ ( void )new TQLabel( tr( "The Main Window" ), central );
+
+ TQButtonGroup* gbox = new TQButtonGroup( 1, TQGroupBox::Horizontal,
+ tr( "View" ), central );
+ (void)new TQRadioButton( tr( "Perspective" ), gbox );
+ (void)new TQRadioButton( tr( "Isometric" ), gbox );
+ (void)new TQRadioButton( tr( "Oblique" ), gbox );
+
+ initChoices(central);
+}
+
+static const char* choices[] = {
+ QT_TRANSLATE_NOOP( "MyWidget", "First" ),
+ QT_TRANSLATE_NOOP( "MyWidget", "Second" ),
+ QT_TRANSLATE_NOOP( "MyWidget", "Third" ),
+ 0
+};
+
+void MyWidget::initChoices(TQWidget* parent)
+{
+ TQListBox* lb = new TQListBox( parent );
+ for ( int i = 0; choices[i]; i++ )
+ lb->insertItem( tr( choices[i] ) );
+}
+
+void MyWidget::closeEvent(TQCloseEvent* e)
+{
+ TQWidget::closeEvent(e);
+ emit closed();
+}
diff --git a/examples/i18n/mywidget.h b/examples/i18n/mywidget.h
new file mode 100644
index 000000000..964e05c49
--- /dev/null
+++ b/examples/i18n/mywidget.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef MYWIDGET_H
+#define MYWIDGET_H
+
+#include <qmainwindow.h>
+#include <qstring.h>
+
+class MyWidget : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ MyWidget( TQWidget* parent=0, const char* name = 0 );
+
+signals:
+ void closed();
+
+protected:
+ void closeEvent(TQCloseEvent*);
+
+private:
+ static void initChoices(TQWidget* parent);
+};
+
+#endif
diff --git a/examples/i18n/mywidget_ar.qm b/examples/i18n/mywidget_ar.qm
new file mode 100644
index 000000000..a8afc9d5e
--- /dev/null
+++ b/examples/i18n/mywidget_ar.qm
Binary files differ
diff --git a/examples/i18n/mywidget_ar.ts b/examples/i18n/mywidget_ar.ts
new file mode 100644
index 000000000..837417ff5
--- /dev/null
+++ b/examples/i18n/mywidget_ar.ts
@@ -0,0 +1,73 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>MyWidget</name>
+ <message>
+ <source>E&amp;xit...</source>
+ <translation type="obsolete">&amp;Esci...</translation>
+ </message>
+ <message>
+ <source>First</source>
+ <translation>Ø£Ù^Ù?</translation>
+ </message>
+ <message>
+ <source>Internationalization Example</source>
+ <translation>Ù?ثاÙ? اÙ?تدÙ^ÙSÙ?</translation>
+ </message>
+ <message>
+ <source>Isometric</source>
+ <translation>Ù?تÙ?اثÙ?</translation>
+ </message>
+ <message>
+ <source>Language: English</source>
+ <translation>اÙ?Ù?غة: اÙ?عربÙSØ©</translation>
+ </message>
+ <message>
+ <source>Oblique</source>
+ <translation>Ù?صÙ?ت</translation>
+ </message>
+ <message>
+ <source>Perspective</source>
+ <translation>Ù?Ù?ظÙ^ر</translation>
+ </message>
+ <message>
+ <source>Second</source>
+ <translation type="unfinished">ثاÙ?Ù?</translation>
+ </message>
+ <message>
+ <source>The Main Window</source>
+ <translation type="unfinished">اÙ?Ù?اÙ?ذة اÙ?رئÙSسÙSØ©</translation>
+ </message>
+ <message>
+ <source>Third</source>
+ <translation type="unfinished">ثاÙ?Ø«</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation type="unfinished">Ù?رئÙ?</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</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>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
+
diff --git a/examples/i18n/mywidget_cs.qm b/examples/i18n/mywidget_cs.qm
new file mode 100644
index 000000000..f95090d63
--- /dev/null
+++ b/examples/i18n/mywidget_cs.qm
Binary files differ
diff --git a/examples/i18n/mywidget_cs.ts b/examples/i18n/mywidget_cs.ts
new file mode 100644
index 000000000..4cf61f156
--- /dev/null
+++ b/examples/i18n/mywidget_cs.ts
@@ -0,0 +1,75 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Pohled</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Soubor</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">&amp;Konec</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">První</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">Třetí</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Jayzk: Český</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">Hlavní okno</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Nakloněný</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">Druhý</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">Isometrický</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">Perspektivní</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">Ukázka lokalizace</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>QAccel</name>
+ <message encoding="UTF-8">
+ <source>Ctrl</source>
+ <translation type="obsolete">Ctrl</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_de.qm b/examples/i18n/mywidget_de.qm
new file mode 100644
index 000000000..c251e2498
--- /dev/null
+++ b/examples/i18n/mywidget_de.qm
Binary files differ
diff --git a/examples/i18n/mywidget_de.ts b/examples/i18n/mywidget_de.ts
new file mode 100644
index 000000000..6533b9892
--- /dev/null
+++ b/examples/i18n/mywidget_de.ts
@@ -0,0 +1,75 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Ansicht</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Datei</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">Be&amp;enden</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">Erstens</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">Drittens</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Sprache: Deutsch</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">Das Hauptfenster</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+E</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Schief</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">Zweitens</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">Isometrisch</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">Perspektivisch</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">Internationalisierungsbeispiel</translation>
+ </message>
+</context>
+<context encoding="UTF-8">
+ <name>QAccel</name>
+ <message encoding="UTF-8">
+ <source>Ctrl</source>
+ <translation type="obsolete">Strg</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_el.qm b/examples/i18n/mywidget_el.qm
new file mode 100644
index 000000000..15d768951
--- /dev/null
+++ b/examples/i18n/mywidget_el.qm
Binary files differ
diff --git a/examples/i18n/mywidget_el.ts b/examples/i18n/mywidget_el.ts
new file mode 100644
index 000000000..59fb2289a
--- /dev/null
+++ b/examples/i18n/mywidget_el.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;ΑÏχείο</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">Έ&amp;ξοδος</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">ΠÏώτο</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">ΠαÏάδειγμα διεθνοποίησης</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">ΙσομετÏική</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Γλώσσα: Ελληνικά</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Πλάγια</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">ΠÏοοπτική</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">ΔεÏτεÏο</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">ΚÏÏιο παÏάθυÏο</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">ΤÏίτο</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Όψη</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_en.qm b/examples/i18n/mywidget_en.qm
new file mode 100644
index 000000000..6bd22c41d
--- /dev/null
+++ b/examples/i18n/mywidget_en.qm
Binary files differ
diff --git a/examples/i18n/mywidget_en.ts b/examples/i18n/mywidget_en.ts
new file mode 100644
index 000000000..54c4df8ee
--- /dev/null
+++ b/examples/i18n/mywidget_en.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>MyWidget</name>
+ <message>
+ <source>E&amp;xit</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>Internationalization Example</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Language: English</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The Main Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Perspective</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Isometric</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Oblique</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>First</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Second</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Third</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_eo.qm b/examples/i18n/mywidget_eo.qm
new file mode 100644
index 000000000..372cf7921
--- /dev/null
+++ b/examples/i18n/mywidget_eo.qm
Binary files differ
diff --git a/examples/i18n/mywidget_eo.ts b/examples/i18n/mywidget_eo.ts
new file mode 100644
index 000000000..381870dee
--- /dev/null
+++ b/examples/i18n/mywidget_eo.ts
@@ -0,0 +1,72 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Dosiero</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+F</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit...</source>
+ <translation type="obsolete">&amp;Fini...</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">Unue</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">Ekzemplo pri internaciigo</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">Isometria</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Lingvo: Esperanto (ĈĜĤĴŜŬĉÄĥĵÅÅ­)</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Oblikva</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">Perspektiva</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">Due</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">La Ĉeffenestro</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">Trie</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Aspekto</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_fr.qm b/examples/i18n/mywidget_fr.qm
new file mode 100644
index 000000000..12a846409
--- /dev/null
+++ b/examples/i18n/mywidget_fr.qm
Binary files differ
diff --git a/examples/i18n/mywidget_fr.ts b/examples/i18n/mywidget_fr.ts
new file mode 100644
index 000000000..a029084a8
--- /dev/null
+++ b/examples/i18n/mywidget_fr.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Vue</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Fichier</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">&amp;Quitter</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">Premier</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">Troisième</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Langage : Français</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">La fenêtre principale</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Oblique</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">Second</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">Isométrique</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">Perspective</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">Exemple d&apos;internationalisation</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_it.qm b/examples/i18n/mywidget_it.qm
new file mode 100644
index 000000000..075bee250
--- /dev/null
+++ b/examples/i18n/mywidget_it.qm
Binary files differ
diff --git a/examples/i18n/mywidget_it.ts b/examples/i18n/mywidget_it.ts
new file mode 100644
index 000000000..a450deb4c
--- /dev/null
+++ b/examples/i18n/mywidget_it.ts
@@ -0,0 +1,72 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>E&amp;xit...</source>
+ <translation type="obsolete">&amp;Esci...</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">Primo</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">Esempio di localizzazione</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">Isometrica</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Lingua: Italiano</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Obliqua</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">Prospettica</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">Secondo</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">La Finestra Principale</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">Terzo</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Vista</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</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>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_jp.qm b/examples/i18n/mywidget_jp.qm
new file mode 100644
index 000000000..8942dd7c1
--- /dev/null
+++ b/examples/i18n/mywidget_jp.qm
Binary files differ
diff --git a/examples/i18n/mywidget_jp.ts b/examples/i18n/mywidget_jp.ts
new file mode 100644
index 000000000..2a7345f60
--- /dev/null
+++ b/examples/i18n/mywidget_jp.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">ファイル(&amp;F)</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">終了(&amp;X)</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">第一行</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">国際化(i18n)ã®ä¾‹</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">等角投影法</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">言語: 日本語</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">æ–œã‚投影法</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">é è¿‘法</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">第二行</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">メインウィンドウ</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">第三行</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">表示方å¼</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_ko.qm b/examples/i18n/mywidget_ko.qm
new file mode 100644
index 000000000..dccc2ba9f
--- /dev/null
+++ b/examples/i18n/mywidget_ko.qm
Binary files differ
diff --git a/examples/i18n/mywidget_ko.ts b/examples/i18n/mywidget_ko.ts
new file mode 100644
index 000000000..acc8f9b5b
--- /dev/null
+++ b/examples/i18n/mywidget_ko.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">파ì¼&amp;F</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+E</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">종료&amp;X</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">첫번째</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">국제화 예제</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">Isometric</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">언어 : 한국어</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Oblique</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">Perspective</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">ë‘번째</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">ë©”ì¸ ìœˆë„ìš°</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">세번째</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">보기</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_no.qm b/examples/i18n/mywidget_no.qm
new file mode 100644
index 000000000..2adc1361f
--- /dev/null
+++ b/examples/i18n/mywidget_no.qm
Binary files differ
diff --git a/examples/i18n/mywidget_no.ts b/examples/i18n/mywidget_no.ts
new file mode 100644
index 000000000..341c66477
--- /dev/null
+++ b/examples/i18n/mywidget_no.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Visning</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Fil</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">&amp;Slutt</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">Første</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">Tredje</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Språk: Norsk</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">Hovedvinduet</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+S</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">Skjev</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">Andre</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">Isometrisk</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">Perspektiv</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">Internasjonaliseringseksempel</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_ru.qm b/examples/i18n/mywidget_ru.qm
new file mode 100644
index 000000000..ebc512ecf
--- /dev/null
+++ b/examples/i18n/mywidget_ru.qm
Binary files differ
diff --git a/examples/i18n/mywidget_ru.ts b/examples/i18n/mywidget_ru.ts
new file mode 100644
index 000000000..07070b036
--- /dev/null
+++ b/examples/i18n/mywidget_ru.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">Вид</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">Файл</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">Выход</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">Первый</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">Третий</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">Язык: РуÑÑкий</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">Главное окно</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">КурÑив</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">Второй</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">ИзометричеÑкий</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">ПерÑпектива</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">Пример интернациноализации</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/i18n/mywidget_zh.qm b/examples/i18n/mywidget_zh.qm
new file mode 100644
index 000000000..a890c0961
--- /dev/null
+++ b/examples/i18n/mywidget_zh.qm
Binary files differ
diff --git a/examples/i18n/mywidget_zh.ts b/examples/i18n/mywidget_zh.ts
new file mode 100644
index 000000000..8b015d6d6
--- /dev/null
+++ b/examples/i18n/mywidget_zh.ts
@@ -0,0 +1,68 @@
+<!DOCTYPE TS><TS>
+<context encoding="UTF-8">
+ <name>MyWidget</name>
+ <message encoding="UTF-8">
+ <source>View</source>
+ <translation type="unfinished">视图</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>&amp;File</source>
+ <translation type="unfinished">文件[&amp;F]</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>E&amp;xit</source>
+ <translation type="unfinished">退出[&amp;x]</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>First</source>
+ <translation type="unfinished">第一个</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Third</source>
+ <translation type="unfinished">第三个</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Language: English</source>
+ <translation type="unfinished">语言: 简体中文</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>The Main Window</source>
+ <translation type="unfinished">主窗å£</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">Ctrl+Q</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Oblique</source>
+ <translation type="unfinished">斜投影</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Second</source>
+ <translation type="unfinished">第二个</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Isometric</source>
+ <translation type="unfinished">等角投影</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Perspective</source>
+ <translation type="unfinished">é€è§†æŠ•å½±</translation>
+ </message>
+ <message encoding="UTF-8">
+ <source>Internationalization Example</source>
+ <translation type="unfinished">国际化范例</translation>
+ </message>
+</context>
+<context>
+ <name>QVDialog</name>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/iconview/iconview.doc b/examples/iconview/iconview.doc
new file mode 100644
index 000000000..5ef16a480
--- /dev/null
+++ b/examples/iconview/iconview.doc
@@ -0,0 +1,16 @@
+/*
+*/
+/*! \page iconview-example.html
+
+ \ingroup examples
+ \title Iconview
+
+ This example implements a flexible icon view which can store
+ lots of icon items. It supports Drag&Drop, different selection modes,
+ view modes, rubberband selection, etc.
+
+ Main:
+
+ \include iconview/main.cpp
+*/
+
diff --git a/examples/iconview/iconview.pro b/examples/iconview/iconview.pro
new file mode 100644
index 000000000..1d38eecf3
--- /dev/null
+++ b/examples/iconview/iconview.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = iconview
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = iconview full-config
+
+HEADERS =
+SOURCES = main.cpp
diff --git a/examples/iconview/main.cpp b/examples/iconview/main.cpp
new file mode 100644
index 000000000..18daafd08
--- /dev/null
+++ b/examples/iconview/main.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qiconview.h>
+#include <qapplication.h>
+#include <qdragobject.h>
+#include <qpixmap.h>
+#include <qiconset.h>
+
+#include <qmime.h>
+#include <stdio.h>
+
+class ListenDND : public TQObject
+{
+ Q_OBJECT
+
+public:
+ ListenDND( TQWidget *w )
+ : view( w )
+ {}
+
+public slots:
+ void dropped( TQDropEvent *mime ) {
+ qDebug( "Dropped Mimesource %p into the view %p", mime, view );
+ qDebug( " Formats:" );
+ int i = 0;
+ const char *str = mime->format( i );
+ qDebug( " %s", str );
+ while ( str ) {
+ qDebug( " %s", str );
+ str = mime->format( ++i );
+ }
+ };
+ void moved() {
+ qDebug( "All selected items were moved to another widget" );
+ }
+
+protected:
+ TQWidget *view;
+
+};
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ TQIconView qiconview;
+ qiconview.setSelectionMode( TQIconView::Extended );
+
+ for ( unsigned int i = 0; i < 3000; i++ ) {
+ TQIconViewItem *item = new TQIconViewItem( &qiconview, TQString( "Item %1" ).arg( i + 1 ) );
+ item->setRenameEnabled( TRUE );
+ }
+
+ qiconview.setCaption( "TQt Example - Iconview" );
+
+ ListenDND listen_dnd( &qiconview );
+ TQObject::connect( &qiconview, SIGNAL( dropped( TQDropEvent *, const TQValueList<TQIconDragItem> & ) ),
+ &listen_dnd, SLOT( dropped( TQDropEvent * ) ) );
+ TQObject::connect( &qiconview, SIGNAL( moved() ), &listen_dnd, SLOT( moved() ) );
+
+ a.setMainWidget( &qiconview );
+ qiconview.show();
+ qiconview.resize( qiconview.sizeHint() );
+
+ return a.exec();
+}
+
+#include "main.moc"
diff --git a/examples/iconview/simple_dd/main.cpp b/examples/iconview/simple_dd/main.cpp
new file mode 100644
index 000000000..3093e89a9
--- /dev/null
+++ b/examples/iconview/simple_dd/main.cpp
@@ -0,0 +1,187 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+
+const char* red_icon[]={
+"16 16 2 1",
+"r c red",
+". c None",
+"................",
+"................",
+"..rrrrrrrrrrrr..",
+"..rrrrrrrrrrrr..",
+"..rrrrrrrrrrrr..",
+"..rrr......rrr..",
+"..rrr......rrr..",
+"..rrr......rrr..",
+"..rrr......rrr..",
+"..rrr......rrr..",
+"..rrr......rrr..",
+"..rrrrrrrrrrrr..",
+"..rrrrrrrrrrrr..",
+"..rrrrrrrrrrrr..",
+"................",
+"................"};
+
+const char* blue_icon[]={
+"16 16 2 1",
+"b c blue",
+". c None",
+"................",
+"................",
+"..bbbbbbbbbbbb..",
+"..bbbbbbbbbbbb..",
+"..bbbbbbbbbbbb..",
+"..bbb......bbb..",
+"..bbb......bbb..",
+"..bbb......bbb..",
+"..bbb......bbb..",
+"..bbb......bbb..",
+"..bbb......bbb..",
+"..bbbbbbbbbbbb..",
+"..bbbbbbbbbbbb..",
+"..bbbbbbbbbbbb..",
+"................",
+"................"};
+
+const char* green_icon[]={
+"16 16 2 1",
+"g c green",
+". c None",
+"................",
+"................",
+"..gggggggggggg..",
+"..gggggggggggg..",
+"..gggggggggggg..",
+"..ggg......ggg..",
+"..ggg......ggg..",
+"..ggg......ggg..",
+"..ggg......ggg..",
+"..ggg......ggg..",
+"..ggg......ggg..",
+"..gggggggggggg..",
+"..gggggggggggg..",
+"..gggggggggggg..",
+"................",
+"................"};
+
+
+// ListBox -- low level drag and drop
+
+DDListBox::DDListBox( TQWidget * parent, const char * name, WFlags f ) :
+ TQListBox( parent, name, f )
+{
+ setAcceptDrops( TRUE );
+ dragging = FALSE;
+}
+
+
+void DDListBox::dragEnterEvent( TQDragEnterEvent *evt )
+{
+ if ( TQTextDrag::canDecode( evt ) )
+ evt->accept();
+}
+
+
+void DDListBox::dropEvent( TQDropEvent *evt )
+{
+ TQString text;
+
+ if ( TQTextDrag::decode( evt, text ) )
+ insertItem( text );
+}
+
+
+void DDListBox::mousePressEvent( TQMouseEvent *evt )
+{
+ TQListBox::mousePressEvent( evt );
+ dragging = TRUE;
+}
+
+
+void DDListBox::mouseMoveEvent( TQMouseEvent * )
+{
+ if ( dragging ) {
+ TQDragObject *d = new TQTextDrag( currentText(), this );
+ d->dragCopy(); // do NOT delete d.
+ dragging = FALSE;
+ }
+}
+
+
+// IconViewIcon -- high level drag and drop
+
+
+bool DDIconViewItem::acceptDrop( const TQMimeSource *mime ) const
+{
+ if ( mime->provides( "text/plain" ) )
+ return TRUE;
+ return FALSE;
+}
+
+
+void DDIconViewItem::dropped( TQDropEvent *evt, const TQValueList<TQIconDragItem>& )
+{
+ TQString label;
+
+ if ( TQTextDrag::decode( evt, label ) )
+ setText( label );
+}
+
+
+// IconView -- high level drag and drop
+
+TQDragObject *DDIconView::dragObject()
+{
+ return new TQTextDrag( currentItem()->text(), this );
+}
+
+void DDIconView::slotNewItem( TQDropEvent *evt, const TQValueList<TQIconDragItem>& )
+{
+ TQString label;
+
+ if ( TQTextDrag::decode( evt, label ) ) {
+ DDIconViewItem *item = new DDIconViewItem( this, label );
+ item->setRenameEnabled( TRUE );
+ }
+}
+
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ // Create and show the widgets
+ TQSplitter *split = new TQSplitter();
+ DDIconView *iv = new DDIconView( split );
+ (void) new DDListBox( split );
+ app.setMainWidget( split );
+ split->resize( 600, 400 );
+ split->show();
+
+ // Set up the connection so that we can drop items into the icon view
+ TQObject::connect(
+ iv, SIGNAL(dropped(TQDropEvent*, const TQValueList<TQIconDragItem>&)),
+ iv, SLOT(slotNewItem(TQDropEvent*, const TQValueList<TQIconDragItem>&)));
+
+ // Populate the TQIconView with icons
+ DDIconViewItem *item;
+ item = new DDIconViewItem( iv, "Red", TQPixmap( red_icon ) );
+ item->setRenameEnabled( TRUE );
+ item = new DDIconViewItem( iv, "Green", TQPixmap( green_icon ) );
+ item->setRenameEnabled( TRUE );
+ item = new DDIconViewItem( iv, "Blue", TQPixmap( blue_icon ) );
+ item->setRenameEnabled( TRUE );
+
+ return app.exec();
+}
+
+
diff --git a/examples/iconview/simple_dd/main.h b/examples/iconview/simple_dd/main.h
new file mode 100644
index 000000000..062d47f78
--- /dev/null
+++ b/examples/iconview/simple_dd/main.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qsplitter.h>
+#include <qlistbox.h>
+#include <qiconview.h>
+#include <qpixmap.h>
+
+class TQDragEnterEvent;
+class TQDragDropEvent;
+
+
+class DDListBox : public TQListBox
+{
+ Q_OBJECT
+public:
+ DDListBox( TQWidget * parent = 0, const char * name = 0, WFlags f = 0 );
+ // Low-level drag and drop
+ void dragEnterEvent( TQDragEnterEvent *evt );
+ void dropEvent( TQDropEvent *evt );
+ void mousePressEvent( TQMouseEvent *evt );
+ void mouseMoveEvent( TQMouseEvent * );
+private:
+ int dragging;
+};
+
+
+class DDIconViewItem : public TQIconViewItem
+{
+public:
+ DDIconViewItem( TQIconView *parent, const TQString& text, const TQPixmap& icon ) :
+ TQIconViewItem( parent, text, icon ) {}
+ DDIconViewItem( TQIconView *parent, const TQString &text ) :
+ TQIconViewItem( parent, text ) {}
+ // High-level drag and drop
+ bool acceptDrop( const TQMimeSource *mime ) const;
+ void dropped( TQDropEvent *evt, const TQValueList<TQIconDragItem>& );
+};
+
+
+class DDIconView : public TQIconView
+{
+ Q_OBJECT
+public:
+ DDIconView( TQWidget * parent = 0, const char * name = 0, WFlags f = 0 ) :
+ TQIconView( parent, name, f ) {}
+ // High-level drag and drop
+ TQDragObject *dragObject();
+public slots:
+ void slotNewItem( TQDropEvent *evt, const TQValueList<TQIconDragItem>& list );
+};
+
diff --git a/examples/iconview/simple_dd/simple_dd.doc b/examples/iconview/simple_dd/simple_dd.doc
new file mode 100644
index 000000000..257059366
--- /dev/null
+++ b/examples/iconview/simple_dd/simple_dd.doc
@@ -0,0 +1,29 @@
+/*! \page simple_dd-example.html
+
+ \ingroup examples
+ \title Drag and Drop (Simple)
+
+ This provides a very simple example of Qt's drag and drop
+ functionality.
+
+ For a more complete example see the \link dragdrop-example.html
+ Drag and Drop example\endlink.
+
+
+ <hr>
+
+ Header file:
+
+ \include iconview/simple_dd/main.h
+
+ <hr>
+
+ Implementation:
+
+ \include iconview/simple_dd/main.cpp
+
+*/
+
+
+
+
diff --git a/examples/iconview/simple_dd/simple_dd.pro b/examples/iconview/simple_dd/simple_dd.pro
new file mode 100644
index 000000000..5ccef9c6c
--- /dev/null
+++ b/examples/iconview/simple_dd/simple_dd.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS = main.h
+SOURCES = main.cpp
+
+
diff --git a/examples/layout/layout.cpp b/examples/layout/layout.cpp
new file mode 100644
index 000000000..26f2a8d14
--- /dev/null
+++ b/examples/layout/layout.cpp
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qcolor.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qmultilineedit.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+
+class ExampleWidget : public TQWidget
+{
+public:
+ ExampleWidget( TQWidget *parent = 0, const char *name = 0 );
+ ~ExampleWidget();
+};
+
+ExampleWidget::ExampleWidget( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ // Make the top-level layout; a vertical box to contain all widgets
+ // and sub-layouts.
+ TQBoxLayout *topLayout = new TQVBoxLayout( this, 5 );
+
+ // Create a menubar...
+ TQMenuBar *menubar = new TQMenuBar( this );
+ menubar->setSeparator( TQMenuBar::InWindowsStyle );
+ TQPopupMenu* popup;
+ popup = new TQPopupMenu( this );
+ popup->insertItem( "&Quit", qApp, SLOT(tquit()) );
+ menubar->insertItem( "&File", popup );
+
+ // ...and tell the layout about it.
+ topLayout->setMenuBar( menubar );
+
+ // Make an hbox that will hold a row of buttons.
+ TQBoxLayout *buttons = new TQHBoxLayout( topLayout );
+ int i;
+ for ( i = 1; i <= 4; i++ ) {
+ TQPushButton* but = new TQPushButton( this );
+ TQString s;
+ s.sprintf( "Button %d", i );
+ but->setText( s );
+
+ // Set horizontal stretch factor to 10 to let the buttons
+ // stretch horizontally. The buttons will not stretch
+ // vertically, since bigWidget below will take up vertical
+ // stretch.
+ buttons->addWidget( but, 10 );
+ // (Actually, the result would have been the same with a
+ // stretch factor of 0; if no items in a layout have non-zero
+ // stretch, the space is divided equally between members.)
+ }
+
+ // Make another hbox that will hold a left-justified row of buttons.
+ TQBoxLayout *buttons2 = new TQHBoxLayout( topLayout );
+
+ TQPushButton* but = new TQPushButton( "Button five", this );
+ buttons2->addWidget( but );
+
+ but = new TQPushButton( "Button 6", this );
+ buttons2->addWidget( but );
+
+ // Fill up the rest of the hbox with stretchable space, so that
+ // the buttons get their minimum width and are pushed to the left.
+ buttons2->addStretch( 10 );
+
+ // Make a big widget that will grab all space in the middle.
+ TQMultiLineEdit *bigWidget = new TQMultiLineEdit( this );
+ bigWidget->setText( "This widget will get all the remaining space" );
+ bigWidget->setFrameStyle( TQFrame::Panel | TQFrame::Plain );
+
+ // Set vertical stretch factor to 10 to let the bigWidget stretch
+ // vertically. It will stretch horizontally because there are no
+ // widgets beside it to take up horizontal stretch.
+ // topLayout->addWidget( bigWidget, 10 );
+ topLayout->addWidget( bigWidget );
+
+ // Make a grid that will hold a vertical table of TQLabel/TQLineEdit
+ // pairs next to a large TQMultiLineEdit.
+
+ // Don't use hard-coded row/column numbers in TQGridLayout, you'll
+ // regret it when you have to change the layout.
+ const int numRows = 3;
+ const int labelCol = 0;
+ const int linedCol = 1;
+ const int multiCol = 2;
+
+ // Let the grid-layout have a spacing of 10 pixels between
+ // widgets, overriding the default from topLayout.
+ TQGridLayout *grid = new TQGridLayout( topLayout, 0, 0, 10 );
+ int row;
+
+ for ( row = 0; row < numRows; row++ ) {
+ TQLineEdit *ed = new TQLineEdit( this );
+ // The line edit goes in the second column
+ grid->addWidget( ed, row, linedCol );
+
+ // Make a label that is a buddy of the line edit
+ TQString s;
+ s.sprintf( "Line &%d", row+1 );
+ TQLabel *label = new TQLabel( ed, s, this );
+ // The label goes in the first column.
+ grid->addWidget( label, row, labelCol );
+ }
+
+ // The multiline edit will cover the entire vertical range of the
+ // grid (rows 0 to numRows) and stay in column 2.
+
+ TQMultiLineEdit *med = new TQMultiLineEdit( this );
+ grid->addMultiCellWidget( med, 0, -1, multiCol, multiCol );
+
+ // The labels will take the space they need. Let the remaining
+ // horizontal space be shared so that the multiline edit gets
+ // twice as much as the line edit.
+ grid->setColStretch( linedCol, 10 );
+ grid->setColStretch( multiCol, 20 );
+
+ // Add a widget at the bottom.
+ TQLabel* sb = new TQLabel( this );
+ sb->setText( "Let's pretend this is a status bar" );
+ sb->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+ // This widget will use all horizontal space, and have a fixed height.
+
+ // we should have made a subclass and implemented sizePolicy there...
+ sb->setFixedHeight( sb->sizeHint().height() );
+
+ sb->setAlignment( AlignVCenter | AlignLeft );
+ topLayout->addWidget( sb );
+
+ topLayout->activate();
+}
+
+ExampleWidget::~ExampleWidget()
+{
+ // All child widgets are deleted by TQt.
+ // The top-level layout and all its sub-layouts are deleted by TQt.
+}
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ ExampleWidget f;
+ a.setMainWidget(&f);
+ f.setCaption("TQt Example - Layouts");
+ f.show();
+
+ return a.exec();
+}
diff --git a/examples/layout/layout.doc b/examples/layout/layout.doc
new file mode 100644
index 000000000..90a7d31a3
--- /dev/null
+++ b/examples/layout/layout.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page layout-example.html
+
+ \ingroup examples
+ \title Layout Managers
+
+ This example shows simple and intermediate use of Qt's layout
+ classes, QGridLayout, QBoxLayout etc.
+
+ <hr>
+
+ Implementation:
+
+ \include layout/layout.cpp
+*/
+
diff --git a/examples/layout/layout.pro b/examples/layout/layout.pro
new file mode 100644
index 000000000..054b31c78
--- /dev/null
+++ b/examples/layout/layout.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = layout
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS =
+SOURCES = layout.cpp
diff --git a/examples/life/life.cpp b/examples/life/life.cpp
new file mode 100644
index 000000000..413a7db40
--- /dev/null
+++ b/examples/life/life.cpp
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "life.h"
+
+#include <qpainter.h>
+#include <qdrawutil.h>
+#include <qcheckbox.h>
+#include <qevent.h>
+#include <qapplication.h>
+
+// The main game of life widget
+
+LifeWidget::LifeWidget( int s, TQWidget *parent, const char *name )
+ : TQFrame( parent, name )
+{
+ SCALE = s;
+
+ maxi = maxj = 50;
+ setMinimumSize( MINSIZE * SCALE + 2 * BORDER,
+ MINSIZE * SCALE + 2 * BORDER );
+ setMaximumSize( MAXSIZE * SCALE + 2 * BORDER,
+ MAXSIZE * SCALE + 2 * BORDER );
+ setSizeIncrement( SCALE, SCALE);
+
+ clear();
+ resize( maxi * SCALE + 2 * BORDER , maxj * SCALE + 2 * BORDER );
+
+}
+
+
+void LifeWidget::clear()
+{
+ current = 0;
+ for ( int t = 0; t < 2; t++ )
+ for ( int i = 0; i < MAXSIZE + 2; i++ )
+ for ( int j = 0; j < MAXSIZE + 2; j++ )
+ cells[t][i][j] = FALSE;
+
+ repaint();
+}
+
+
+// We assume that the size will never be beyond the maximum size set
+// this is not in general TRUE, but in practice it's good enough for
+// this program
+
+void LifeWidget::resizeEvent( TQResizeEvent * e )
+{
+ maxi = (e->size().width() - 2 * BORDER) / SCALE;
+ maxj = (e->size().height() - 2 * BORDER) / SCALE;
+}
+
+
+void LifeWidget::setPoint( int i, int j )
+{
+ if ( i < 1 || i > maxi || j < 1 || j > maxi )
+ return;
+ cells[current][i][j] = TRUE;
+ repaint( index2pos(i), index2pos(j), SCALE, SCALE, FALSE );
+}
+
+
+void LifeWidget::mouseHandle( const TQPoint &pos )
+{
+ int i = pos2index( pos.x() );
+ int j = pos2index( pos.y() );
+ setPoint( i, j );
+}
+
+
+void LifeWidget::mouseMoveEvent( TQMouseEvent *e )
+{
+ mouseHandle( e->pos() );
+}
+
+
+void LifeWidget::mousePressEvent( TQMouseEvent *e )
+{
+ if ( e->button() == TQMouseEvent::LeftButton )
+ mouseHandle( e->pos() );
+}
+
+
+void LifeWidget::nextGeneration()
+{
+ for ( int i = 1; i <= MAXSIZE; i++ ) {
+ for ( int j = 1; j <= MAXSIZE; j++ ) {
+ int t = cells[current][i - 1][j - 1]
+ + cells[current][i - 1][j]
+ + cells[current][i - 1][j + 1]
+ + cells[current][i][j - 1]
+ + cells[current][i][j + 1]
+ + cells[current][i + 1][j - 1]
+ + cells[current][i + 1][j]
+ + cells[current][i + 1][j + 1];
+
+ cells[!current][i][j] = ( t == 3 ||
+ t == 2 && cells[current][i][j] );
+ }
+ }
+ current = !current;
+ repaint( FALSE ); // repaint without erase
+}
+
+
+void LifeWidget::paintEvent( TQPaintEvent * e )
+{
+ int starti = pos2index( e->rect().left() );
+ int stopi = pos2index( e->rect().right() );
+ int startj = pos2index( e->rect().top() );
+ int stopj = pos2index( e->rect().bottom() );
+
+ if (stopi > maxi)
+ stopi = maxi;
+ if (stopj > maxj)
+ stopj = maxj;
+
+ TQPainter paint( this );
+ for ( int i = starti; i <= stopi; i++ ) {
+ for ( int j = startj; j <= stopj; j++ ) {
+ if ( cells[current][i][j] )
+ qDrawShadePanel( &paint, index2pos( i ), index2pos( j ),
+ SCALE - 1, SCALE - 1, colorGroup() );
+ else if ( cells[!current][i][j] )
+ erase(index2pos( i ), index2pos( j ), SCALE - 1, SCALE - 1);
+ }
+ }
+ drawFrame( &paint );
+}
diff --git a/examples/life/life.doc b/examples/life/life.doc
new file mode 100644
index 000000000..cd935cfbc
--- /dev/null
+++ b/examples/life/life.doc
@@ -0,0 +1,27 @@
+/*
+*/
+/*! \page life-example.html
+
+ \ingroup examples
+ \title Conway's Game of Life
+
+
+ <hr>
+
+ Header file:
+
+ \include life/life.h
+
+ <hr>
+
+ Implementation:
+
+ \include life/life.cpp
+
+ <hr>
+
+ Main:
+
+ \include life/main.cpp
+*/
+
diff --git a/examples/life/life.h b/examples/life/life.h
new file mode 100644
index 000000000..578044068
--- /dev/null
+++ b/examples/life/life.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef LIFE_H
+#define LIFE_H
+
+#include <qframe.h>
+
+
+class LifeWidget : public TQFrame
+{
+ Q_OBJECT
+public:
+ LifeWidget( int s = 10, TQWidget *parent = 0, const char *name = 0 );
+
+ void setPoint( int i, int j );
+
+ int maxCol() { return maxi; }
+ int maxRow() { return maxj; }
+
+public slots:
+ void nextGeneration();
+ void clear();
+
+protected:
+ virtual void paintEvent( TQPaintEvent * );
+ virtual void mouseMoveEvent( TQMouseEvent * );
+ virtual void mousePressEvent( TQMouseEvent * );
+ virtual void resizeEvent( TQResizeEvent * );
+ void mouseHandle( const TQPoint &pos );
+
+private:
+ enum { MAXSIZE = 50, MINSIZE = 10, BORDER = 5 };
+
+ bool cells[2][MAXSIZE + 2][MAXSIZE + 2];
+ int current;
+ int maxi, maxj;
+
+ int pos2index( int x )
+ {
+ return ( x - BORDER ) / SCALE + 1;
+ }
+ int index2pos( int i )
+ {
+ return ( i - 1 ) * SCALE + BORDER;
+ }
+
+ int SCALE;
+};
+
+
+#endif // LIFE_H
diff --git a/examples/life/life.pro b/examples/life/life.pro
new file mode 100644
index 000000000..cc9d22fa9
--- /dev/null
+++ b/examples/life/life.pro
@@ -0,0 +1,13 @@
+TEMPLATE = app
+TARGET = life
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = medium-config
+
+HEADERS = life.h \
+ lifedlg.h
+SOURCES = life.cpp \
+ lifedlg.cpp \
+ main.cpp
diff --git a/examples/life/lifedlg.cpp b/examples/life/lifedlg.cpp
new file mode 100644
index 000000000..1f9af427c
--- /dev/null
+++ b/examples/life/lifedlg.cpp
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "lifedlg.h"
+#include <qapplication.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qslider.h>
+#include <qcombobox.h>
+#include <qdatetime.h>
+#include <stdlib.h>
+
+#include "patterns.cpp"
+
+
+// A simple timer which has a pause and a setSpeed slot
+
+LifeTimer::LifeTimer( TQWidget *parent ) : TQTimer( parent ), interval( 500 )
+{
+ start( interval );
+}
+
+
+void LifeTimer::pause( bool stopIt )
+{
+ if ( stopIt )
+ stop();
+ else
+ start( interval );
+}
+
+
+void LifeTimer::setSpeed( int speed )
+{
+ interval = MAXSPEED - speed;
+ if ( isActive() )
+ changeInterval( interval );
+}
+
+
+// A top-level container widget to organize the others
+
+LifeDialog::LifeDialog( int scale, TQWidget * parent, const char * name )
+ : TQWidget( parent, name )
+{
+ qb = new TQPushButton( "Quit!", this );
+ cb = new TQComboBox( this, "comboBox" );
+ life = new LifeWidget(scale, this);
+ life->move( SIDEBORDER, TOPBORDER );
+
+
+ connect( qb, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+ qb->setGeometry( SIDEBORDER, SIDEBORDER, qb->sizeHint().width(), 25 );
+ timer = new LifeTimer( this );
+
+ connect( timer, SIGNAL(timeout()), life, SLOT(nextGeneration()) );
+ pb = new TQPushButton( "Pause", this );
+ pb->setToggleButton( TRUE );
+ connect( pb, SIGNAL(toggled(bool)), timer, SLOT(pause(bool)) );
+ pb->resize( pb->sizeHint().width(), 25 );
+ pb->move( width() - SIDEBORDER - pb->width(), SIDEBORDER );
+
+ sp = new TQLabel( "Speed:", this );
+ sp->adjustSize();
+ sp->move( SIDEBORDER, 45 );
+ scroll = new TQSlider( 0, LifeTimer::MAXSPEED, 50,
+ LifeTimer::MAXSPEED / 2,
+ TQSlider::Horizontal, this );
+ connect( scroll, SIGNAL(valueChanged(int)),
+ timer, SLOT(setSpeed(int)) );
+
+ scroll->move( sp->width() + 2 * SIDEBORDER, 45 );
+ scroll->resize( 200, 15 );
+
+ life->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+ life->show();
+
+ srand( TQTime(0,0,0).msecsTo(TQTime::currentTime()) );
+ int sel = rand() % NPATS;
+ getPattern( sel );
+
+ cb->move( 2*SIDEBORDER + qb->width(), SIDEBORDER);
+ cb->insertItem( "Glider Gun " );
+ cb->insertItem( "Figure Eight " );
+ cb->insertItem( "Pulsar " );
+ cb->insertItem( "Barber Pole P2 " );
+ cb->insertItem( "Achim P5 " );
+ cb->insertItem( "Hertz P4 " );
+ cb->insertItem( "Tumbler " );
+ cb->insertItem( "Pulse1 P4" );
+ cb->insertItem( "Shining Flower P5 " );
+ cb->insertItem( "Pulse2 P6 " );
+ cb->insertItem( "Pinwheel, Clock P4 " );
+ cb->insertItem( "Pentadecatholon " );
+ cb->insertItem( "Piston " );
+ cb->insertItem( "Piston2 " );
+ cb->insertItem( "Switch Engine " );
+ cb->insertItem( "Gears (Gear, Flywheel, Blinker) " );
+ cb->insertItem( "Turbine8 " );
+ cb->insertItem( "P16 " );
+ cb->insertItem( "Puffer " );
+ cb->insertItem( "Escort " );
+ cb->insertItem( "Dart Speed 1/3 " );
+ cb->insertItem( "Period 4 Speed 1/2 " );
+ cb->insertItem( "Another Period 4 Speed 1/2 " );
+ cb->insertItem( "Smallest Known Period 3 Spaceship Speed 1/3 " );
+ cb->insertItem( "Turtle Speed 1/3 " );
+ cb->insertItem( "Smallest Known Period 5 Speed 2/5 " );
+ cb->insertItem( "Sym Puffer " );
+ cb->insertItem( "], Near Ship, Pi Heptomino " );
+ cb->insertItem( "R Pentomino " );
+ cb->setAutoResize( FALSE );
+ cb->setCurrentItem( sel );
+ cb->show();
+ connect( cb, SIGNAL(activated(int)), SLOT(getPattern(int)) );
+
+ TQSize s;
+ s = life->minimumSize();
+ setMinimumSize( s.width() + 2 * SIDEBORDER,
+ s.height() + TOPBORDER + SIDEBORDER );
+ s = life->maximumSize();
+ setMaximumSize( s.width() + 2 * SIDEBORDER,
+ s.height() + TOPBORDER + SIDEBORDER );
+ s = life->sizeIncrement();
+ setSizeIncrement( s.width(), s.height() );
+
+ resize( TQMIN(512, qApp->desktop()->width()),
+ TQMIN(480, qApp->desktop()->height()) );
+}
+
+
+void LifeDialog::resizeEvent( TQResizeEvent * e )
+{
+ life->resize( e->size() - TQSize( 2 * SIDEBORDER, TOPBORDER + SIDEBORDER ));
+ pb->move( e->size().width() - SIDEBORDER - pb->width(), SIDEBORDER );
+ scroll->resize( e->size().width() - sp->width() - 3 * SIDEBORDER,
+ scroll->height() );
+ cb->resize( width() - 4*SIDEBORDER - qb->width() - pb->width() , 25 );
+}
+
+
+// Adapted from xlock, see pattern.cpp for copyright info.
+
+void LifeDialog::getPattern( int pat )
+{
+ life->clear();
+ int i = pat % NPATS;
+ int col;
+ int * patptr = &patterns[i][0];
+ while ( (col = *patptr++) != 127 ) {
+ int row = *patptr++;
+ col += life->maxCol() / 2;
+ row += life->maxRow() / 2;
+ life->setPoint( col, row );
+ }
+}
diff --git a/examples/life/lifedlg.h b/examples/life/lifedlg.h
new file mode 100644
index 000000000..4ff4b195c
--- /dev/null
+++ b/examples/life/lifedlg.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef LIFEDLG_H
+#define LIFEDLG_H
+
+#include <qtimer.h>
+#include <qwidget.h>
+
+class TQSlider;
+class TQPushButton;
+class TQLabel;
+class TQComboBox;
+
+#include "life.h"
+
+
+class LifeTimer : public TQTimer
+{
+ Q_OBJECT
+public:
+ LifeTimer( TQWidget *parent );
+ enum { MAXSPEED = 1000 };
+
+public slots:
+ void setSpeed( int speed );
+ void pause( bool );
+
+private:
+ int interval;
+};
+
+
+class LifeDialog : public TQWidget
+{
+ Q_OBJECT
+public:
+ LifeDialog( int scale = 10, TQWidget *parent = 0, const char *name = 0 );
+public slots:
+ void getPattern( int );
+
+protected:
+ virtual void resizeEvent( TQResizeEvent * e );
+
+private:
+ enum { TOPBORDER = 70, SIDEBORDER = 10 };
+
+ LifeWidget *life;
+ TQPushButton *qb;
+ LifeTimer *timer;
+ TQPushButton *pb;
+ TQComboBox *cb;
+ TQLabel *sp;
+ TQSlider *scroll;
+};
+
+
+#endif // LIFEDLG_H
diff --git a/examples/life/main.cpp b/examples/life/main.cpp
new file mode 100644
index 000000000..7505e0f28
--- /dev/null
+++ b/examples/life/main.cpp
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "lifedlg.h"
+#include <qapplication.h>
+#include <stdlib.h>
+
+void usage()
+{
+ qWarning( "Usage: life [-scale scale]" );
+}
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ int scale = 10;
+
+ for ( int i = 1; i < argc; i++ ){
+ TQString arg = argv[i];
+ if ( arg == "-scale" )
+ scale = atoi( argv[++i] );
+ else {
+ usage();
+ exit(1);
+ }
+ }
+
+ if ( scale < 2 )
+ scale = 2;
+
+ LifeDialog *life = new LifeDialog( scale );
+ a.setMainWidget( life );
+ life->setCaption("TQt Example - Life");
+ life->show();
+
+ return a.exec();
+}
diff --git a/examples/life/patterns.cpp b/examples/life/patterns.cpp
new file mode 100644
index 000000000..4203adcd6
--- /dev/null
+++ b/examples/life/patterns.cpp
@@ -0,0 +1,383 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+ *
+ * Patterns for life. Adapted from xlock; original copyright notice below.
+ *
+ * Copyright (c) 1988-91 by Patrick J. Naughton.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind. The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof. In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *****************************************************************************/
+
+//#include <qglobal.h>
+
+
+#define NUMPTS 63
+/* Patterns have < NUMPTS pts (and should have a size of <= 32x32,
+ the Gun is an exception) */
+static int patterns[][2 * NUMPTS + 1] = {
+ { /* GLIDER GUN */
+ 6, -4,
+ 5, -3, 6, -3,
+ -6, -2, -5, -2, 8, -2, 9, -2, 16, -2,
+ -7, -1, 8, -1, 9, -1, 10, -1, 16, -1, 17, -1,
+ -18, 0, -17, 0, -8, 0, 8, 0, 9, 1,
+ -17, 1, -8, 1, 5, 1, 6, 1,
+ -8, 2, 6, 2,
+ -7, 3,
+ -6, 4, -5, 4,
+ 127
+ },
+ { /* FIGURE EIGHT */
+ -3, -3, -2, -3, -1, -3,
+ -3, -2, -2, -2, -1, -2,
+ -3, -1, -2, -1, -1, -1,
+ 0, 0, 1, 0, 2, 0,
+ 0, 1, 1, 1, 2, 1,
+ 0, 2, 1, 2, 2, 2,
+ 127
+ },
+ { /* PULSAR */
+ -2, -1, -1, -1, 0, -1, 1, -1, 2, -1,
+ -2, 0, 2, 0,
+ 127
+ },
+ { /* BARBER POLE P2 */
+ -6, -6, -5, -6,
+ -6, -5, -4, -5,
+ -4, -3, -2, -3,
+ -2, -1, 0, -1,
+ 0, 1, 2, 1,
+ 2, 3, 4, 3,
+ 5, 4,
+ 4, 5, 5, 5,
+ 127
+ },
+ { /* ACHIM P5 */
+ -6, -6, -5, -6,
+ -6, -5,
+ -4, -4,
+ -4, -3, -2, -3,
+ -2, -1, 0, -1,
+ 0, 1, 2, 1,
+ 2, 3, 3, 3,
+ 5, 4,
+ 4, 5, 5, 5,
+ 127
+ },
+ { /* HERTZ P4 */
+ -2, -5, -1, -5,
+ -2, -4, -1, -4,
+ -7, -2, -6, -2, -2, -2, -1, -2, 0, -2, 1, -2, 5, -2, 6, -2,
+ -7, -1, -5, -1, -3, -1, 2, -1, 4, -1, 6, -1,
+ -5, 0, -3, 0, -2, 0, 2, 0, 4, 0,
+ -7, 1, -5, 1, -3, 1, 2, 1, 4, 1, 6, 1,
+ -7, 2, -6, 2, -2, 2, -1, 2, 0, 2, 1, 2, 5, 2, 6, 2,
+ -2, 4, -1, 4,
+ -2, 5, -1, 5,
+ 127
+ },
+ { /* TUMBLER */
+ -2, -3, -1, -3, 1, -3, 2, -3,
+ -2, -2, -1, -2, 1, -2, 2, -2,
+ -1, -1, 1, -1,
+ -3, 0, -1, 0, 1, 0, 3, 0,
+ -3, 1, -1, 1, 1, 1, 3, 1,
+ -3, 2, -2, 2, 2, 2, 3, 2,
+ 127
+ },
+ { /* PULSE1 P4*/
+ 0, -3, 1, -3,
+ -2, -2, 0, -2,
+ -3, -1, 3, -1,
+ -2, 0, 2, 0, 3, 0,
+ 0, 2, 2, 2,
+ 1, 3,
+ 127
+ },
+ { /* SHINING FLOWER P5 */
+ -1, -4, 0, -4,
+ -2, -3, 1, -3,
+ -3, -2, 2, -2,
+ -4, -1, 3, -1,
+ -4, 0, 3, 0,
+ -3, 1, 2, 1,
+ -2, 2, 1, 2,
+ -1, 3, 0, 3,
+ 127
+ },
+ { /* PULSE2 P6 */
+ 0, -4, 1, -4,
+ -4, -3, -3, -3, -1, -3,
+ -4, -2, -3, -2, 0, -2, 3, -2,
+ 1, -1, 3, -1,
+ 2, 0,
+ 1, 2, 2, 2,
+ 1, 3, 2, 3,
+ 127
+ },
+ { /* PINWHEEL, CLOCK P4 */
+ -2, -6, -1, -6,
+ -2, -5, -1, -5,
+ -2, -3, -1, -3, 0, -3, 1, -3,
+ -3, -2, -1, -2, 2, -2, 4, -2, 5, -2,
+ -3, -1, 1, -1, 2, -1, 4, -1, 5, -1,
+ -6, 0, -5, 0, -3, 0, 0, 0, 2, 0,
+ -6, 1, -5, 1, -3, 1, 2, 1,
+ -2, 2, -1, 2, 0, 2, 1, 2,
+ 0, 4, 1, 4,
+ 0, 5, 1, 5,
+ 127
+ },
+ { /* PENTADECATHOLON */
+ -5, 0, -4, 0, -3, 0, -2, 0, -1, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0,
+ 127
+ },
+ { /* PISTON */
+ 1, -3, 2, -3,
+ 0, -2,
+ -10, -1, -1, -1,
+ -11, 0, -10, 0, -1, 0, 9, 0, 10, 0,
+ -1, 1, 9, 1,
+ 0, 2,
+ 1, 3, 2, 3,
+ 127
+ },
+ { /* PISTON2 */
+ -3, -5,
+ -14, -4, -13, -4, -4, -4, -3, -4, 13, -4, 14, -4,
+ -14, -3, -13, -3, -5, -3, -4, -3, 13, -3, 14, -3,
+ -4, -2, -3, -2, 0, -2, 1, -2,
+ -4, 2, -3, 2, 0, 2, 1, 2,
+ -14, 3, -13, 3, -5, 3, -4, 3, 13, 3, 14, 3,
+ -14, 4, -13, 4, -4, 4, -3, 4, 13, 4, 14, 4,
+ -3, 5,
+ 127
+ },
+ { /* SWITCH ENGINE */
+ -12, -3, -10, -3,
+ -13, -2,
+ -12, -1, -9, -1,
+ -10, 0, -9, 0, -8, 0,
+ 13, 2, 14, 2,
+ 13, 3,
+ 127
+ },
+ { /* GEARS (gear, flywheel, blinker) */
+ -1, -4,
+ -1, -3, 1, -3,
+ -3, -2,
+ 2, -1, 3, -1,
+ -4, 0, -3, 0,
+ 2, 1,
+ -2, 2, 0, 2,
+ 0, 3,
+
+ 5, 3,
+ 3, 4, 4, 4,
+ 5, 5, 6, 5,
+ 4, 6,
+
+ 8, 0,
+ 8, 1,
+ 8, 2,
+ 127
+ },
+ { /* TURBINE8 */
+ -4, -4, -3, -4, -2, -4, -1, -4, 0, -4, 1, -4, 3, -4, 4, -4,
+ -4, -3, -3, -3, -2, -3, -1, -3, 0, -3, 1, -3, 3, -3, 4, -3,
+ 3, -2, 4, -2,
+ -4, -1, -3, -1, 3, -1, 4, -1,
+ -4, 0, -3, 0, 3, 0, 4, 0,
+ -4, 1, -3, 1, 3, 1, 4, 1,
+ -4, 2, -3, 2,
+ -4, 3, -3, 3, -1, 3, 0, 3, 1, 3, 2, 3, 3, 3, 4, 3,
+ -4, 4, -3, 4, -1, 4, 0, 4, 1, 4, 2, 4, 3, 4, 4, 4,
+ 127
+ },
+ { /* P16 */
+ -3, -6, 1, -6, 2, -6,
+ -3, -5, 0, -5, 3, -5,
+ 3, -4,
+ -5, -3, -4, -3, 1, -3, 2, -3, 5, -3, 6, -3,
+ -6, -2, -3, -2,
+ -6, -1, -3, -1,
+ -5, 0, 5, 0,
+ 3, 1, 6, 1,
+ 3, 2, 6, 2,
+ -6, 3, -5, 3, -2, 3, -1, 3, 4, 3, 5, 3,
+ -3, 4,
+ -3, 5, 0, 5, 3, 5,
+ -2, 6, -1, 6, 3, 6,
+ 127
+ },
+ { /* PUFFER */
+ 1, -9,
+ 2, -8,
+ -2, -7, 2, -7,
+ -1, -6, 0, -6, 1, -6, 2, -6,
+ -2, -2,
+ -1, -1, 0, -1,
+ 0, 0,
+ 0, 1,
+ -1, 2,
+ 1, 5,
+ 2, 6,
+ -2, 7, 2, 7,
+ -1, 8, 0, 8, 1, 8, 2, 8,
+ 127
+ },
+ { /* ESCORT */
+ 3, -8,
+ 4, -7,
+ -2, -6, 4, -6,
+ -1, -5, 0, -5, 1, -5, 2, -5, 3, -5, 4, -5,
+ -5, -1, -4, -1, -3, -1, -2, -1, -1, -1, 0, -1,
+ 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, 6, -1,
+ -6, 0, 6, 0,
+ 6, 1,
+ 5, 2,
+ 3, 4,
+ 4, 5,
+ -2, 6, 4, 6,
+ -1, 7, 0, 7, 1, 7, 2, 7, 3, 7, 4, 7,
+ 127
+ },
+ { /* DART SPEED 1/3 */
+ 3, -7,
+ 2, -6, 4, -6,
+ 1, -5, 2, -5,
+ 4, -4,
+ 0, -3, 4, -3,
+ -3, -2, 0, -2,
+ -4, -1, -2, -1, 1, -1, 2, -1, 3, -1, 4, -1,
+ -5, 0, -2, 0,
+ -4, 1, -2, 1, 1, 1, 2, 1, 3, 1, 4, 1,
+ -3, 2, 0, 2,
+ 0, 3, 4, 3,
+ 4, 4,
+ 1, 5, 2, 5,
+ 2, 6, 4, 6,
+ 3, 7,
+ 127
+ },
+ { /* PERIOD 4 SPEED 1/2 */
+ -3, -5,
+ -4, -4, -3, -4, -2, -4, -1, -4, 0, -4,
+ -5, -3, -4, -3, 0, -3, 1, -3, 3, -3,
+ -4, -2, 4, -2,
+ -3, -1, -2, -1, 1, -1, 3, -1,
+ -3, 1, -2, 1, 1, 1, 3, 1,
+ -4, 2, 4, 2,
+ -5, 3, -4, 3, 0, 3, 1, 3, 3, 3,
+ -4, 4, -3, 4, -2, 4, -1, 4, 0, 4,
+ -3, 5,
+ 127
+ },
+ { /* ANOTHER PERIOD 4 SPEED 1/2 */
+ -4, -7, -3, -7, -1, -7, 0, -7, 1, -7, 2, -7, 3, -7, 4, -7,
+ -5, -6, -4, -6, -3, -6, -2, -6, 5, -6,
+ -6, -5, -5, -5,
+ -5, -4, 5, -4,
+ -4, -3, -3, -3, -2, -3, 0, -3,
+ -2, -2,
+ -2, -1,
+ -1, 0,
+ -2, 1,
+ -2, 2,
+ -4, 3, -3, 3, -2, 3, 0, 3,
+ -5, 4, 5, 4,
+ -6, 5, -5, 5,
+ -5, 6, -4, 6, -3, 6, -2, 6, 5, 6,
+ -4, 7, -3, 7, -1, 7, 0, 7, 1, 7, 2, 7, 3, 7, 4, 7,
+ 127
+ },
+ { /* SMALLEST KNOWN PERIOD 3 SPACESHIP SPEED 1/3 */
+ 0, -8,
+ -1, -7, 1, -7,
+ -1, -6, 1, -6,
+ -1, -5,
+ -2, -3, -1, -3,
+ -1, -2, 1, -2,
+ -2, -1, 0, -1,
+ -2, 0, -1, 0, 0, 0,
+ -1, 2, 1, 2,
+ -1, 3, 0, 3,
+ 0, 4,
+ 0, 5, 2, 5,
+ 0, 6, 2, 6,
+ 1, 7,
+ 127
+ },
+ { /* TURTLE SPEED 1/3 */
+ -4, -5, -3, -5, -2, -5, 6, -5,
+ -4, -4, -3, -4, 0, -4, 2, -4, 3, -4, 5, -4, 6, -4,
+ -2, -3, -1, -3, 0, -3, 5, -3,
+ -4, -2, -1, -2, 1, -2, 5, -2,
+ -5, -1, 0, -1, 5, -1,
+ -5, 0, 0, 0, 5, 0,
+ -4, 1, -1, 1, 1, 1, 5, 1,
+ -2, 2, -1, 2, 0, 2, 5, 2,
+ -4, 3, -3, 3, 0, 3, 2, 3, 3, 3, 5, 3, 6, 3,
+ -4, 4, -3, 4, -2, 4, 6, 4,
+ 127
+ },
+ { /* SMALLEST KNOWN PERIOD 5 SPEED 2/5 */
+ 1, -7, 3, -7,
+ -2, -6, 3, -6,
+ -3, -5, -2, -5, -1, -5, 4, -5,
+ -4, -4, -2, -4,
+ -5, -3, -4, -3, -1, -3, 0, -3, 5, -3,
+ -4, -2, -3, -2, 0, -2, 1, -2, 2, -2, 3, -2, 4, -2,
+ -4, 2, -3, 2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 2,
+ -5, 3, -4, 3, -1, 3, 0, 3, 5, 3,
+ -4, 4, -2, 4,
+ -3, 5, -2, 5, -1, 5, 4, 5,
+ -2, 6, 3, 6,
+ 1, 7, 3, 7,
+ 127
+ },
+ { /* SYM PUFFER */
+ 1, -4, 2, -4, 3, -4, 4, -4,
+ 0, -3, 4, -3,
+ 4, -2,
+ -4, -1, -3, -1, 0, -1, 3, -1,
+ -4, 0, -3, 0, -2, 0,
+ -4, 1, -3, 1, 0, 1, 3, 1,
+ 4, 2,
+ 0, 3, 4, 3,
+ 1, 4, 2, 4, 3, 4, 4, 4,
+ 127
+ },
+ { /* ], NEAR SHIP, PI HEPTOMINO */
+ -2, -1, -1, -1, 0, -1,
+ 1, 0,
+ -2, 1, -1, 1, 0, 1,
+ 127
+ },
+ { /* R PENTOMINO */
+ 0, -1, 1, -1,
+ -1, 0, 0, 0,
+ 0, 1,
+ 127
+ }
+};
+
+#define NPATS (sizeof patterns / sizeof patterns[0])
diff --git a/examples/lineedits/lineedits.cpp b/examples/lineedits/lineedits.cpp
new file mode 100644
index 000000000..02c310e69
--- /dev/null
+++ b/examples/lineedits/lineedits.cpp
@@ -0,0 +1,272 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "lineedits.h"
+
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qframe.h>
+#include <qvalidator.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qhbox.h>
+
+/*
+ * Constructor
+ *
+ * Creates child widgets of the LineEdits widget
+ */
+
+LineEdits::LineEdits( TQWidget *parent, const char *name )
+ : TQGroupBox( 0, Horizontal, "Line edits", parent, name )
+{
+ setMargin( 10 );
+
+ TQVBoxLayout* box = new TQVBoxLayout( layout() );
+
+ TQHBoxLayout *row1 = new TQHBoxLayout( box );
+ row1->setMargin( 5 );
+
+ // Create a Label
+ TQLabel* label = new TQLabel( "Echo Mode: ", this);
+ row1->addWidget( label );
+
+ // Create a Combobox with three items...
+ combo1 = new TQComboBox( FALSE, this );
+ row1->addWidget( combo1 );
+ combo1->insertItem( "Normal" );
+ combo1->insertItem( "Password" );
+ combo1->insertItem( "No Echo" );
+ // ...and connect the activated() SIGNAL with the slotEchoChanged() SLOT to be able
+ // to react when an item is selected
+ connect( combo1, SIGNAL( activated( int ) ), this, SLOT( slotEchoChanged( int ) ) );
+
+ // insert the first LineEdit
+ lined1 = new TQLineEdit( this );
+ box->addWidget( lined1 );
+
+ // another widget which is used for layouting
+ TQHBoxLayout *row2 = new TQHBoxLayout( box );
+ row2->setMargin( 5 );
+
+ // and the second label
+ label = new TQLabel( "Validator: ", this );
+ row2->addWidget( label );
+
+ // A second Combobox with again three items...
+ combo2 = new TQComboBox( FALSE, this );
+ row2->addWidget( combo2 );
+ combo2->insertItem( "No Validator" );
+ combo2->insertItem( "Integer Validator" );
+ combo2->insertItem( "Double Validator" );
+ // ...and again the activated() SIGNAL gets connected with a SLOT
+ connect( combo2, SIGNAL( activated( int ) ), this, SLOT( slotValidatorChanged( int ) ) );
+
+ // and the second LineEdit
+ lined2 = new TQLineEdit( this );
+ box->addWidget( lined2 );
+
+ // yet another widget which is used for layouting
+ TQHBoxLayout *row3 = new TQHBoxLayout( box );
+ row3->setMargin( 5 );
+
+ // we need a label for this too
+ label = new TQLabel( "Alignment: ", this );
+ row3->addWidget( label );
+
+ // A combo box for setting alignment
+ combo3 = new TQComboBox( FALSE, this );
+ row3->addWidget( combo3 );
+ combo3->insertItem( "Left" );
+ combo3->insertItem( "Centered" );
+ combo3->insertItem( "Right" );
+ // ...and again the activated() SIGNAL gets connected with a SLOT
+ connect( combo3, SIGNAL( activated( int ) ), this, SLOT( slotAlignmentChanged( int ) ) );
+
+ // and the third lineedit
+ lined3 = new TQLineEdit( this );
+ box->addWidget( lined3 );
+
+ // exactly the same for the fourth
+ TQHBoxLayout *row4 = new TQHBoxLayout( box );
+ row4->setMargin( 5 );
+
+ // we need a label for this too
+ label = new TQLabel( "Input mask: ", this );
+ row4->addWidget( label );
+
+ // A combo box for choosing an input mask
+ combo4 = new TQComboBox( FALSE, this );
+ row4->addWidget( combo4 );
+ combo4->insertItem( "No mask" );
+ combo4->insertItem( "Phone number" );
+ combo4->insertItem( "ISO date" );
+ combo4->insertItem( "License key" );
+
+ // ...this time we use the activated( const TQString & ) signal
+ connect( combo4, SIGNAL( activated( int ) ),
+ this, SLOT( slotInputMaskChanged( int ) ) );
+
+ // and the fourth lineedit
+ lined4 = new TQLineEdit( this );
+ box->addWidget( lined4 );
+
+ // last widget used for layouting
+ TQHBox *row5 = new TQHBox( this );
+ box->addWidget( row5 );
+ row5->setMargin( 5 );
+
+ // last label
+ (void)new TQLabel( "Read-Only: ", row5 );
+
+ // A combo box for setting alignment
+ combo5 = new TQComboBox( FALSE, row5 );
+ combo5->insertItem( "False" );
+ combo5->insertItem( "True" );
+ // ...and again the activated() SIGNAL gets connected with a SLOT
+ connect( combo5, SIGNAL( activated( int ) ), this, SLOT( slotReadOnlyChanged( int ) ) );
+
+ // and the last lineedit
+ lined5 = new TQLineEdit( this );
+ box->addWidget( lined5 );
+
+ // give the first LineEdit the focus at the beginning
+ lined1->setFocus();
+}
+
+/*
+ * SLOT slotEchoChanged( int i )
+ *
+ * i contains the number of the item which the user has been chosen in the
+ * first Combobox. According to this value, we set the Echo-Mode for the
+ * first LineEdit.
+ */
+
+void LineEdits::slotEchoChanged( int i )
+{
+ switch ( i ) {
+ case 0:
+ lined1->setEchoMode( TQLineEdit::Normal );
+ break;
+ case 1:
+ lined1->setEchoMode( TQLineEdit::Password );
+ break;
+ case 2:
+ lined1->setEchoMode( TQLineEdit::NoEcho );
+ break;
+ }
+
+ lined1->setFocus();
+}
+
+/*
+ * SLOT slotValidatorChanged( int i )
+ *
+ * i contains the number of the item which the user has been chosen in the
+ * second Combobox. According to this value, we set a validator for the
+ * second LineEdit. A validator checks in a LineEdit each character which
+ * the user enters and accepts it if it is valid, else the character gets
+ * ignored and not inserted into the lineedit.
+ */
+
+void LineEdits::slotValidatorChanged( int i )
+{
+ switch ( i ) {
+ case 0:
+ lined2->setValidator( 0 );
+ break;
+ case 1:
+ lined2->setValidator( new TQIntValidator( lined2 ) );
+ break;
+ case 2:
+ lined2->setValidator( new TQDoubleValidator( -999.0, 999.0, 2,
+ lined2 ) );
+ break;
+ }
+
+ lined2->setText( "" );
+ lined2->setFocus();
+}
+
+
+/*
+ * SLOT slotAlignmentChanged( int i )
+ *
+ * i contains the number of the item which the user has been chosen in
+ * the third Combobox. According to this value, we set an alignment
+ * third LineEdit.
+ */
+
+void LineEdits::slotAlignmentChanged( int i )
+{
+ switch ( i ) {
+ case 0:
+ lined3->setAlignment( TQLineEdit::AlignLeft );
+ break;
+ case 1:
+ lined3->setAlignment( TQLineEdit::AlignCenter );
+ break;
+ case 2:
+ lined3->setAlignment( TQLineEdit::AlignRight );
+ break;
+ }
+
+ lined3->setFocus();
+}
+
+/*
+ * SLOT slotInputMaskChanged( const TQString &mask )
+ *
+ * i contains the number of the item which the user has been chosen in
+ * the third Combobox. According to this value, we set an input mask on
+ * third LineEdit.
+ */
+
+void LineEdits::slotInputMaskChanged( int i )
+{
+ switch( i ) {
+ case 0:
+ lined4->setInputMask( TQString::null );
+ break;
+ case 1:
+ lined4->setInputMask( "+99 99 99 99 99;_" );
+ break;
+ case 2:
+ lined4->setInputMask( "0000-00-00" );
+ lined4->setText( "00000000" );
+ lined4->setCursorPosition( 0 );
+ break;
+ case 3:
+ lined4->setInputMask( ">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#" );
+ break;
+ }
+ lined4->setFocus();
+}
+
+/*
+ * SLOT slotReadOnlyChanged( int i )
+ *
+ * i contains the number of the item which the user has been chosen in
+ * the fourth Combobox. According to this value, we toggle read-only.
+ */
+
+void LineEdits::slotReadOnlyChanged( int i )
+{
+ switch ( i ) {
+ case 0:
+ lined5->setReadOnly( FALSE );
+ break;
+ case 1:
+ lined5->setReadOnly( TRUE );
+ break;
+ }
+
+ lined5->setFocus();
+}
+
diff --git a/examples/lineedits/lineedits.doc b/examples/lineedits/lineedits.doc
new file mode 100644
index 000000000..a75f0f1b3
--- /dev/null
+++ b/examples/lineedits/lineedits.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page lineedits-example.html
+
+ \ingroup examples
+ \title Line Edits
+
+ This example shows how to work with single lineedit widgets, and
+ how to use different echo modes and validators.
+
+ <hr>
+
+ Header file:
+
+ \include lineedits/lineedits.h
+
+ <hr>
+
+ Implementation:
+
+ \include lineedits/lineedits.cpp
+
+ <hr>
+
+ Main:
+
+ \include lineedits/main.cpp
+*/
+
diff --git a/examples/lineedits/lineedits.h b/examples/lineedits/lineedits.h
new file mode 100644
index 000000000..efb901551
--- /dev/null
+++ b/examples/lineedits/lineedits.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef LINEDITS_H
+#define LINEDITS_H
+
+#include <qgroupbox.h>
+
+class TQLineEdit;
+class TQComboBox;
+
+class LineEdits : public TQGroupBox
+{
+ Q_OBJECT
+
+public:
+ LineEdits( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ TQLineEdit *lined1, *lined2, *lined3, *lined4, *lined5;
+ TQComboBox *combo1, *combo2, *combo3, *combo4, *combo5;
+
+protected slots:
+ void slotEchoChanged( int );
+ void slotValidatorChanged( int );
+ void slotAlignmentChanged( int );
+ void slotInputMaskChanged( int );
+ void slotReadOnlyChanged( int );
+};
+
+#endif
diff --git a/examples/lineedits/lineedits.pro b/examples/lineedits/lineedits.pro
new file mode 100644
index 000000000..cab7c409e
--- /dev/null
+++ b/examples/lineedits/lineedits.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = lineedits
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = medium-config
+
+HEADERS = lineedits.h
+SOURCES = lineedits.cpp \
+ main.cpp
diff --git a/examples/lineedits/main.cpp b/examples/lineedits/main.cpp
new file mode 100644
index 000000000..98592107b
--- /dev/null
+++ b/examples/lineedits/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "lineedits.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ LineEdits lineedits;
+ lineedits.setCaption( "TQt Example - Lineedits" );
+ a.setMainWidget( &lineedits );
+ lineedits.show();
+
+ return a.exec();
+}
diff --git a/examples/listbox/listbox.cpp b/examples/listbox/listbox.cpp
new file mode 100644
index 000000000..bf4049787
--- /dev/null
+++ b/examples/listbox/listbox.cpp
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "listbox.h"
+
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qlistbox.h>
+#include <qbuttongroup.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+
+
+ListBoxDemo::ListBoxDemo()
+ : TQWidget( 0, 0 )
+{
+ TQGridLayout * g = new TQGridLayout( this, 2, 2, 6 );
+
+ g->addWidget( new TQLabel( "<b>Configuration:</b>", this ), 0, 0 );
+ g->addWidget( new TQLabel( "<b>Result:</b>", this ), 0, 1 );
+
+ l = new TQListBox( this );
+ g->addWidget( l, 1, 1 );
+ l->setFocusPolicy( TQWidget::StrongFocus );
+
+ TQVBoxLayout * v = new TQVBoxLayout;
+ g->addLayout( v, 1, 0 );
+
+ TQRadioButton * b;
+ bg = new TQButtonGroup( 0 );
+
+ b = new TQRadioButton( "Fixed number of columns,\n"
+ "as many rows as needed.",
+ this );
+ bg->insert( b );
+ v->addWidget( b );
+ b->setChecked( TRUE );
+ connect( b, SIGNAL(clicked()), this, SLOT(setNumCols()) );
+ TQHBoxLayout * h = new TQHBoxLayout;
+ v->addLayout( h );
+ h->addSpacing( 30 );
+ h->addSpacing( 100 );
+ h->addWidget( new TQLabel( "Columns:", this ) );
+ columns = new TQSpinBox( this );
+ h->addWidget( columns );
+
+ v->addSpacing( 12 );
+
+ b = new TQRadioButton( "As many columns as fit on-screen,\n"
+ "as many rows as needed.",
+ this );
+ bg->insert( b );
+ v->addWidget( b );
+ connect( b, SIGNAL(clicked()), this, SLOT(setColsByWidth()) );
+
+ v->addSpacing( 12 );
+
+ b = new TQRadioButton( "Fixed number of rows,\n"
+ "as many columns as needed.",
+ this );
+ bg->insert( b );
+ v->addWidget( b );
+ connect( b, SIGNAL(clicked()), this, SLOT(setNumRows()) );
+ h = new TQHBoxLayout;
+ v->addLayout( h );
+ h->addSpacing( 30 );
+ h->addSpacing( 100 );
+ h->addWidget( new TQLabel( "Rows:", this ) );
+ rows = new TQSpinBox( this );
+ rows->setEnabled( FALSE );
+ h->addWidget( rows );
+
+ v->addSpacing( 12 );
+
+ b = new TQRadioButton( "As many rows as fit on-screen,\n"
+ "as many columns as needed.",
+ this );
+ bg->insert( b );
+ v->addWidget( b );
+ connect( b, SIGNAL(clicked()), this, SLOT(setRowsByHeight()) );
+
+ v->addSpacing( 12 );
+
+ TQCheckBox * cb = new TQCheckBox( "Variable-height rows", this );
+ cb->setChecked( TRUE );
+ connect( cb, SIGNAL(toggled(bool)), this, SLOT(setVariableHeight(bool)) );
+ v->addWidget( cb );
+ v->addSpacing( 6 );
+
+ cb = new TQCheckBox( "Variable-width columns", this );
+ connect( cb, SIGNAL(toggled(bool)), this, SLOT(setVariableWidth(bool)) );
+ v->addWidget( cb );
+
+ cb = new TQCheckBox( "Extended-Selection", this );
+ connect( cb, SIGNAL(toggled(bool)), this, SLOT(setMultiSelection(bool)) );
+ v->addWidget( cb );
+
+ TQPushButton *pb = new TQPushButton( "Sort ascending", this );
+ connect( pb, SIGNAL( clicked() ), this, SLOT( sortAscending() ) );
+ v->addWidget( pb );
+
+ pb = new TQPushButton( "Sort descending", this );
+ connect( pb, SIGNAL( clicked() ), this, SLOT( sortDescending() ) );
+ v->addWidget( pb );
+
+ v->addStretch( 100 );
+
+ int i = 0;
+ while( ++i <= 2560 )
+ l->insertItem( TQString::fromLatin1( "Item " ) + TQString::number( i ),
+ i );
+ columns->setRange( 1, 256 );
+ columns->setValue( 1 );
+ rows->setRange( 1, 256 );
+ rows->setValue( 256 );
+
+ connect( columns, SIGNAL(valueChanged(int)), this, SLOT(setNumCols()) );
+ connect( rows, SIGNAL(valueChanged(int)), this, SLOT(setNumRows()) );
+}
+
+
+ListBoxDemo::~ListBoxDemo()
+{
+ delete bg;
+}
+
+
+void ListBoxDemo::setNumRows()
+{
+ columns->setEnabled( FALSE );
+ rows->setEnabled( TRUE );
+ l->setRowMode( rows->value() );
+}
+
+
+void ListBoxDemo::setNumCols()
+{
+ columns->setEnabled( TRUE );
+ rows->setEnabled( FALSE );
+ l->setColumnMode( columns->value() );
+}
+
+
+void ListBoxDemo::setRowsByHeight()
+{
+ columns->setEnabled( FALSE );
+ rows->setEnabled( FALSE );
+ l->setRowMode( TQListBox::FitToHeight );
+}
+
+
+void ListBoxDemo::setColsByWidth()
+{
+ columns->setEnabled( FALSE );
+ rows->setEnabled( FALSE );
+ l->setColumnMode( TQListBox::FitToWidth );
+}
+
+
+void ListBoxDemo::setVariableWidth( bool b )
+{
+ l->setVariableWidth( b );
+}
+
+
+void ListBoxDemo::setVariableHeight( bool b )
+{
+ l->setVariableHeight( b );
+}
+
+void ListBoxDemo::setMultiSelection( bool b )
+{
+ l->clearSelection();
+ l->setSelectionMode( b ? TQListBox::Extended : TQListBox::Single );
+}
+
+void ListBoxDemo::sortAscending()
+{
+ l->sort( TRUE );
+}
+
+void ListBoxDemo::sortDescending()
+{
+ l->sort( FALSE );
+}
diff --git a/examples/listbox/listbox.doc b/examples/listbox/listbox.doc
new file mode 100644
index 000000000..eefc2a4d3
--- /dev/null
+++ b/examples/listbox/listbox.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page listbox-example.html
+
+ \ingroup examples
+ \title Listbox Example
+
+ This example shows how to use the different modes (single columns, multiple columns,
+ fixed number of rows, etc.) of QListBox.
+
+ <hr>
+
+ Header file:
+
+ \include listbox/listbox.h
+
+ <hr>
+
+ Implementation:
+
+ \include listbox/listbox.cpp
+
+ <hr>
+
+ Main:
+
+ \include listbox/main.cpp
+*/
+
diff --git a/examples/listbox/listbox.h b/examples/listbox/listbox.h
new file mode 100644
index 000000000..62cd8c82f
--- /dev/null
+++ b/examples/listbox/listbox.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef LISTBOX_H
+#define LISTBOX_H
+
+
+class TQSpinBox;
+class TQListBox;
+class TQButtonGroup;
+
+#include <qwidget.h>
+
+
+class ListBoxDemo: public TQWidget
+{
+ Q_OBJECT
+public:
+ ListBoxDemo();
+ ~ListBoxDemo();
+
+private slots:
+ void setNumRows();
+ void setNumCols();
+ void setRowsByHeight();
+ void setColsByWidth();
+ void setVariableWidth( bool );
+ void setVariableHeight( bool );
+ void setMultiSelection( bool );
+ void sortAscending();
+ void sortDescending();
+
+private:
+ TQListBox * l;
+ TQSpinBox * columns;
+ TQSpinBox * rows;
+ TQButtonGroup * bg;
+};
+
+
+#endif
diff --git a/examples/listbox/listbox.pro b/examples/listbox/listbox.pro
new file mode 100644
index 000000000..b65571a47
--- /dev/null
+++ b/examples/listbox/listbox.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = listbox
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = listbox.h
+SOURCES = listbox.cpp \
+ main.cpp
diff --git a/examples/listbox/main.cpp b/examples/listbox/main.cpp
new file mode 100644
index 000000000..0e3c7ad3b
--- /dev/null
+++ b/examples/listbox/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "listbox.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ ListBoxDemo t;
+ t.setCaption( "TQt Example - Listbox" );
+ a.setMainWidget( &t );
+ t.show();
+
+ return a.exec();
+}
diff --git a/examples/listboxcombo/fileopen.xpm b/examples/listboxcombo/fileopen.xpm
new file mode 100644
index 000000000..880417eee
--- /dev/null
+++ b/examples/listboxcombo/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/examples/listboxcombo/listboxcombo.cpp b/examples/listboxcombo/listboxcombo.cpp
new file mode 100644
index 000000000..ceb06995b
--- /dev/null
+++ b/examples/listboxcombo/listboxcombo.cpp
@@ -0,0 +1,187 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "listboxcombo.h"
+
+#include <qcombobox.h>
+#include <qlistbox.h>
+#include <qhbox.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qpixmap.h>
+#include <qlabel.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qstyle.h>
+
+
+class MyListBoxItem : public TQListBoxItem
+{
+public:
+ MyListBoxItem()
+ : TQListBoxItem()
+ {
+ setCustomHighlighting( TRUE );
+ }
+
+protected:
+ virtual void paint( TQPainter * );
+ virtual int width( const TQListBox* ) const { return 100; }
+ virtual int height( const TQListBox* ) const { return 16; }
+
+};
+
+void MyListBoxItem::paint( TQPainter *painter )
+{
+ // evil trick: find out whether we are painted onto our listbox
+ bool in_list_box = listBox() && listBox()->viewport() == painter->device();
+
+ TQRect r ( 0, 0, width( listBox() ), height( listBox() ) );
+ if ( in_list_box && isSelected() )
+ painter->eraseRect( r );
+ painter->fillRect( 5, 5, width( listBox() ) - 10, height( listBox() ) - 10, TQt::red );
+ if ( in_list_box && isCurrent() )
+ listBox()->style().drawPrimitive( TQStyle::PE_FocusRect, painter, r, listBox()->colorGroup() );
+}
+
+/*
+ * Constructor
+ *
+ * Creates child widgets of the ListBoxCombo widget
+ */
+
+ListBoxCombo::ListBoxCombo( TQWidget *parent, const char *name )
+ : TQVBox( parent, name )
+{
+ setMargin( 5 );
+ setSpacing( 5 );
+
+ unsigned int i;
+ TQString str;
+
+ TQHBox *row1 = new TQHBox( this );
+ row1->setSpacing( 5 );
+
+ // Create a multi-selection ListBox...
+ lb1 = new TQListBox( row1 );
+ lb1->setSelectionMode( TQListBox::Multi );
+
+ // ...insert a pixmap item...
+ lb1->insertItem( TQPixmap( "qtlogo.png" ) );
+ // ...and 100 text items
+ for ( i = 0; i < 100; i++ ) {
+ str = TQString( "Listbox Item %1" ).arg( i );
+ if ( !( i % 4 ) )
+ lb1->insertItem( TQPixmap( "fileopen.xpm" ), str );
+ else
+ lb1->insertItem( str );
+ }
+
+ // Create a pushbutton...
+ TQPushButton *arrow1 = new TQPushButton( " -> ", row1 );
+ // ...and connect the clicked SIGNAL with the SLOT slotLeft2Right
+ connect( arrow1, SIGNAL( clicked() ), this, SLOT( slotLeft2Right() ) );
+
+ // create an empty single-selection ListBox
+ lb2 = new TQListBox( row1 );
+
+ TQHBox *row2 = new TQHBox( this );
+ row2->setSpacing( 5 );
+
+ TQVBox *box1 = new TQVBox( row2 );
+ box1->setSpacing( 5 );
+
+ // Create a non-editable Combobox and a label below...
+ TQComboBox *cb1 = new TQComboBox( FALSE, box1 );
+ label1 = new TQLabel( "Current Item: Combobox Item 0", box1 );
+ label1->setMaximumHeight( label1->sizeHint().height() * 2 );
+ label1->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ //...and insert 50 items into the Combobox
+ for ( i = 0; i < 50; i++ ) {
+ str = TQString( "Combobox Item %1" ).arg( i );
+ if ( i % 9 )
+ cb1->insertItem( str );
+ else
+ cb1->listBox()->insertItem( new MyListBoxItem );
+ }
+
+ TQVBox *box2 = new TQVBox( row2 );
+ box2->setSpacing( 5 );
+
+ // Create an editable Combobox and a label below...
+ TQComboBox *cb2 = new TQComboBox( TRUE, box2 );
+ label2 = new TQLabel( "Current Item: Combobox Item 0", box2 );
+ label2->setMaximumHeight( label2->sizeHint().height() * 2 );
+ label2->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ // ... and insert 50 items into the Combobox
+ for ( i = 0; i < 50; i++ ) {
+ str = TQString( "Combobox Item %1" ).arg( i );
+ if ( !( i % 4 ) )
+ cb2->insertItem( TQPixmap( "fileopen.xpm" ), str );
+ else
+ cb2->insertItem( str );
+ }
+
+ // Connect the activated SIGNALs of the Comboboxes with SLOTs
+ connect( cb1, SIGNAL( activated( const TQString & ) ), this, SLOT( slotCombo1Activated( const TQString & ) ) );
+ connect( cb2, SIGNAL( activated( const TQString & ) ), this, SLOT( slotCombo2Activated( const TQString & ) ) );
+}
+
+/*
+ * SLOT slotLeft2Right
+ *
+ * Copies all selected items of the first ListBox into the
+ * second ListBox
+ */
+
+void ListBoxCombo::slotLeft2Right()
+{
+ // Go through all items of the first ListBox
+ for ( unsigned int i = 0; i < lb1->count(); i++ ) {
+ TQListBoxItem *item = lb1->item( i );
+ // if the item is selected...
+ if ( item->isSelected() ) {
+ // ...and it is a text item...
+ if ( item->pixmap() && !item->text().isEmpty() )
+ lb2->insertItem( *item->pixmap(), item->text() );
+ else if ( !item->pixmap() )
+ lb2->insertItem( item->text() );
+ else if ( item->text().isEmpty() )
+ lb2->insertItem( *item->pixmap() );
+ }
+ }
+}
+
+/*
+ * SLOT slotCombo1Activated( const TQString &s )
+ *
+ * Sets the text of the item which the user just selected
+ * in the first Combobox (and is now the value of s) to
+ * the first Label.
+ */
+
+void ListBoxCombo::slotCombo1Activated( const TQString &s )
+{
+ label1->setText( TQString( "Current Item: %1" ).arg( s ) );
+}
+
+/*
+ * SLOT slotCombo2Activated( const TQString &s )
+ *
+ * Sets the text of the item which the user just selected
+ * in the second Combobox (and is now the value of s) to
+ * the second Label.
+ */
+
+void ListBoxCombo::slotCombo2Activated( const TQString &s )
+{
+ label2->setText( TQString( "Current Item: %1" ).arg( s ) );
+}
diff --git a/examples/listboxcombo/listboxcombo.doc b/examples/listboxcombo/listboxcombo.doc
new file mode 100644
index 000000000..f2d768ad7
--- /dev/null
+++ b/examples/listboxcombo/listboxcombo.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page listboxcombo-example.html
+
+ \ingroup examples
+ \title Listboxes and Comboboxes
+
+ This example program demonstrates how to use listboxes (with single selection
+ and multi selection) and comboboxes (editable and non-editable).
+
+ <hr>
+
+ Header file:
+
+ \include listboxcombo/listboxcombo.h
+
+ <hr>
+
+ Implementation:
+
+ \include listboxcombo/listboxcombo.cpp
+
+ <hr>
+
+ Main:
+
+ \include listboxcombo/main.cpp
+*/
+
diff --git a/examples/listboxcombo/listboxcombo.h b/examples/listboxcombo/listboxcombo.h
new file mode 100644
index 000000000..b614fbd2a
--- /dev/null
+++ b/examples/listboxcombo/listboxcombo.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef LISTBOX_COMBO_H
+#define LISTBOX_COMBO_H
+
+#include <qvbox.h>
+
+class TQListBox;
+class TQLabel;
+
+class ListBoxCombo : public TQVBox
+{
+ Q_OBJECT
+
+public:
+ ListBoxCombo( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ TQListBox *lb1, *lb2;
+ TQLabel *label1, *label2;
+
+protected slots:
+ void slotLeft2Right();
+ void slotCombo1Activated( const TQString &s );
+ void slotCombo2Activated( const TQString &s );
+
+};
+
+#endif
diff --git a/examples/listboxcombo/listboxcombo.pro b/examples/listboxcombo/listboxcombo.pro
new file mode 100644
index 000000000..a75e30864
--- /dev/null
+++ b/examples/listboxcombo/listboxcombo.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = listboxcombo
+
+CONFIG += qt warn_on release
+
+REQUIRES = large-config
+
+HEADERS = listboxcombo.h
+SOURCES = listboxcombo.cpp \
+ main.cpp
diff --git a/examples/listboxcombo/main.cpp b/examples/listboxcombo/main.cpp
new file mode 100644
index 000000000..dcfc0a8b7
--- /dev/null
+++ b/examples/listboxcombo/main.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "listboxcombo.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ ListBoxCombo listboxcombo;
+ listboxcombo.resize( 400, 270 );
+ listboxcombo.setCaption( "TQt Example - Listboxes and Comboboxes" );
+ a.setMainWidget( &listboxcombo );
+ listboxcombo.show();
+
+ return a.exec();
+}
diff --git a/examples/listboxcombo/qtlogo.png b/examples/listboxcombo/qtlogo.png
new file mode 100644
index 000000000..4e1a14726
--- /dev/null
+++ b/examples/listboxcombo/qtlogo.png
Binary files differ
diff --git a/examples/listviews/listviews.cpp b/examples/listviews/listviews.cpp
new file mode 100644
index 000000000..91d4a2bc8
--- /dev/null
+++ b/examples/listviews/listviews.cpp
@@ -0,0 +1,260 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "listviews.h"
+
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qobjectlist.h>
+#include <qpopupmenu.h>
+#include <qheader.h>
+#include <qregexp.h>
+
+// -----------------------------------------------------------------
+
+MessageHeader::MessageHeader( const MessageHeader &mh )
+{
+ msender = mh.msender;
+ msubject = mh.msubject;
+ mdatetime = mh.mdatetime;
+}
+
+MessageHeader &MessageHeader::operator=( const MessageHeader &mh )
+{
+ msender = mh.msender;
+ msubject = mh.msubject;
+ mdatetime = mh.mdatetime;
+
+ return *this;
+}
+
+// -----------------------------------------------------------------
+
+Folder::Folder( Folder *parent, const TQString &name )
+ : TQObject( parent, name ), fName( name )
+{
+ lstMessages.setAutoDelete( TRUE );
+}
+
+// -----------------------------------------------------------------
+
+FolderListItem::FolderListItem( TQListView *parent, Folder *f )
+ : TQListViewItem( parent )
+{
+ myFolder = f;
+ setText( 0, f->folderName() );
+
+ if ( myFolder->children() )
+ insertSubFolders( myFolder->children() );
+}
+
+FolderListItem::FolderListItem( FolderListItem *parent, Folder *f )
+ : TQListViewItem( parent )
+{
+ myFolder = f;
+
+ setText( 0, f->folderName() );
+
+ if ( myFolder->children() )
+ insertSubFolders( myFolder->children() );
+}
+
+void FolderListItem::insertSubFolders( const TQObjectList *lst )
+{
+ Folder *f;
+ for ( f = ( Folder* )( ( TQObjectList* )lst )->first(); f; f = ( Folder* )( ( TQObjectList* )lst )->next() )
+ (void)new FolderListItem( this, f );
+}
+
+// -----------------------------------------------------------------
+
+MessageListItem::MessageListItem( TQListView *parent, Message *m )
+ : TQListViewItem( parent )
+{
+ myMessage = m;
+ setText( 0, myMessage->header().sender() );
+ setText( 1, myMessage->header().subject() );
+ setText( 2, myMessage->header().datetime().toString() );
+}
+
+void MessageListItem::paintCell( TQPainter *p, const TQColorGroup &cg,
+ int column, int width, int alignment )
+{
+ TQColorGroup _cg( cg );
+ TQColor c = _cg.text();
+
+ if ( myMessage->state() == Message::Unread )
+ _cg.setColor( TQColorGroup::Text, TQt::red );
+
+ TQListViewItem::paintCell( p, _cg, column, width, alignment );
+
+ _cg.setColor( TQColorGroup::Text, c );
+}
+
+// -----------------------------------------------------------------
+
+ListViews::ListViews( TQWidget *parent, const char *name )
+ : TQSplitter( TQt::Horizontal, parent, name )
+{
+ lstFolders.setAutoDelete( TRUE );
+
+ folders = new TQListView( this );
+ folders->header()->setClickEnabled( FALSE );
+ folders->addColumn( "Folder" );
+
+ initFolders();
+ setupFolders();
+
+ folders->setRootIsDecorated( TRUE );
+ setResizeMode( folders, TQSplitter::KeepSize );
+
+ TQSplitter *vsplitter = new TQSplitter( TQt::Vertical, this );
+
+ messages = new TQListView( vsplitter );
+ messages->addColumn( "Sender" );
+ messages->addColumn( "Subject" );
+ messages->addColumn( "Date" );
+ messages->setColumnAlignment( 1, TQt::AlignRight );
+ messages->setAllColumnsShowFocus( TRUE );
+ messages->setShowSortIndicator( TRUE );
+ menu = new TQPopupMenu( messages );
+ for( int i = 1; i <= 10; i++ )
+ menu->insertItem( TQString( "Context Item %1" ).arg( i ) );
+ connect(messages, SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint& , int ) ),
+ this, SLOT( slotRMB( TQListViewItem *, const TQPoint &, int ) ) );
+ vsplitter->setResizeMode( messages, TQSplitter::KeepSize );
+
+ message = new TQLabel( vsplitter );
+ message->setAlignment( TQt::AlignTop );
+ message->setBackgroundMode( PaletteBase );
+
+ connect( folders, SIGNAL( selectionChanged( TQListViewItem* ) ),
+ this, SLOT( slotFolderChanged( TQListViewItem* ) ) );
+ connect( messages, SIGNAL( selectionChanged() ),
+ this, SLOT( slotMessageChanged() ) );
+ connect( messages, SIGNAL( currentChanged( TQListViewItem * ) ),
+ this, SLOT( slotMessageChanged() ) );
+
+ messages->setSelectionMode( TQListView::Extended );
+ // some preparations
+ folders->firstChild()->setOpen( TRUE );
+ folders->firstChild()->firstChild()->setOpen( TRUE );
+ folders->setCurrentItem( folders->firstChild()->firstChild()->firstChild() );
+ folders->setSelected( folders->firstChild()->firstChild()->firstChild(), TRUE );
+
+ messages->setSelected( messages->firstChild(), TRUE );
+ messages->setCurrentItem( messages->firstChild() );
+ message->setMargin( 5 );
+
+ TQValueList<int> lst;
+ lst.append( 170 );
+ setSizes( lst );
+}
+
+void ListViews::initFolders()
+{
+ unsigned int mcount = 1;
+
+ for ( unsigned int i = 1; i < 20; i++ ) {
+ TQString str;
+ str = TQString( "Folder %1" ).arg( i );
+ Folder *f = new Folder( 0, str );
+ for ( unsigned int j = 1; j < 5; j++ ) {
+ TQString str2;
+ str2 = TQString( "Sub Folder %1" ).arg( j );
+ Folder *f2 = new Folder( f, str2 );
+ for ( unsigned int k = 1; k < 3; k++ ) {
+ TQString str3;
+ str3 = TQString( "Sub Sub Folder %1" ).arg( k );
+ Folder *f3 = new Folder( f2, str3 );
+ initFolder( f3, mcount );
+ }
+ }
+ lstFolders.append( f );
+ }
+}
+
+void ListViews::initFolder( Folder *folder, unsigned int &count )
+{
+ for ( unsigned int i = 0; i < 15; i++, count++ ) {
+ TQString str;
+ str = TQString( "Message %1 " ).arg( count );
+ TQDateTime dt = TQDateTime::currentDateTime();
+ dt = dt.addSecs( 60 * count );
+ MessageHeader mh( "Trolltech <info@trolltech.com> ", str, dt );
+
+ TQString body;
+ body = TQString( "This is the message number %1 of this application, \n"
+ "which shows how to use TQListViews, TQListViewItems, \n"
+ "TQSplitters and so on. The code should show how easy\n"
+ "this can be done in TQt." ).arg( count );
+ Message *msg = new Message( mh, body );
+ folder->addMessage( msg );
+ }
+}
+
+void ListViews::setupFolders()
+{
+ folders->clear();
+
+ for ( Folder* f = lstFolders.first(); f; f = lstFolders.next() )
+ (void)new FolderListItem( folders, f );
+}
+
+void ListViews::slotRMB( TQListViewItem* Item, const TQPoint & point, int )
+{
+ if( Item )
+ menu->popup( point );
+}
+
+
+void ListViews::slotFolderChanged( TQListViewItem *i )
+{
+ if ( !i )
+ return;
+ messages->clear();
+ message->setText( "" );
+
+ FolderListItem *item = ( FolderListItem* )i;
+
+ for ( Message* msg = item->folder()->firstMessage(); msg;
+ msg = item->folder()->nextMessage() )
+ (void)new MessageListItem( messages, msg );
+}
+
+void ListViews::slotMessageChanged()
+{
+ TQListViewItem *i = messages->currentItem();
+ if ( !i )
+ return;
+
+ if ( !i->isSelected() ) {
+ message->setText( "" );
+ return;
+ }
+
+ MessageListItem *item = ( MessageListItem* )i;
+ Message *msg = item->message();
+
+ TQString text;
+ TQString tmp = msg->header().sender();
+ tmp = tmp.replace( "<", "&lt;" );
+ tmp = tmp.replace( ">", "&gt;" );
+ text = TQString( "<b><i>From:</i></b> <a href=\"mailto:info@trolltech.com\">%1</a><br>"
+ "<b><i>Subject:</i></b> <big><big><b>%2</b></big></big><br>"
+ "<b><i>Date:</i></b> %3<br><br>"
+ "%4" ).
+ arg( tmp ).arg( msg->header().subject() ).
+ arg( msg->header().datetime().toString() ).arg( msg->body() );
+
+ message->setText( text );
+
+ msg->setState( Message::Read );
+}
diff --git a/examples/listviews/listviews.doc b/examples/listviews/listviews.doc
new file mode 100644
index 000000000..6e31f78ab
--- /dev/null
+++ b/examples/listviews/listviews.doc
@@ -0,0 +1,30 @@
+/*
+*/
+/*! \page listviews-example.html
+
+ \ingroup examples
+ \title Listviews
+
+ This examples shows how to work with listviews (hierarchical and multi-column).
+ It also shows how to subclass listview items for special reasons. It looks
+ and works like the main window of a mail client.
+
+ <hr>
+
+ Header file:
+
+ \include listviews/listviews.h
+
+ <hr>
+
+ Implementation:
+
+ \include listviews/listviews.cpp
+
+ <hr>
+
+ Main:
+
+ \include listviews/main.cpp
+*/
+
diff --git a/examples/listviews/listviews.h b/examples/listviews/listviews.h
new file mode 100644
index 000000000..bcc5e30d9
--- /dev/null
+++ b/examples/listviews/listviews.h
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef LISTVIEWS_H
+#define LISTVIEWS_H
+
+#include <qsplitter.h>
+#include <qstring.h>
+#include <qobject.h>
+#include <qdatetime.h>
+#include <qptrlist.h>
+#include <qlistview.h>
+
+class TQListView;
+class TQLabel;
+class TQPainter;
+class TQColorGroup;
+class TQObjectList;
+class TQPopupMenu;
+
+// -----------------------------------------------------------------
+
+class MessageHeader
+{
+public:
+ MessageHeader( const TQString &_sender, const TQString &_subject, const TQDateTime &_datetime )
+ : msender( _sender ), msubject( _subject ), mdatetime( _datetime )
+ {}
+
+ MessageHeader( const MessageHeader &mh );
+ MessageHeader &operator=( const MessageHeader &mh );
+
+ TQString sender() { return msender; }
+ TQString subject() { return msubject; }
+ TQDateTime datetime() { return mdatetime; }
+
+protected:
+ TQString msender, msubject;
+ TQDateTime mdatetime;
+
+};
+
+// -----------------------------------------------------------------
+
+class Message
+{
+public:
+ enum State { Read = 0,
+ Unread};
+
+ Message( const MessageHeader &mh, const TQString &_body )
+ : mheader( mh ), mbody( _body ), mstate( Unread )
+ {}
+
+ Message( const Message &m )
+ : mheader( m.mheader ), mbody( m.mbody ), mstate( m.mstate )
+ {}
+
+ MessageHeader header() { return mheader; }
+ TQString body() { return mbody; }
+
+ void setState( const State &s ) { mstate = s; }
+ State state() { return mstate; }
+
+protected:
+ MessageHeader mheader;
+ TQString mbody;
+ State mstate;
+
+};
+
+// -----------------------------------------------------------------
+
+class Folder : public TQObject
+{
+ Q_OBJECT
+
+public:
+ Folder( Folder *parent, const TQString &name );
+ ~Folder()
+ {}
+
+ void addMessage( Message *m )
+ { lstMessages.append( m ); }
+
+ TQString folderName() { return fName; }
+
+ Message *firstMessage() { return lstMessages.first(); }
+ Message *nextMessage() { return lstMessages.next(); }
+
+protected:
+ TQString fName;
+ TQPtrList<Message> lstMessages;
+
+};
+
+// -----------------------------------------------------------------
+
+class FolderListItem : public TQListViewItem
+{
+public:
+ FolderListItem( TQListView *parent, Folder *f );
+ FolderListItem( FolderListItem *parent, Folder *f );
+
+ void insertSubFolders( const TQObjectList *lst );
+
+ Folder *folder() { return myFolder; }
+
+protected:
+ Folder *myFolder;
+
+};
+
+// -----------------------------------------------------------------
+
+class MessageListItem : public TQListViewItem
+{
+public:
+ MessageListItem( TQListView *parent, Message *m );
+
+ virtual void paintCell( TQPainter *p, const TQColorGroup &cg,
+ int column, int width, int alignment );
+
+ Message *message() { return myMessage; }
+
+protected:
+ Message *myMessage;
+
+};
+
+// -----------------------------------------------------------------
+
+class ListViews : public TQSplitter
+{
+ Q_OBJECT
+
+public:
+ ListViews( TQWidget *parent = 0, const char *name = 0 );
+ ~ListViews()
+ {}
+
+protected:
+ void initFolders();
+ void initFolder( Folder *folder, unsigned int &count );
+ void setupFolders();
+
+ TQListView *messages, *folders;
+ TQLabel *message;
+ TQPopupMenu* menu;
+
+ TQPtrList<Folder> lstFolders;
+
+protected slots:
+ void slotFolderChanged( TQListViewItem* );
+ void slotMessageChanged();
+ void slotRMB( TQListViewItem*, const TQPoint &, int );
+
+};
+
+#endif
diff --git a/examples/listviews/listviews.pro b/examples/listviews/listviews.pro
new file mode 100644
index 000000000..20abc71ec
--- /dev/null
+++ b/examples/listviews/listviews.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = listviews
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = listviews.h
+SOURCES = listviews.cpp \
+ main.cpp
diff --git a/examples/listviews/main.cpp b/examples/listviews/main.cpp
new file mode 100644
index 000000000..bba039239
--- /dev/null
+++ b/examples/listviews/main.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "listviews.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ ListViews listViews;
+ listViews.resize( 640, 480 );
+ listViews.setCaption( "TQt Example - Listview" );
+ a.setMainWidget( &listViews );
+ listViews.show();
+
+ return a.exec();
+}
diff --git a/examples/mdi/application.cpp b/examples/mdi/application.cpp
new file mode 100644
index 000000000..c66c1e6e9
--- /dev/null
+++ b/examples/mdi/application.cpp
@@ -0,0 +1,435 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "application.h"
+#include <qworkspace.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qmovie.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qlabel.h>
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qprinter.h>
+#include <qapplication.h>
+#include <qpushbutton.h>
+#include <qaccel.h>
+#include <qtextstream.h>
+#include <qtextedit.h>
+#include <qpainter.h>
+#include <qpaintdevicemetrics.h>
+#include <qwhatsthis.h>
+#include <qobjectlist.h>
+#include <qvbox.h>
+#include <qsimplerichtext.h>
+
+#include "filesave.xpm"
+#include "fileopen.xpm"
+#include "fileprint.xpm"
+
+
+const char * fileOpenText = "Click this button to open a <em>new file</em>. <br><br>"
+"You can also select the <b>Open command</b> from the File menu.";
+const char * fileSaveText = "Click this button to save the file you are "
+"editing. You will be prompted for a file name.\n\n"
+"You can also select the Save command from the File menu.\n\n"
+"Note that implementing this function is left as an exercise for the reader.";
+const char * filePrintText = "Click this button to print the file you "
+"are editing.\n\n"
+"You can also select the Print command from the File menu.";
+
+ApplicationWindow::ApplicationWindow()
+ : TQMainWindow( 0, "example application main window", WDestructiveClose )
+{
+ int id;
+
+ TQPixmap openIcon, saveIcon;
+
+ fileTools = new TQToolBar( this, "file operations" );
+ addToolBar( fileTools, tr( "File Operations" ), DockTop, TRUE );
+
+ openIcon = TQPixmap( fileopen );
+ TQToolButton * fileOpen
+ = new TQToolButton( openIcon, "Open File", TQString::null,
+ this, SLOT(load()), fileTools, "open file" );
+
+ saveIcon = TQPixmap( filesave );
+ TQToolButton * fileSave
+ = new TQToolButton( saveIcon, "Save File", TQString::null,
+ this, SLOT(save()), fileTools, "save file" );
+
+#ifndef QT_NO_PRINTER
+ printer = new TQPrinter( TQPrinter::HighResolution );
+ TQPixmap printIcon;
+
+ printIcon = TQPixmap( fileprint );
+ TQToolButton * filePrint
+ = new TQToolButton( printIcon, "Print File", TQString::null,
+ this, SLOT(print()), fileTools, "print file" );
+ TQWhatsThis::add( filePrint, filePrintText );
+#endif
+
+ (void)TQWhatsThis::whatsThisButton( fileTools );
+
+ TQWhatsThis::add( fileOpen, fileOpenText );
+ TQWhatsThis::add( fileSave, fileSaveText );
+
+ TQPopupMenu * file = new TQPopupMenu( this );
+ menuBar()->insertItem( "&File", file );
+
+ file->insertItem( "&New", this, SLOT(newDoc()), CTRL+Key_N );
+
+ id = file->insertItem( openIcon, "&Open...",
+ this, SLOT(load()), CTRL+Key_O );
+ file->setWhatsThis( id, fileOpenText );
+
+ id = file->insertItem( saveIcon, "&Save",
+ this, SLOT(save()), CTRL+Key_S );
+ file->setWhatsThis( id, fileSaveText );
+ id = file->insertItem( "Save &As...", this, SLOT(saveAs()) );
+ file->setWhatsThis( id, fileSaveText );
+#ifndef QT_NO_PRINTER
+ file->insertSeparator();
+ id = file->insertItem( printIcon, "&Print...",
+ this, SLOT(print()), CTRL+Key_P );
+ file->setWhatsThis( id, filePrintText );
+#endif
+ file->insertSeparator();
+ file->insertItem( "&Close", this, SLOT(closeWindow()), CTRL+Key_W );
+ file->insertItem( "&Quit", qApp, SLOT( closeAllWindows() ), CTRL+Key_Q );
+
+ windowsMenu = new TQPopupMenu( this );
+ windowsMenu->setCheckable( TRUE );
+ connect( windowsMenu, SIGNAL( aboutToShow() ),
+ this, SLOT( windowsMenuAboutToShow() ) );
+ menuBar()->insertItem( "&Windows", windowsMenu );
+
+ menuBar()->insertSeparator();
+ TQPopupMenu * help = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Help", help );
+
+ help->insertItem( "&About", this, SLOT(about()), Key_F1);
+ help->insertItem( "About &TQt", this, SLOT(aboutTQt()));
+ help->insertSeparator();
+ help->insertItem( "What's &This", this, SLOT(whatsThis()), SHIFT+Key_F1);
+
+ TQVBox* vb = new TQVBox( this );
+ vb->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken );
+ ws = new TQWorkspace( vb );
+ ws->setScrollBarsEnabled( TRUE );
+ setCentralWidget( vb );
+
+ statusBar()->message( "Ready", 2000 );
+}
+
+
+ApplicationWindow::~ApplicationWindow()
+{
+#ifndef QT_NO_PRINTER
+ delete printer;
+#endif
+}
+
+
+
+MDIWindow* ApplicationWindow::newDoc()
+{
+ MDIWindow* w = new MDIWindow( ws, 0, WDestructiveClose );
+ connect( w, SIGNAL( message(const TQString&, int) ), statusBar(), SLOT( message(const TQString&, int )) );
+ w->setCaption("unnamed document");
+ w->setIcon( TQPixmap("document.xpm") );
+ // show the very first window in maximized mode
+ if ( ws->windowList().isEmpty() )
+ w->showMaximized();
+ else
+ w->show();
+ return w;
+}
+
+void ApplicationWindow::load()
+{
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
+ if ( !fn.isEmpty() ) {
+ MDIWindow* w = newDoc();
+ w->load( fn );
+ } else {
+ statusBar()->message( "Loading aborted", 2000 );
+ }
+}
+
+void ApplicationWindow::save()
+{
+ MDIWindow* m = (MDIWindow*)ws->activeWindow();
+ if ( m )
+ m->save();
+}
+
+
+void ApplicationWindow::saveAs()
+{
+ MDIWindow* m = (MDIWindow*)ws->activeWindow();
+ if ( m )
+ m->saveAs();
+}
+
+
+void ApplicationWindow::print()
+{
+#ifndef QT_NO_PRINTER
+ MDIWindow* m = (MDIWindow*)ws->activeWindow();
+ if ( m )
+ m->print( printer );
+#endif
+}
+
+
+void ApplicationWindow::closeWindow()
+{
+ MDIWindow* m = (MDIWindow*)ws->activeWindow();
+ if ( m )
+ m->close();
+}
+
+void ApplicationWindow::about()
+{
+ TQMessageBox::about( this, "TQt Application Example",
+ "This example demonstrates simple use of\n "
+ "TQt's Multiple Document Interface (MDI).");
+}
+
+
+void ApplicationWindow::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQt Application Example" );
+}
+
+
+void ApplicationWindow::windowsMenuAboutToShow()
+{
+ windowsMenu->clear();
+ int cascadeId = windowsMenu->insertItem("&Cascade", ws, SLOT(cascade() ) );
+ int tileId = windowsMenu->insertItem("&Tile", ws, SLOT(tile() ) );
+ int horTileId = windowsMenu->insertItem("Tile &Horizontally", this, SLOT(tileHorizontal() ) );
+ if ( ws->windowList().isEmpty() ) {
+ windowsMenu->setItemEnabled( cascadeId, FALSE );
+ windowsMenu->setItemEnabled( tileId, FALSE );
+ windowsMenu->setItemEnabled( horTileId, FALSE );
+ }
+ windowsMenu->insertSeparator();
+ TQWidgetList windows = ws->windowList();
+ for ( int i = 0; i < int(windows.count()); ++i ) {
+ int id = windowsMenu->insertItem(windows.at(i)->caption(),
+ this, SLOT( windowsMenuActivated( int ) ) );
+ windowsMenu->setItemParameter( id, i );
+ windowsMenu->setItemChecked( id, ws->activeWindow() == windows.at(i) );
+ }
+}
+
+void ApplicationWindow::windowsMenuActivated( int id )
+{
+ TQWidget* w = ws->windowList().at( id );
+ if ( w )
+ w->showNormal();
+ w->setFocus();
+}
+
+void ApplicationWindow::tileHorizontal()
+{
+ // primitive horizontal tiling
+ TQWidgetList windows = ws->windowList();
+ if ( !windows.count() )
+ return;
+
+ if (ws->activeWindow())
+ ws->activeWindow()->showNormal();
+
+ int heightForEach = ws->height() / windows.count();
+ int y = 0;
+ for ( int i = 0; i < int(windows.count()); ++i ) {
+ TQWidget *window = windows.at(i);
+ int preferredHeight = window->minimumHeight()+window->parentWidget()->baseSize().height();
+ int actHeight = TQMAX(heightForEach, preferredHeight);
+
+ window->parentWidget()->setGeometry( 0, y, ws->width(), actHeight );
+ y += actHeight;
+ }
+}
+
+void ApplicationWindow::closeEvent( TQCloseEvent *e )
+{
+ TQWidgetList windows = ws->windowList();
+ if ( windows.count() ) {
+ for ( int i = 0; i < int(windows.count()); ++i ) {
+ TQWidget *window = windows.at( i );
+ if ( !window->close() ) {
+ e->ignore();
+ return;
+ }
+ }
+ }
+
+ TQMainWindow::closeEvent( e );
+}
+
+MDIWindow::MDIWindow( TQWidget* parent, const char* name, int wflags )
+ : TQMainWindow( parent, name, wflags )
+{
+ mmovie = 0;
+ medit = new TQTextEdit( this );
+ setFocusProxy( medit );
+ setCentralWidget( medit );
+}
+
+MDIWindow::~MDIWindow()
+{
+ delete mmovie;
+}
+
+void MDIWindow::closeEvent( TQCloseEvent *e )
+{
+ if ( medit->isModified() ) {
+ switch( TQMessageBox::warning( this, "Save Changes",
+ tr("Save changes to %1?").arg( caption() ),
+ tr("Yes"), tr("No"), tr("Cancel") ) ) {
+ case 0:
+ {
+ save();
+ if ( !filename.isEmpty() )
+ e->accept();
+ else
+ e->ignore();
+ }
+ break;
+ case 1:
+ e->accept();
+ break;
+ default:
+ e->ignore();
+ break;
+ }
+ } else {
+ e->accept();
+ }
+}
+
+void MDIWindow::load( const TQString& fn )
+{
+ filename = fn;
+ TQFile f( filename );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ if(fn.contains(".gif")) {
+ TQWidget * tmp=new TQWidget(this);
+ setFocusProxy(tmp);
+ setCentralWidget(tmp);
+ medit->hide();
+ delete medit;
+ TQMovie * qm=new TQMovie(fn);
+#ifdef Q_WS_QWS // temporary speed-test hack
+ qm->setDisplayWidget(tmp);
+#endif
+ tmp->setBackgroundMode(TQWidget::NoBackground);
+ tmp->show();
+ mmovie=qm;
+ } else {
+ mmovie = 0;
+
+ TQTextStream t(&f);
+ TQString s = t.read();
+ medit->setText( s );
+ f.close();
+
+
+ }
+ setCaption( filename );
+ emit message( TQString("Loaded document %1").arg(filename), 2000 );
+}
+
+void MDIWindow::save()
+{
+ if ( filename.isEmpty() ) {
+ saveAs();
+ return;
+ }
+
+ TQString text = medit->text();
+ TQFile f( filename );
+ if ( !f.open( IO_WriteOnly ) ) {
+ emit message( TQString("Could not write to %1").arg(filename),
+ 2000 );
+ return;
+ }
+
+ TQTextStream t( &f );
+ t << text;
+ f.close();
+
+ setCaption( filename );
+
+ emit message( TQString( "File %1 saved" ).arg( filename ), 2000 );
+}
+
+void MDIWindow::saveAs()
+{
+ TQString fn = TQFileDialog::getSaveFileName( filename, TQString::null, this );
+ if ( !fn.isEmpty() ) {
+ filename = fn;
+ save();
+ } else {
+ emit message( "Saving aborted", 2000 );
+ }
+}
+
+void MDIWindow::print( TQPrinter* printer)
+{
+#ifndef QT_NO_PRINTER
+ int pageNo = 1;
+
+ if ( printer->setup(this) ) { // printer dialog
+ printer->setFullPage( TRUE );
+ emit message( "Printing...", 0 );
+ TQPainter p;
+ if ( !p.begin( printer ) )
+ return; // paint on printer
+ TQPaintDeviceMetrics metrics( p.device() );
+ int dpiy = metrics.logicalDpiY();
+ int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins
+ TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );
+ TQSimpleRichText richText( TQStyleSheet::convertFromPlainText(medit->text()),
+ TQFont(),
+ medit->context(),
+ medit->styleSheet(),
+ medit->mimeSourceFactory(),
+ view.height() );
+ richText.setWidth( &p, view.width() );
+ int page = 1;
+ do {
+ richText.draw( &p, margin, margin, view, colorGroup() );
+ view.moveBy( 0, view.height() );
+ p.translate( 0 , -view.height() );
+ p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) );
+ if ( view.top() - margin >= richText.height() )
+ break;
+ TQString msg( "Printing (page " );
+ msg += TQString::number( ++pageNo );
+ msg += ")...";
+ emit message( msg, 0 );
+ printer->newPage();
+ page++;
+ } while (TRUE);
+ }
+#endif
+}
diff --git a/examples/mdi/application.h b/examples/mdi/application.h
new file mode 100644
index 000000000..d0108df35
--- /dev/null
+++ b/examples/mdi/application.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef APPLICATION_H
+#define APPLICATION_H
+
+#include <qmainwindow.h>
+#include <qptrlist.h>
+
+class TQTextEdit;
+class TQToolBar;
+class TQPopupMenu;
+class TQWorkspace;
+class TQPopupMenu;
+class TQMovie;
+
+class MDIWindow: public TQMainWindow
+{
+ Q_OBJECT
+public:
+ MDIWindow( TQWidget* parent, const char* name, int wflags );
+ ~MDIWindow();
+
+ void load( const TQString& fn );
+ void save();
+ void saveAs();
+ void print( TQPrinter* );
+
+protected:
+ void closeEvent( TQCloseEvent * );
+
+signals:
+ void message(const TQString&, int );
+
+private:
+ TQTextEdit* medit;
+ TQMovie * mmovie;
+ TQString filename;
+};
+
+
+class ApplicationWindow: public TQMainWindow
+{
+ Q_OBJECT
+public:
+ ApplicationWindow();
+ ~ApplicationWindow();
+
+protected:
+ void closeEvent( TQCloseEvent * );
+
+private slots:
+ MDIWindow* newDoc();
+ void load();
+ void save();
+ void saveAs();
+ void print();
+ void closeWindow();
+ void tileHorizontal();
+
+ void about();
+ void aboutTQt();
+
+ void windowsMenuAboutToShow();
+ void windowsMenuActivated( int id );
+
+private:
+ TQPrinter *printer;
+ TQWorkspace* ws;
+ TQToolBar *fileTools;
+ TQPopupMenu* windowsMenu;
+};
+
+
+#endif
diff --git a/examples/mdi/document.xpm b/examples/mdi/document.xpm
new file mode 100644
index 000000000..c08f63e92
--- /dev/null
+++ b/examples/mdi/document.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char * document_xpm[] = {
+"12 16 6 1",
+" c #040404",
+". c None",
+"X c white",
+"o c #808304",
+"O c black",
+"+ c #f3f7f3",
+" .....",
+" XXXXX ....",
+" XXXXX X ...",
+" XXXXX XX ..",
+" XooXX O.",
+" X+XXX+XXXO.",
+" XXXXXXXXXO.",
+" XoooXooXXO.",
+" XXXXXXXXXO.",
+" XXXXXXXXXO.",
+" XoXXoooXXO.",
+" XXXXXXXXXO.",
+"OXXXXXXXXXO.",
+"OXXXXXXXXXO.",
+"OOOOOOOOOOO.",
+"............"};
diff --git a/examples/mdi/fileopen.xpm b/examples/mdi/fileopen.xpm
new file mode 100644
index 000000000..880417eee
--- /dev/null
+++ b/examples/mdi/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/examples/mdi/fileprint.xpm b/examples/mdi/fileprint.xpm
new file mode 100644
index 000000000..6ada912fa
--- /dev/null
+++ b/examples/mdi/fileprint.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+" 16 14 6 1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/examples/mdi/filesave.xpm b/examples/mdi/filesave.xpm
new file mode 100644
index 000000000..bd6870f47
--- /dev/null
+++ b/examples/mdi/filesave.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *filesave[] = {
+" 14 14 4 1",
+". c #040404",
+"# c #808304",
+"a c #bfc2bf",
+"b c None",
+"..............",
+".#.aaaaaaaa.a.",
+".#.aaaaaaaa...",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".#.aaaaaaaa.#.",
+".##........##.",
+".############.",
+".##.........#.",
+".##......aa.#.",
+".##......aa.#.",
+".##......aa.#.",
+"b............."
+};
diff --git a/examples/mdi/main.cpp b/examples/mdi/main.cpp
new file mode 100644
index 000000000..1bda1da23
--- /dev/null
+++ b/examples/mdi/main.cpp
@@ -0,0 +1,22 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "application.h"
+
+int main( int argc, char ** argv ) {
+ TQApplication a( argc, argv );
+ ApplicationWindow * mw = new ApplicationWindow();
+ a.setMainWidget(mw);
+ mw->setCaption( "TQt Example - Multiple Documents Interface (MDI)" );
+ mw->show();
+ a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) );
+ int res = a.exec();
+ return res;
+}
diff --git a/examples/mdi/mdi.doc b/examples/mdi/mdi.doc
new file mode 100644
index 000000000..7f97702a5
--- /dev/null
+++ b/examples/mdi/mdi.doc
@@ -0,0 +1,28 @@
+/*
+*/
+/*! \page mdi-example.html
+
+ \ingroup examples
+ \title An MDI Application
+
+ This example program is just like the application example, except
+ that it provides a Multiple Document Interface (MDI).
+
+ <hr>
+
+ Header file:
+
+ \include mdi/application.h
+
+ <hr>
+
+ Implementation:
+
+ \include mdi/application.cpp
+
+ <hr>
+
+ Main:
+
+ \include mdi/main.cpp
+*/
diff --git a/examples/mdi/mdi.pro b/examples/mdi/mdi.pro
new file mode 100644
index 000000000..e0a081a32
--- /dev/null
+++ b/examples/mdi/mdi.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = mdi
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = workspace full-config
+
+HEADERS = application.h
+SOURCES = application.cpp \
+ main.cpp
diff --git a/examples/menu/menu.cpp b/examples/menu/menu.cpp
new file mode 100644
index 000000000..f71b8152d
--- /dev/null
+++ b/examples/menu/menu.cpp
@@ -0,0 +1,355 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "menu.h"
+#include <qcursor.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include <qpixmap.h>
+#include <qpainter.h>
+
+/* XPM */
+static const char * p1_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000000000",
+"X c #FFFFFFFF0000",
+" ",
+" ",
+" .... ",
+" .XXXX. ",
+" .............. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .XXXXXXXXXXXX. ",
+" .............. ",
+" "};
+
+/* XPM */
+static const char * p2_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000000000",
+"X c #FFFFFFFFFFFF",
+" ",
+" ...... ",
+" .XXX.X. ",
+" .XXX.XX. ",
+" .XXX.XXX. ",
+" .XXX..... ",
+" .XXXXXXX. ",
+" .XXXXXXX. ",
+" .XXXXXXX. ",
+" .XXXXXXX. ",
+" .XXXXXXX. ",
+" .XXXXXXX. ",
+" .XXXXXXX. ",
+" ......... ",
+" ",
+" "};
+
+/* XPM */
+static const char * p3_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000000000",
+"X c #FFFFFFFFFFFF",
+" ",
+" ",
+" ......... ",
+" ........... ",
+" ........ .. ",
+" ........... ",
+" ........... ",
+" ........... ",
+" ........... ",
+" ...XXXXX... ",
+" ...XXXXX... ",
+" ...XXXXX... ",
+" ...XXXXX... ",
+" ......... ",
+" ",
+" "};
+
+
+/*
+ Auxiliary class to provide fancy menu items with different
+ fonts. Used for the "bold" and "underline" menu items in the options
+ menu.
+ */
+class MyMenuItem : public TQCustomMenuItem
+{
+public:
+ MyMenuItem( const TQString& s, const TQFont& f )
+ : string( s ), font( f ){};
+ ~MyMenuItem(){}
+
+ void paint( TQPainter* p, const TQColorGroup& /*cg*/, bool /*act*/, bool /*enabled*/, int x, int y, int w, int h )
+ {
+ p->setFont ( font );
+ p->drawText( x, y, w, h, AlignLeft | AlignVCenter | DontClip | ShowPrefix, string );
+ }
+
+ TQSize sizeHint()
+ {
+ return TQFontMetrics( font ).size( AlignLeft | AlignVCenter | ShowPrefix | DontClip, string );
+ }
+private:
+ TQString string;
+ TQFont font;
+};
+
+
+MenuExample::MenuExample( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ TQPixmap p1( p1_xpm );
+ TQPixmap p2( p2_xpm );
+ TQPixmap p3( p3_xpm );
+ TQPopupMenu *print = new TQPopupMenu( this );
+ Q_CHECK_PTR( print );
+ print->insertTearOffHandle();
+ print->insertItem( "&Print to printer", this, SLOT(printer()) );
+ print->insertItem( "Print to &file", this, SLOT(file()) );
+ print->insertItem( "Print to fa&x", this, SLOT(fax()) );
+ print->insertSeparator();
+ print->insertItem( "Printer &Setup", this, SLOT(printerSetup()) );
+
+ TQPopupMenu *file = new TQPopupMenu( this );
+ Q_CHECK_PTR( file );
+ file->insertItem( p1, "&Open", this, SLOT(open()), CTRL+Key_O );
+ file->insertItem( p2, "&New", this, SLOT(news()), CTRL+Key_N );
+ file->insertItem( p3, "&Save", this, SLOT(save()), CTRL+Key_S );
+ file->insertItem( "&Close", this, SLOT(closeDoc()), CTRL+Key_W );
+ file->insertSeparator();
+ file->insertItem( "&Print", print, CTRL+Key_P );
+ file->insertSeparator();
+ file->insertItem( "E&xit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ TQPopupMenu *edit = new TQPopupMenu( this );
+ Q_CHECK_PTR( edit );
+ int undoID = edit->insertItem( "&Undo", this, SLOT(undo()) );
+ int redoID = edit->insertItem( "&Redo", this, SLOT(redo()) );
+ edit->setItemEnabled( undoID, FALSE );
+ edit->setItemEnabled( redoID, FALSE );
+
+ TQPopupMenu* options = new TQPopupMenu( this );
+ Q_CHECK_PTR( options );
+ options->insertTearOffHandle();
+ options->setCaption("Options");
+ options->insertItem( "&Normal Font", this, SLOT(normal()) );
+ options->insertSeparator();
+
+ options->polish(); // adjust system settings
+ TQFont f = options->font();
+ f.setBold( TRUE );
+ boldID = options->insertItem( new MyMenuItem( "Bold", f ) );
+ options->setAccel( CTRL+Key_B, boldID );
+ options->connectItem( boldID, this, SLOT(bold()) );
+ f = font();
+ f.setUnderline( TRUE );
+ underlineID = options->insertItem( new MyMenuItem( "Underline", f ) );
+ options->setAccel( CTRL+Key_U, underlineID );
+ options->connectItem( underlineID, this, SLOT(underline()) );
+
+ isBold = FALSE;
+ isUnderline = FALSE;
+ options->setCheckable( TRUE );
+
+
+ TQPopupMenu *help = new TQPopupMenu( this );
+ Q_CHECK_PTR( help );
+ help->insertItem( "&About", this, SLOT(about()), CTRL+Key_H );
+ help->insertItem( "About &TQt", this, SLOT(aboutTQt()) );
+
+ // If we used a TQMainWindow we could use its built-in menuBar().
+ menu = new TQMenuBar( this );
+ Q_CHECK_PTR( menu );
+ menu->insertItem( "&File", file );
+ menu->insertItem( "&Edit", edit );
+ menu->insertItem( "&Options", options );
+ menu->insertSeparator();
+ menu->insertItem( "&Help", help );
+ menu->setSeparator( TQMenuBar::InWindowsStyle );
+
+
+ TQLabel *msg = new TQLabel( this );
+ Q_CHECK_PTR( msg );
+ msg->setText( "A context menu is available.\n"
+ "Invoke it by right-clicking or by"
+ " pressing the 'context' button." );
+ msg->setGeometry( 0, height() - 60, width(), 60 );
+ msg->setAlignment( AlignCenter );
+
+ label = new TQLabel( this );
+ Q_CHECK_PTR( label );
+ label->setGeometry( 20, rect().center().y()-20, width()-40, 40 );
+ label->setFrameStyle( TQFrame::Box | TQFrame::Raised );
+ label->setLineWidth( 1 );
+ label->setAlignment( AlignCenter );
+
+ connect( this, SIGNAL(explain(const TQString&)),
+ label, SLOT(setText(const TQString&)) );
+
+ setMinimumSize( 100, 80 );
+ setFocusPolicy( TQWidget::ClickFocus );
+}
+
+
+void MenuExample::contextMenuEvent( TQContextMenuEvent * )
+{
+ TQPopupMenu* contextMenu = new TQPopupMenu( this );
+ Q_CHECK_PTR( contextMenu );
+ TQLabel *caption = new TQLabel( "<font color=darkblue><u><b>"
+ "Context Menu</b></u></font>", this );
+ caption->setAlignment( TQt::AlignCenter );
+ contextMenu->insertItem( caption );
+ contextMenu->insertItem( "&New", this, SLOT(news()), CTRL+Key_N );
+ contextMenu->insertItem( "&Open...", this, SLOT(open()), CTRL+Key_O );
+ contextMenu->insertItem( "&Save", this, SLOT(save()), CTRL+Key_S );
+ TQPopupMenu *submenu = new TQPopupMenu( this );
+ Q_CHECK_PTR( submenu );
+ submenu->insertItem( "&Print to printer", this, SLOT(printer()) );
+ submenu->insertItem( "Print to &file", this, SLOT(file()) );
+ submenu->insertItem( "Print to fa&x", this, SLOT(fax()) );
+ contextMenu->insertItem( "&Print", submenu );
+ contextMenu->exec( TQCursor::pos() );
+ delete contextMenu;
+}
+
+
+void MenuExample::open()
+{
+ emit explain( "File/Open selected" );
+}
+
+
+void MenuExample::news()
+{
+ emit explain( "File/New selected" );
+}
+
+void MenuExample::save()
+{
+ emit explain( "File/Save selected" );
+}
+
+
+void MenuExample::closeDoc()
+{
+ emit explain( "File/Close selected" );
+}
+
+
+void MenuExample::undo()
+{
+ emit explain( "Edit/Undo selected" );
+}
+
+
+void MenuExample::redo()
+{
+ emit explain( "Edit/Redo selected" );
+}
+
+
+void MenuExample::normal()
+{
+ isBold = FALSE;
+ isUnderline = FALSE;
+ TQFont font;
+ label->setFont( font );
+ menu->setItemChecked( boldID, isBold );
+ menu->setItemChecked( underlineID, isUnderline );
+ emit explain( "Options/Normal selected" );
+}
+
+
+void MenuExample::bold()
+{
+ isBold = !isBold;
+ TQFont font;
+ font.setBold( isBold );
+ font.setUnderline( isUnderline );
+ label->setFont( font );
+ menu->setItemChecked( boldID, isBold );
+ emit explain( "Options/Bold selected" );
+}
+
+
+void MenuExample::underline()
+{
+ isUnderline = !isUnderline;
+ TQFont font;
+ font.setBold( isBold );
+ font.setUnderline( isUnderline );
+ label->setFont( font );
+ menu->setItemChecked( underlineID, isUnderline );
+ emit explain( "Options/Underline selected" );
+}
+
+
+void MenuExample::about()
+{
+ TQMessageBox::about( this, "TQt Menu Example",
+ "This example demonstrates simple use of TQt menus.\n"
+ "You can cut and paste lines from it to your own\n"
+ "programs." );
+}
+
+
+void MenuExample::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQt Menu Example" );
+}
+
+
+void MenuExample::printer()
+{
+ emit explain( "File/Printer/Print selected" );
+}
+
+void MenuExample::file()
+{
+ emit explain( "File/Printer/Print To File selected" );
+}
+
+void MenuExample::fax()
+{
+ emit explain( "File/Printer/Print To Fax selected" );
+}
+
+void MenuExample::printerSetup()
+{
+ emit explain( "File/Printer/Printer Setup selected" );
+}
+
+
+void MenuExample::resizeEvent( TQResizeEvent * )
+{
+ label->setGeometry( 20, rect().center().y()-20, width()-40, 40 );
+}
+
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ MenuExample m;
+ m.setCaption("TQt Examples - Menus");
+ a.setMainWidget( &m );
+ m.show();
+ return a.exec();
+}
diff --git a/examples/menu/menu.doc b/examples/menu/menu.doc
new file mode 100644
index 000000000..a7ed69bb4
--- /dev/null
+++ b/examples/menu/menu.doc
@@ -0,0 +1,25 @@
+/*
+*/
+/*! \page menu-example.html
+
+ \ingroup examples
+ \title Using menus
+
+ This example demonstrates a menu bar with pull-down menus,
+ sub-menus and custom menu items. It also demonstrates a pop-up
+ context menu.
+
+
+ <hr>
+
+ Header file:
+
+ \include menu/menu.h
+
+ <hr>
+
+ Implementation:
+
+ \include menu/menu.cpp
+*/
+
diff --git a/examples/menu/menu.h b/examples/menu/menu.h
new file mode 100644
index 000000000..d42acd497
--- /dev/null
+++ b/examples/menu/menu.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef MENU_H
+#define MENU_H
+
+#include <qwidget.h>
+#include <qmenubar.h>
+#include <qlabel.h>
+
+
+class MenuExample : public TQWidget
+{
+ Q_OBJECT
+public:
+ MenuExample( TQWidget *parent=0, const char *name=0 );
+
+public slots:
+ void open();
+ void news();
+ void save();
+ void closeDoc();
+ void undo();
+ void redo();
+ void normal();
+ void bold();
+ void underline();
+ void about();
+ void aboutTQt();
+ void printer();
+ void file();
+ void fax();
+ void printerSetup();
+
+protected:
+ void resizeEvent( TQResizeEvent * );
+
+signals:
+ void explain( const TQString& );
+
+private:
+ void contextMenuEvent ( TQContextMenuEvent * );
+
+
+ TQMenuBar *menu;
+ TQLabel *label;
+ bool isBold;
+ bool isUnderline;
+ int boldID, underlineID;
+};
+
+
+#endif // MENU_H
diff --git a/examples/menu/menu.pro b/examples/menu/menu.pro
new file mode 100644
index 000000000..cc61a24c3
--- /dev/null
+++ b/examples/menu/menu.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = menu
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = menu.h
+SOURCES = menu.cpp
diff --git a/examples/movies/fire.mng b/examples/movies/fire.mng
new file mode 100644
index 000000000..c6695c836
--- /dev/null
+++ b/examples/movies/fire.mng
Binary files differ
diff --git a/examples/movies/main.cpp b/examples/movies/main.cpp
new file mode 100644
index 000000000..5aaea565f
--- /dev/null
+++ b/examples/movies/main.cpp
@@ -0,0 +1,291 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qfiledialog.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qmessagebox.h>
+#include <qmovie.h>
+#include <qvbox.h>
+
+
+class MovieScreen : public TQFrame {
+ Q_OBJECT
+ TQMovie movie;
+ TQString filename;
+ TQSize sh;
+
+public:
+ MovieScreen(const char* fname, TQMovie m, TQWidget* p=0, const char* name=0, WFlags f=0) :
+ TQFrame(p, name, f),
+ sh(100,100)
+ {
+ setCaption(fname);
+ filename = fname;
+ movie = m;
+
+ // Set a frame around the movie.
+ setFrameStyle(TQFrame::WinPanel|TQFrame::Sunken);
+
+ // No background needed, since we draw on the whole widget.
+ movie.setBackgroundColor(backgroundColor());
+ setBackgroundMode(NoBackground);
+
+ // Get the movie to tell use when interesting things happen.
+ movie.connectUpdate(this, SLOT(movieUpdated(const TQRect&)));
+ movie.connectResize(this, SLOT(movieResized(const TQSize&)));
+ movie.connectStatus(this, SLOT(movieStatus(int)));
+
+ setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Expanding));
+ }
+
+ TQSize sizeHint() const
+ {
+ return sh;
+ }
+
+protected:
+
+ // Draw the contents of the TQFrame - the movie and on-screen-display
+ void drawContents(TQPainter* p)
+ {
+ // Get the current movie frame.
+ TQPixmap pm = movie.framePixmap();
+
+ // Get the area we have to draw in.
+ TQRect r = contentsRect();
+
+ if ( !pm.isNull() ) {
+ // Only rescale is we need to - it can take CPU!
+ if ( r.size() != pm.size() ) {
+ TQWMatrix m;
+ m.scale((double)r.width()/pm.width(),
+ (double)r.height()/pm.height());
+ pm = pm.xForm(m);
+ }
+
+ // Draw the [possibly scaled] frame. movieUpdated() below calls
+ // repaint with only the changed area, so clipping will ensure we
+ // only do the minimum amount of rendering.
+ //
+ p->drawPixmap(r.x(), r.y(), pm);
+ }
+
+
+ // The on-screen display
+
+ const char* message = 0;
+
+ if (movie.paused()) {
+ message = "PAUSED";
+ } else if (movie.finished()) {
+ message = "THE END";
+ } else if (movie.steps() > 0) {
+ message = "FF >>";
+ }
+
+ if (message) {
+ // Find a good font size...
+ p->setFont(TQFont("Helvetica", 24));
+
+ TQFontMetrics fm = p->fontMetrics();
+ if ( fm.width(message) > r.width()-10 )
+ p->setFont(TQFont("Helvetica", 18));
+
+ fm = p->fontMetrics();
+ if ( fm.width(message) > r.width()-10 )
+ p->setFont(TQFont("Helvetica", 14));
+
+ fm = p->fontMetrics();
+ if ( fm.width(message) > r.width()-10 )
+ p->setFont(TQFont("Helvetica", 12));
+
+ fm = p->fontMetrics();
+ if ( fm.width(message) > r.width()-10 )
+ p->setFont(TQFont("Helvetica", 10));
+
+ // "Shadow" effect.
+ p->setPen(black);
+ p->drawText(1, 1, width()-1, height()-1, AlignCenter, message);
+ p->setPen(white);
+ p->drawText(0, 0, width()-1, height()-1, AlignCenter, message);
+ }
+ }
+
+public slots:
+ void restart()
+ {
+ movie.restart();
+ repaint();
+ }
+
+ void togglePause()
+ {
+ if ( movie.paused() )
+ movie.unpause();
+ else
+ movie.pause();
+ repaint();
+ }
+
+ void step()
+ {
+ movie.step();
+ repaint();
+ }
+
+ void step10()
+ {
+ movie.step(10);
+ repaint();
+ }
+
+private slots:
+ void movieUpdated(const TQRect& area)
+ {
+ if (!isVisible())
+ show();
+
+ // The given area of the movie has changed.
+
+ TQRect r = contentsRect();
+
+ if ( r.size() != movie.framePixmap().size() ) {
+ // Need to scale - redraw whole frame.
+ repaint( r );
+ } else {
+ // Only redraw the changed area of the frame
+ repaint( area.x()+r.x(), area.y()+r.x(),
+ area.width(), area.height() );
+ }
+ }
+
+ void movieResized(const TQSize& size)
+ {
+ // The movie changed size, probably from its initial zero size.
+
+ int fw = frameWidth();
+ sh = TQSize( size.width() + fw*2, size.height() + fw*2 );
+ updateGeometry();
+ if ( parentWidget() && parentWidget()->isHidden() )
+ parentWidget()->show();
+ }
+
+ void movieStatus(int status)
+ {
+ // The movie has sent us a status message.
+
+ if (status < 0) {
+ TQString msg;
+ msg.sprintf("Could not play movie \"%s\"", (const char*)filename);
+ TQMessageBox::warning(this, "movies", msg);
+ parentWidget()->close();
+ } else if (status == TQMovie::Paused || status == TQMovie::EndOfMovie) {
+ repaint(); // Ensure status text is displayed
+ }
+ }
+};
+
+class MoviePlayer : public TQVBox {
+ MovieScreen* movie;
+public:
+ MoviePlayer(const char* fname, TQMovie m, TQWidget* p=0, const char* name=0, WFlags f=0) :
+ TQVBox(p,name,f)
+ {
+ movie = new MovieScreen(fname, m, this);
+ TQHBox* hb = new TQHBox(this);
+ TQPushButton* btn;
+ btn = new TQPushButton("<<", hb);
+ connect(btn, SIGNAL(clicked()), movie, SLOT(restart()));
+ btn = new TQPushButton("||", hb);
+ connect(btn, SIGNAL(clicked()), movie, SLOT(togglePause()));
+ btn = new TQPushButton(">|", hb);
+ connect(btn, SIGNAL(clicked()), movie, SLOT(step()));
+ btn = new TQPushButton(">>|", hb);
+ connect(btn, SIGNAL(clicked()), movie, SLOT(step10()));
+ }
+};
+
+
+// A TQFileDialog that chooses movies.
+//
+class MovieStarter: public TQFileDialog {
+ Q_OBJECT
+public:
+ MovieStarter(const char *dir);
+
+public slots:
+ void startMovie(const TQString& filename);
+ // TQDialog's method - normally closes the file dialog.
+ // We want it left open, and we want Cancel to tquit everything.
+ void done( int r );
+};
+
+
+MovieStarter::MovieStarter(const char *dir)
+ : TQFileDialog(dir, "*.gif *.mng")
+{
+ //behave as in getOpenFilename
+ setMode( ExistingFile );
+ // When a file is selected, show it as a movie.
+ connect(this, SIGNAL(fileSelected(const TQString&)),
+ this, SLOT(startMovie(const TQString&)));
+}
+
+
+void MovieStarter::startMovie(const TQString& filename)
+{
+ if ( filename ) // Start a new movie - have it delete when closed.
+ (new MoviePlayer( filename, TQMovie(filename), 0, 0,
+ WDestructiveClose))->show();
+}
+
+void MovieStarter::done( int r )
+{
+ if (r != Accepted)
+ qApp->tquit(); // end on Cancel
+ setResult( r );
+
+ // And don't hide.
+}
+
+
+int main(int argc, char **argv)
+{
+ TQApplication a(argc, argv);
+
+ if (argc > 1) {
+ // Commandline mode - show movies given on the command line
+ //
+ bool gui=TRUE;
+ for (int arg=1; arg<argc; arg++) {
+ if ( TQString(argv[arg]) == "-i" )
+ gui = !gui;
+ else if ( gui )
+ (void)new MoviePlayer(argv[arg], TQMovie(argv[arg]), 0, 0,
+ TQt::WDestructiveClose);
+ else
+ (void)new MovieScreen(argv[arg], TQMovie(argv[arg]), 0, 0,
+ TQt::WDestructiveClose);
+ }
+ TQObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit()));
+ } else {
+ // "GUI" mode - open a chooser for movies
+ //
+ MovieStarter* fd = new MovieStarter(".");
+ fd->show();
+ }
+
+ // Go!
+ return a.exec();
+}
+
+#include "main.moc"
diff --git a/examples/movies/movies.doc b/examples/movies/movies.doc
new file mode 100644
index 000000000..d2b6b9bae
--- /dev/null
+++ b/examples/movies/movies.doc
@@ -0,0 +1,19 @@
+/*
+*/
+/*! \page movies-example.html
+
+ \ingroup examples
+ \title Movies or the Story of the Animated GIF file
+
+ The Movies example displays MNG and animated GIF files using the QMovie and
+ QLabel classes.
+
+ The movies will only read an animated GIF if GIF reading was enabled when Qt was built.
+
+ <hr>
+
+ Main:
+
+ \include movies/main.cpp
+*/
+
diff --git a/examples/movies/movies.pro b/examples/movies/movies.pro
new file mode 100644
index 000000000..39c017f5e
--- /dev/null
+++ b/examples/movies/movies.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = movies
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp
diff --git a/examples/movies/trolltech.gif b/examples/movies/trolltech.gif
new file mode 100644
index 000000000..f674369ef
--- /dev/null
+++ b/examples/movies/trolltech.gif
Binary files differ
diff --git a/examples/network/archivesearch/archivedialog.ui b/examples/network/archivesearch/archivedialog.ui
new file mode 100644
index 000000000..3d3e67a90
--- /dev/null
+++ b/examples/network/archivesearch/archivedialog.ui
@@ -0,0 +1,137 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ArchiveDialog</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>ArchiveDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>673</width>
+ <height>561</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>TQt-interest Archive Search Tool</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>myTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Search phrase</string>
+ </property>
+ </widget>
+ <widget class="TQLineEdit">
+ <property name="name">
+ <cstring>myLineEdit</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQSplitter">
+ <property name="name">
+ <cstring>splitter1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="TQListView">
+ <column>
+ <property name="text">
+ <string>Matching documents</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>myListView</cstring>
+ </property>
+ </widget>
+ <widget class="TQTextBrowser">
+ <property name="name">
+ <cstring>myTextBrowser</cstring>
+ </property>
+ </widget>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>mySpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>281</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>myPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in declaration">qhttp.h</include>
+ <include location="global" impldecl="in declaration">qurl.h</include>
+ <include location="global" impldecl="in declaration">qmessagebox.h</include>
+ <include location="global" impldecl="in declaration">qapplication.h</include>
+ <include location="global" impldecl="in declaration">qcursor.h</include>
+ <include location="global" impldecl="in declaration">qregexp.h</include>
+ <include location="local" impldecl="in implementation">archivedialog.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">TQHttp articleSearcher;</variable>
+ <variable access="private">TQHttp articleFetcher;</variable>
+</variables>
+<slots>
+ <slot specifier="non virtual">fetch( TQListViewItem * it )</slot>
+ <slot specifier="non virtual">fetchDone( bool error )</slot>
+ <slot specifier="non virtual">search()</slot>
+ <slot specifier="non virtual">searchDone( bool error )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+</functions>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/archivesearch/archivedialog.ui.h b/examples/network/archivesearch/archivedialog.ui.h
new file mode 100644
index 000000000..e5b70cb10
--- /dev/null
+++ b/examples/network/archivesearch/archivedialog.ui.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** TQt 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 ArchiveDialog::init()
+{
+ connect(&articleSearcher, SIGNAL(done(bool)), this, SLOT(searchDone(bool)));
+ connect(&articleFetcher, SIGNAL(done(bool)), this, SLOT(fetchDone(bool)));
+ connect(myListView, SIGNAL(selectionChanged(TQListViewItem*)), this, SLOT(fetch(TQListViewItem*)));
+ connect(myLineEdit, SIGNAL(returnPressed()), this, SLOT(search()));
+ connect(myListView, SIGNAL(returnPressed(TQListViewItem*)), this, SLOT(fetch(TQListViewItem*)));
+ connect(myPushButton, SIGNAL(clicked()), this, SLOT(close()));
+}
+
+void ArchiveDialog::fetch( TQListViewItem *it )
+{
+ TQUrl u(it->text(1));
+ articleFetcher.setHost(u.host());
+ articleFetcher.get(it->text(1));
+}
+
+void ArchiveDialog::fetchDone( bool error )
+{
+ if (error) {
+ TQMessageBox::critical(this, "Error fetching",
+ "An error occurred when fetching this document: "
+ + articleFetcher.errorString(),
+ TQMessageBox::Ok, TQMessageBox::NoButton);
+ } else {
+ myTextBrowser->setText(articleFetcher.readAll());
+ }
+}
+
+void ArchiveDialog::search()
+{
+ if (articleSearcher.state() == TQHttp::HostLookup
+ || articleSearcher.state() == TQHttp::Connecting
+ || articleSearcher.state() == TQHttp::Sending
+ || articleSearcher.state() == TQHttp::Reading) {
+ articleSearcher.abort();
+ }
+
+ if (myLineEdit->text() == "") {
+ TQMessageBox::critical(this, "Empty query",
+ "Please type a search string.",
+ TQMessageBox::Ok, TQMessageBox::NoButton);
+ } else {
+ TQApplication::setOverrideCursor(TQCursor(TQt::WaitCursor));
+
+ articleSearcher.setHost("lists.trolltech.com");
+
+ TQHttpRequestHeader header("POST", "/qt-interest/search.php");
+ header.setValue("Host", "lists.trolltech.com");
+ header.setContentType("application/x-www-form-urlencoded");
+
+ TQString encodedTopic = myLineEdit->text();
+ TQUrl::encode(encodedTopic);
+ TQString searchString = "qt-interest=on&search=" + encodedTopic;
+
+ articleSearcher.request(header, searchString.utf8());
+ }
+
+}
+
+void ArchiveDialog::searchDone( bool error )
+{
+ if (error) {
+ TQMessageBox::critical(this, "Error searching",
+ "An error occurred when searching: "
+ + articleSearcher.errorString(),
+ TQMessageBox::Ok, TQMessageBox::NoButton);
+ } else {
+ TQString result(articleSearcher.readAll());
+
+ TQRegExp rx("<a href=\"(http://lists\\.trolltech\\.com/qt-interest/.*)\">(.*)</a>");
+ rx.setMinimal(TRUE);
+ int pos = 0;
+ while (pos >= 0) {
+ pos = rx.search(result, pos);
+ if (pos > -1) {
+ pos += rx.matchedLength();
+ new TQListViewItem(myListView, rx.cap(2), rx.cap(1));
+ }
+ }
+ }
+
+ TQApplication::restoreOverrideCursor();
+}
diff --git a/examples/network/archivesearch/archivesearch.doc b/examples/network/archivesearch/archivesearch.doc
new file mode 100644
index 000000000..e4589cceb
--- /dev/null
+++ b/examples/network/archivesearch/archivesearch.doc
@@ -0,0 +1,25 @@
+/*
+*/
+
+/*! \page archivesearch-example.html
+
+ \ingroup network-examples
+
+ \title A qt-interest mail archive search
+
+ This example does a search on the qt-interest mailinglist archives. It uses
+ QHttp to issue the search command and to fetch the results. The GUI parts
+ were done using \link designer-manual.book Qt Designer\endlink.
+
+ <hr>
+
+ The implementation of the HTTP requests (archivedialog.ui.h):
+
+ \include network/archivesearch/archivedialog.ui.h
+
+ <hr>
+
+ Main (main.cpp):
+
+ \include network/archivesearch/main.cpp
+*/
diff --git a/examples/network/archivesearch/archivesearch.pro b/examples/network/archivesearch/archivesearch.pro
new file mode 100644
index 000000000..1423814c3
--- /dev/null
+++ b/examples/network/archivesearch/archivesearch.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config
+
+HEADERS += archivedialog.ui.h
+INTERFACES += archivedialog.ui
+SOURCES += main.cpp
diff --git a/examples/network/archivesearch/main.cpp b/examples/network/archivesearch/main.cpp
new file mode 100644
index 000000000..c08a00031
--- /dev/null
+++ b/examples/network/archivesearch/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "archivedialog.h"
+#include <qapplication.h>
+
+int main(int argc, char **argv)
+{
+ TQApplication a( argc, argv );
+ ArchiveDialog ad;
+ ad.show();
+
+ TQObject::connect( &a, SIGNAL(lastWindowClosed()),
+ &a, SLOT(tquit()) );
+
+ return a.exec();
+}
diff --git a/examples/network/clientserver/client/client.cpp b/examples/network/clientserver/client/client.cpp
new file mode 100644
index 000000000..d76b59a9d
--- /dev/null
+++ b/examples/network/clientserver/client/client.cpp
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qsocket.h>
+#include <qapplication.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qtextview.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qtextstream.h>
+
+
+class Client : public TQVBox
+{
+ Q_OBJECT
+public:
+ Client( const TQString &host, Q_UINT16 port )
+ {
+ // GUI layout
+ infoText = new TQTextView( this );
+ TQHBox *hb = new TQHBox( this );
+ inputText = new TQLineEdit( hb );
+ TQPushButton *send = new TQPushButton( tr("Send") , hb );
+ TQPushButton *close = new TQPushButton( tr("Close connection") , this );
+ TQPushButton *tquit = new TQPushButton( tr("Quit") , this );
+
+ connect( send, SIGNAL(clicked()), SLOT(sendToServer()) );
+ connect( close, SIGNAL(clicked()), SLOT(closeConnection()) );
+ connect( tquit, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+
+ // create the socket and connect various of its signals
+ socket = new TQSocket( this );
+ connect( socket, SIGNAL(connected()),
+ SLOT(socketConnected()) );
+ connect( socket, SIGNAL(connectionClosed()),
+ SLOT(socketConnectionClosed()) );
+ connect( socket, SIGNAL(readyRead()),
+ SLOT(socketReadyRead()) );
+ connect( socket, SIGNAL(error(int)),
+ SLOT(socketError(int)) );
+
+ // connect to the server
+ infoText->append( tr("Trying to connect to the server\n") );
+ socket->connectToHost( host, port );
+ }
+
+ ~Client()
+ {
+ }
+
+private slots:
+ void closeConnection()
+ {
+ socket->close();
+ if ( socket->state() == TQSocket::Closing ) {
+ // We have a delayed close.
+ connect( socket, SIGNAL(delayedCloseFinished()),
+ SLOT(socketClosed()) );
+ } else {
+ // The socket is closed.
+ socketClosed();
+ }
+ }
+
+ void sendToServer()
+ {
+ // write to the server
+ TQTextStream os(socket);
+ os << inputText->text() << "\n";
+ inputText->setText( "" );
+ }
+
+ void socketReadyRead()
+ {
+ // read from the server
+ while ( socket->canReadLine() ) {
+ infoText->append( socket->readLine() );
+ }
+ }
+
+ void socketConnected()
+ {
+ infoText->append( tr("Connected to server\n") );
+ }
+
+ void socketConnectionClosed()
+ {
+ infoText->append( tr("Connection closed by the server\n") );
+ }
+
+ void socketClosed()
+ {
+ infoText->append( tr("Connection closed\n") );
+ }
+
+ void socketError( int e )
+ {
+ infoText->append( tr("Error number %1 occurred\n").arg(e) );
+ }
+
+private:
+ TQSocket *socket;
+ TQTextView *infoText;
+ TQLineEdit *inputText;
+};
+
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ Client client( argc<2 ? "localhost" : argv[1], 4242 );
+ app.setMainWidget( &client );
+ client.show();
+ return app.exec();
+}
+
+#include "client.moc"
diff --git a/examples/network/clientserver/client/client.pro b/examples/network/clientserver/client/client.pro
new file mode 100644
index 000000000..bc3b9e9ad
--- /dev/null
+++ b/examples/network/clientserver/client/client.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+TARGET = client
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config
+
+HEADERS =
+SOURCES = client.cpp
diff --git a/examples/network/clientserver/clientserver.doc b/examples/network/clientserver/clientserver.doc
new file mode 100644
index 000000000..67b72a5da
--- /dev/null
+++ b/examples/network/clientserver/clientserver.doc
@@ -0,0 +1,35 @@
+/*
+*/
+
+/*! \page clientserver-example.html
+
+ \ingroup network-examples
+
+ \title A small client-server example
+
+ This example shows how two programs can communicate using sockets.
+
+ Two simple example programs are provided, a client program and a
+ server program. Both use the QSocket class, and the server also uses
+ QServerSocket class.
+
+ The server listens on port number 4242 and accepts incoming connections.
+ It sends back every line it receives from the client, prepended with
+ the line number.
+
+ The client tries to connect to the server on the host specified on the
+ command line or to localhost if no command line arguments are
+ specified. You can send single lines to the server.
+
+ <hr>
+
+ Implementation server (server.cpp):
+
+ \include network/clientserver/server/server.cpp
+
+ <hr>
+
+ Implementation client (client.cpp):
+
+ \include network/clientserver/client/client.cpp
+*/
diff --git a/examples/network/clientserver/server/server.cpp b/examples/network/clientserver/server/server.cpp
new file mode 100644
index 000000000..f80adda84
--- /dev/null
+++ b/examples/network/clientserver/server/server.cpp
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qsocket.h>
+#include <qserversocket.h>
+#include <qapplication.h>
+#include <qvbox.h>
+#include <qtextview.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qtextstream.h>
+
+#include <stdlib.h>
+
+
+/*
+ The ClientSocket class provides a socket that is connected with a client.
+ For every client that connects to the server, the server creates a new
+ instance of this class.
+*/
+class ClientSocket : public TQSocket
+{
+ Q_OBJECT
+public:
+ ClientSocket( int sock, TQObject *parent=0, const char *name=0 ) :
+ TQSocket( parent, name )
+ {
+ line = 0;
+ connect( this, SIGNAL(readyRead()),
+ SLOT(readClient()) );
+ connect( this, SIGNAL(connectionClosed()),
+ SLOT(deleteLater()) );
+ setSocket( sock );
+ }
+
+ ~ClientSocket()
+ {
+ }
+
+signals:
+ void logText( const TQString& );
+
+private slots:
+ void readClient()
+ {
+ TQTextStream ts( this );
+ while ( canReadLine() ) {
+ TQString str = ts.readLine();
+ emit logText( tr("Read: '%1'\n").arg(str) );
+
+ ts << line << ": " << str << endl;
+ emit logText( tr("Wrote: '%1: %2'\n").arg(line).arg(str) );
+
+ line++;
+ }
+ }
+
+private:
+ int line;
+};
+
+
+/*
+ The SimpleServer class handles new connections to the server. For every
+ client that connects, it creates a new ClientSocket -- that instance is now
+ responsible for the communication with that client.
+*/
+class SimpleServer : public TQServerSocket
+{
+ Q_OBJECT
+public:
+ SimpleServer( TQObject* parent=0 ) :
+ TQServerSocket( 4242, 1, parent )
+ {
+ if ( !ok() ) {
+ qWarning("Failed to bind to port 4242");
+ exit(1);
+ }
+ }
+
+ ~SimpleServer()
+ {
+ }
+
+ void newConnection( int socket )
+ {
+ ClientSocket *s = new ClientSocket( socket, this );
+ emit newConnect( s );
+ }
+
+signals:
+ void newConnect( ClientSocket* );
+};
+
+
+/*
+ The ServerInfo class provides a small GUI for the server. It also creates the
+ SimpleServer and as a result the server.
+*/
+class ServerInfo : public TQVBox
+{
+ Q_OBJECT
+public:
+ ServerInfo()
+ {
+ SimpleServer *server = new SimpleServer( this );
+
+ TQString itext = tr(
+ "This is a small server example.\n"
+ "Connect with the client now."
+ );
+ TQLabel *lb = new TQLabel( itext, this );
+ lb->setAlignment( AlignHCenter );
+ infoText = new TQTextView( this );
+ TQPushButton *tquit = new TQPushButton( tr("Quit") , this );
+
+ connect( server, SIGNAL(newConnect(ClientSocket*)),
+ SLOT(newConnect(ClientSocket*)) );
+ connect( tquit, SIGNAL(clicked()), qApp,
+ SLOT(tquit()) );
+ }
+
+ ~ServerInfo()
+ {
+ }
+
+private slots:
+ void newConnect( ClientSocket *s )
+ {
+ infoText->append( tr("New connection\n") );
+ connect( s, SIGNAL(logText(const TQString&)),
+ infoText, SLOT(append(const TQString&)) );
+ connect( s, SIGNAL(connectionClosed()),
+ SLOT(connectionClosed()) );
+ }
+
+ void connectionClosed()
+ {
+ infoText->append( tr("Client closed connection\n") );
+ }
+
+private:
+ TQTextView *infoText;
+};
+
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ ServerInfo info;
+ app.setMainWidget( &info );
+ info.show();
+ return app.exec();
+}
+
+#include "server.moc"
diff --git a/examples/network/clientserver/server/server.pro b/examples/network/clientserver/server/server.pro
new file mode 100644
index 000000000..0a845b5fe
--- /dev/null
+++ b/examples/network/clientserver/server/server.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+TARGET = server
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config
+
+HEADERS =
+SOURCES = server.cpp
diff --git a/examples/network/ftpclient/README b/examples/network/ftpclient/README
new file mode 100644
index 000000000..8b1bd7e5d
--- /dev/null
+++ b/examples/network/ftpclient/README
@@ -0,0 +1,3 @@
+This example is a small ftp client. It shows how to use the QFtp class.
+
+This example needs the network extension.
diff --git a/examples/network/ftpclient/connectdialog.ui b/examples/network/ftpclient/connectdialog.ui
new file mode 100644
index 000000000..ff0a30a63
--- /dev/null
+++ b/examples/network/ftpclient/connectdialog.ui
@@ -0,0 +1,244 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ConnectDialog</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>ConnectDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>384</width>
+ <height>165</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Choose host to connect to</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQFrame">
+ <property name="name">
+ <cstring>Frame3</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remote Host:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>host</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Username:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>username</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Password:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>password</cstring>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>password</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ </widget>
+ <widget class="TQLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>username</cstring>
+ </property>
+ <property name="text">
+ <string>anonymous</string>
+ </property>
+ </widget>
+ <widget class="TQLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLineEdit">
+ <property name="name">
+ <cstring>host</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>P&amp;ort:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>port</cstring>
+ </property>
+ </widget>
+ <widget class="TQSpinBox">
+ <property name="name">
+ <cstring>port</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="value">
+ <number>21</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQLayoutWidget">
+ <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>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>ConnectDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>host</tabstop>
+ <tabstop>port</tabstop>
+ <tabstop>username</tabstop>
+ <tabstop>password</tabstop>
+ <tabstop>buttonOk</tabstop>
+ <tabstop>buttonCancel</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/ftpclient/ftpclient.doc b/examples/network/ftpclient/ftpclient.doc
new file mode 100644
index 000000000..13be19168
--- /dev/null
+++ b/examples/network/ftpclient/ftpclient.doc
@@ -0,0 +1,24 @@
+/*
+*/
+
+/*! \page ftpclient-example.html
+
+ \ingroup network-examples
+
+ \title An FTP client
+
+ This example implements a FTP client. It uses QFtp to perform its FTP
+ commands. The GUI parts are done in the Designer.
+
+ <hr>
+
+ The implementation of the FTP commands (ftpmainwindow.ui.h):
+
+ \include network/ftpclient/ftpmainwindow.ui.h
+
+ <hr>
+
+ Main (main.cpp):
+
+ \include network/ftpclient/main.cpp
+*/
diff --git a/examples/network/ftpclient/ftpclient.pro b/examples/network/ftpclient/ftpclient.pro
new file mode 100644
index 000000000..eb71f134f
--- /dev/null
+++ b/examples/network/ftpclient/ftpclient.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = ftpclient
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config nocrosscompiler
+
+HEADERS = ftpviewitem.h
+SOURCES = main.cpp \
+ ftpviewitem.cpp
+FORMS = ftpmainwindow.ui \
+ connectdialog.ui
+IMAGES = images/file.png \
+ images/folder.png
diff --git a/examples/network/ftpclient/ftpmainwindow.ui b/examples/network/ftpclient/ftpmainwindow.ui
new file mode 100644
index 000000000..338aa139b
--- /dev/null
+++ b/examples/network/ftpclient/ftpmainwindow.ui
@@ -0,0 +1,280 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>FtpMainWindow</class>
+<widget class="TQMainWindow">
+ <property name="name">
+ <cstring>FtpMainWindow</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Ftp client example</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQListView" row="1" column="0" rowspan="1" colspan="2">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Last Modified</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>remoteView</cstring>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>remotePath</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <property name="duplicatesEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remote Path:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>remotePath</cstring>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>menubar</cstring>
+ </property>
+ <item text="&amp;File" name="fileMenu">
+ <action name="fileConnectAction"/>
+ <action name="fileDownloadAction"/>
+ <action name="fileUploadAction"/>
+ <action name="fileRemoveAction"/>
+ <separator/>
+ <action name="fileExitAction"/>
+ </item>
+</menubar>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>toolBar</cstring>
+ </property>
+ <property name="label">
+ <string>Tools</string>
+ </property>
+ <action name="fileConnectAction"/>
+ <action name="fileDownloadAction"/>
+ <action name="fileUploadAction"/>
+ <action name="fileRemoveAction"/>
+ </toolbar>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>fileDownloadAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="text">
+ <string>Download...</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileExitAction</cstring>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="menuText">
+ <string>E&amp;xit</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileRemoveAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image1</iconset>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileUploadAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image2</iconset>
+ </property>
+ <property name="text">
+ <string>Upload...</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileConnectAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image3</iconset>
+ </property>
+ <property name="text">
+ <string>Connect...</string>
+ </property>
+ </action>
+</actions>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="2477">789c95944953e3301046eff9152e74a3a61ac79bec9a9a03fbbeef4ccdc1926d92400224619d9aff3eeaafc719b640f02387477f96a5b6e49969ef6467d39b9e690c86f9b06d3ddbcafbde7471dbed3efefcf5e377632a083cf797265e30f5ad31b53bf4acb775d52b594839513e2ef86ced710a9faf3d95fa8e7814c621fc066e7c2379056ffa0cea47f066e06b83fa101e30a8afc1331d86325e0c370c7c573cd4b1c5fd863df019d41378c4c0f7e186819f8f1cf7530eaf18789f3df4433f8d313eea61938177e1b8e0182fd40ceedf80e74191c8789138833c8d5ce6b3557b22be5d7b26ebd770cbc0176a97feab01bc60e0d7f08a417ee491f4678e9ddb13a33fcac271a17e0ad78e0ceec35306f9367b1c30a81f8c5ce6b72e9e04f27cd582270cea4db8d6718c7e29ecb73865e05770c3209fc12d030fd993c821e3219f6807fa4b67f08c81a33f3ad56926ebc77c74c9c05378c5c003f634303a95f59dc04387f4a782733be47d3f8d5ccec761edb9e457e0b943d6730caff2dcc8fc57d9315d99ff235c3b24ff00b70e995f092fb332c77ea465f6dc77c8f37af0cc21fd5a849bdc5899ef12dc3a64bc7b78e1102fe0a5431cfbc3440cbc3b729c0fba835b07f61fe13c9a8a81ef8997612a7ec96e7d067e010f18bc7fa9470cead86f78fd721ed17f5b31a8dfb2171103c7f7a4c81c72de3af08a411d5e860c7c13aead95f5a99e380347bf4b6e38f693c27cf1b990f9e27b5165bef6258ffe55b8e4e33a39e3f3a46a26c9534e862c15545245e713e45bd4a60e5dd02575a94757742dcf199bbfa13e0d6848b77447f7f4408ff4c4778ccdcfd21ccdd3022dd2122dd38afbad7e925fa375daa0cd09f35bb44d3bb44b7b13e6f7e9800ee9888e913f71e9d30fd7abe88c7c6a52e03a1a5244f1cb7ebe7d3b9490a69432f72fa572655ee6955585a354953a7ffe14d552ede76ff855bea32ed4a5ea7ebe7ffee57bea4a5dab9bd729d51f937733a28e1a7c21cfd8d7a949f2aa5fa7fea7c7e7395df3c17adf1dffdd3cdf51f366d66ff393f2e5fc9fef8dbfa8437f7d</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="721">789ca590c10ac2300c86ef7b8ab2de866c3a0f1ec447503c0ae2214d237a5041e741c477b749376d3bf5e29f16fae7234d4855a8d572ae8a2abb34d0ec51e10eceaab0d7c3e1b6deccee595ed7ca9d891ae5832c2f15aac5e948fcd6eead8722b6c4d68c39d85ab196832db2b5c4c116d81275b586ed56245d3eea3fa25bc504004a6d44a8e31a87003d318c20f8ad43961140d4c733eb5a31080909b28802428224cc5d9d10d79d1100f5894101a64f240fd023922757863169f3c6503cc12befc748f6e6b72363f467f3a274076f2524d47752fe268f69f604fb43a540</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="2461">789cd594496fdb301046effe1542780b8a89ac8d128a1eb22fcdbe27450f1425c58e633b5eb216fdefe57c1319718bd6ceb17af1e1851fa5e190d2d2a27779b8e72d2e354663336e5bcfb6ccd05b2c1ebadd976fdfbffc682c0481e7fed2d80b163e35168ec69ef5f6fbbd92859413e5e3822fd71ea7f0d5da53193f148fc238645703f6a6cf60fc1cde0c7c9d637c040f188cefc0331d86984f313c67e047e2a18e2de6e7ec81cf603c81470cfc049e33f0d6c4319f647ec5c087eca11ffa698cfb1b78938177e1b8e03770cd60fe2edc044522f78bc419e469e252cf7eed89f841ed99ac5fc32d035fab5dfaada4de8281dfc32b06f941ed91f467859ddb13a33fcac27161fc0aae1d19dc87a70cf26df63860307e3a71a9efab7812c8f315fa1d270cc69b70ade318fd52385f71cac0fbf09c413e835b061eb2279143ee87f526da81fed2353c63e0385f3ad56926eb47fdba64e029bc62e0017b1ae43a95f55dc24387f407fb8d76c87ebf4e5cde87b3da8de4b7e0c621ebb98057c6e452ff363bca95fa5fe0da21f967b875487d15bccc4a83f3489becc677c8f3d03f9339a45febf0dce456eadd805b87dcef095e38c44b78e9102fd8f38881f7268ef7831ee1d681f347384f79c5c08fc5cb3015c7fb637d067e070f18ecbf78c460fc168e038071acdf560cc61fd88b88818fe19943de37cc2f2a06e31df63264e07b706dadac4ff5c41938fa5172c3719e14e6e37321e703df872af3b52f79f4abc2251fd3f9f97b9e54cdac3c19f7cbc9524125557443ad5979479b6ea94377d4a51ef5e99e06f29ce93c9235431ad1981ee8919ee8995ee89567bccf731d9359cbb442abb446ebb4419bb4e57edbd3f93afd56ff32edd057daa5bdd979d83e1dd0211dd1f19cf9133aa5333aa70be42f5dfaea5ffd777dbf269f9a14b88e8614513cddcf3f778712d29452e6fea59451f9745e5955384a55a99bf74f512dd57ebfc3bfe56f5547dda9eeecf3f396efa9beba5783b9f3ae22eaa8e107f28cfd0ff32337a366343b3f2f1fcefffcdcf80560e77be9</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="2878">789c8d95476fe4381085effe150dd7cd58d44854c6600fce394ff0cc620f2425b5533bb4dba1bdd8ff3eac57526381757bac671bf8c0c7122b88feb434383bda1f2c7d5a7898d8c9851ff8733b1e2cd58fa3d1f4afbffffc6761d19841f889e3786016ff58583c9e0cfce0e0f6a611600a40111e611af56c4aacaff45ceafab372e2335ddf574e932c01df835de4749d74bf8b6d5181c7c2e12c69a1fe536513150eeb4fe032c9330f46bcb88aab22833f063b11f84039293aff2ab83565a9f14b611389b07e39630b7e04db2c4d359f23b013818733d6f8ebe0dad4899ec7825b11d65f84932828c6fab8e752fd053816c18ffc1323c27a35639c9f182c4f0a46be499a651def823311f8109c8b106f076c4d9de37c1c298bc0d98c35dfbd9e2b7dff96729176f537602f02aff6acf3c177e0366953ad37e6233522b00327411aef1b38844f311ffc1d5c8ae05f06573649753ed09fd48ac027c2592c02a31f991121def18cf5bcdbcab949b45f0f1d575a0f42fe28a7e6bf0196a700e37bc97211e29d818ba25be71c5c8ac029d88bb01ff5c99acc74f5d5f3b4595beafe9fc2791aa4f16fc145909e0ffdccad088cfcf25604f63d179a3ff22bcaa2acb41f9be02a48eb710e6e44e004dc8ac03f844be38a52e37d052741983f6ec1d22e3dffeb8cb57f6b3d57fabe939eadeec7794a1ba4f3f705dc5aeb903f217e150569bd6ec02648f7633eab3c48e7790a9604755eaec06590f274c67a1e7caf950fd2fa0d7bb63acf0db8a91aabdf33e6c14641fa7e9cc75641dadf1a2c4f8d75e46f9d755eeb83fbc3fa20ad2fee535b0729ebfe264819fd74a9083c9ab17eef389fcb83743ed14f272fd47ae23e753e48cf83efcfb522f0a1729394cad7c23e1281513f6f44e00b30061aef9b8043f619e687743f0a08567f2d02633e7cebdb5aef03cc771d05697cdcc7752a02237e5d05697f717f3789088cfbaf29bcefea83fba20d4f55ea3fbb8f6bbe9fa9d747fc6cd9b1e79a1b6e79f801ff395ff0255ff1358ff8866ff94edf33d77fcf637ee0093ff2133ff30b4ff95576ccf52f07adf02aaff13a6ff066f8dd9aef879b789b7778f7f7fecebdc7fb7cc087bff377ee233ee6133ee52ff07f0dee6f6fe70bbfea3b9ff18f50d19f1c713caf9e5d97c46f38e19433ceb9e0f22d3f57c4c165f44cb2373cf6bf1deefd61c591a79a9ad0a1ce3d7f7e78482d0de99c1d5da89b2ee7fbb90a1578a12b5ea76b44275ea1d1fb7ebaa29bf0f796eee89ec6f4f061ff841ee9899edff3d30b4d3bff2b2dd30aadd21aadbf976fa8cd066d22fe166dd30eedbeed9ed587688ff6c9f1331d840e257d77e6f9b1e3908ed8d0319dccabfdfffb4ba7f39d9dffdfcf0bbf00b514c1b3</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>fileExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>fileDownloadAction</sender>
+ <signal>activated()</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>downloadFile()</slot>
+ </connection>
+ <connection>
+ <sender>fileRemoveAction</sender>
+ <signal>activated()</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>removeFile()</slot>
+ </connection>
+ <connection>
+ <sender>fileUploadAction</sender>
+ <signal>activated()</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>uploadFile()</slot>
+ </connection>
+ <connection>
+ <sender>fileConnectAction</sender>
+ <signal>activated()</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>connectToHost()</slot>
+ </connection>
+ <connection>
+ <sender>remotePath</sender>
+ <signal>activated(const TQString&amp;)</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>changePath(const TQString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>remoteView</sender>
+ <signal>doubleClicked(TQListViewItem*)</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>changePathOrDownload(TQListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>remoteView</sender>
+ <signal>returnPressed(TQListViewItem*)</signal>
+ <receiver>FtpMainWindow</receiver>
+ <slot>changePathOrDownload(TQListViewItem*)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">ftpmainwindow.ui.h</include>
+</includes>
+<forwards>
+ <forward>class TQFtp;</forward>
+ <forward>class TQUrlInfo;</forward>
+</forwards>
+<variables>
+ <variable access="private">TQFtp *ftp</variable>
+ <variable access="private">TQLabel *stateFtp</variable>
+ <variable access="private">TQString currentFtpDir</variable>
+</variables>
+<slots>
+ <slot access="public">connectToHost()</slot>
+ <slot access="private">uploadFile()</slot>
+ <slot access="private">downloadFile()</slot>
+ <slot access="private">removeFile()</slot>
+ <slot access="private">changePath( const TQString &amp; newPath )</slot>
+ <slot access="private">ftp_commandStarted()</slot>
+ <slot access="private">ftp_commandFinished()</slot>
+ <slot access="private">ftp_done( bool error )</slot>
+ <slot access="private">ftp_stateChanged( int state )</slot>
+ <slot access="private">ftp_listInfo( const TQUrlInfo &amp; i )</slot>
+ <slot access="private">ftp_rawCommandReply( int code, const TQString &amp; text )</slot>
+ <slot access="private">changePathOrDownload( TQListViewItem * )</slot>
+</slots>
+<functions>
+ <function access="private">init()</function>
+ <function access="private">destroy()</function>
+</functions>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/ftpclient/ftpmainwindow.ui.h b/examples/network/ftpclient/ftpmainwindow.ui.h
new file mode 100644
index 000000000..1c272ffbe
--- /dev/null
+++ b/examples/network/ftpclient/ftpmainwindow.ui.h
@@ -0,0 +1,273 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** The init() function is used in place of a constructor.
+** The destroy() function is used in place of a destructor.
+** The slots uploadFile(), downloadFile(), removeFile() and connectToHost() are
+** connected with the resp. actions of the GUI.
+**
+*****************************************************************************/
+
+#include <qftp.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qstatusbar.h>
+#include <qmessagebox.h>
+#include <qfiledialog.h>
+#include <qprogressdialog.h>
+#include <qapplication.h>
+
+#include "connectdialog.h"
+#include "ftpviewitem.h"
+
+void FtpMainWindow::init()
+{
+ stateFtp = new TQLabel( tr("Unconnected"), statusBar() );
+ statusBar()->addWidget( stateFtp, 0, TRUE );
+
+ ftp = new TQFtp( this );
+ connect( ftp, SIGNAL(commandStarted(int)),
+ SLOT(ftp_commandStarted()) );
+ connect( ftp, SIGNAL(commandFinished(int,bool)),
+ SLOT(ftp_commandFinished()) );
+ connect( ftp, SIGNAL(done(bool)),
+ SLOT(ftp_done(bool)) );
+ connect( ftp, SIGNAL(stateChanged(int)),
+ SLOT(ftp_stateChanged(int)) );
+ connect( ftp, SIGNAL(listInfo(const TQUrlInfo &)),
+ SLOT(ftp_listInfo(const TQUrlInfo &)) );
+ connect( ftp, SIGNAL(rawCommandReply(int, const TQString &)),
+ SLOT(ftp_rawCommandReply(int, const TQString &)) );
+}
+
+void FtpMainWindow::destroy()
+{
+ if ( ftp->state() != TQFtp::Unconnected )
+ ftp->close();
+}
+
+void FtpMainWindow::uploadFile()
+{
+ TQString fileName = TQFileDialog::getOpenFileName(
+ TQString::null,
+ TQString::null,
+ this,
+ "upload file dialog",
+ tr("Choose a file to upload") );
+ if ( fileName.isNull() )
+ return;
+
+ TQFile *file = new TQFile( fileName );
+ if ( !file->open( IO_ReadOnly ) ) {
+ TQMessageBox::critical( this, tr("Upload error"),
+ tr("Can't open file '%1' for reading.").arg(fileName) );
+ delete file;
+ return;
+ }
+
+ TQProgressDialog progress(
+ tr("Uploading file..."),
+ tr("Cancel"),
+ 0,
+ this,
+ "upload progress dialog",
+ TRUE );
+ connect( ftp, SIGNAL(dataTransferProgress(int,int)),
+ &progress, SLOT(setProgress(int,int)) );
+ connect( ftp, SIGNAL(commandFinished(int,bool)),
+ &progress, SLOT(reset()) );
+ connect( &progress, SIGNAL(cancelled()),
+ ftp, SLOT(abort()) );
+
+ TQFileInfo fi( fileName );
+ ftp->put( file, fi.fileName() );
+ progress.exec(); // ### takes a lot of time!!!
+
+ ftp->list();
+}
+
+void FtpMainWindow::downloadFile()
+{
+ FtpViewItem *item = (FtpViewItem*)remoteView->selectedItem();
+ if ( !item || item->isDir() )
+ return;
+
+ TQString fileName = TQFileDialog::getSaveFileName(
+ item->text(0),
+ TQString::null,
+ this,
+ "download file dialog",
+ tr("Save downloaded file as") );
+ if ( fileName.isNull() )
+ return;
+
+ // create file on the heap because it has to be valid throughout the whole
+ // asynchronous download operation
+ TQFile *file = new TQFile( fileName );
+ if ( !file->open( IO_WriteOnly ) ) {
+ TQMessageBox::critical( this, tr("Download error"),
+ tr("Can't open file '%1' for writing.").arg(fileName) );
+ delete file;
+ return;
+ }
+
+ TQProgressDialog progress(
+ tr("Downloading file..."),
+ tr("Cancel"),
+ 0,
+ this,
+ "download progress dialog",
+ TRUE );
+ connect( ftp, SIGNAL(dataTransferProgress(int,int)),
+ &progress, SLOT(setProgress(int,int)) );
+ connect( ftp, SIGNAL(commandFinished(int,bool)),
+ &progress, SLOT(reset()) );
+ connect( &progress, SIGNAL(cancelled()),
+ ftp, SLOT(abort()) );
+
+ ftp->get( item->text(0), file );
+ progress.exec(); // ### takes a lot of time!!!
+}
+
+void FtpMainWindow::removeFile()
+{
+ FtpViewItem *item = (FtpViewItem*)remoteView->selectedItem();
+ if ( !item || item->isDir() )
+ return;
+
+ ftp->remove( item->text(0) );
+ ftp->list();
+}
+
+void FtpMainWindow::connectToHost()
+{
+ ConnectDialog connectDialog;
+ if ( connectDialog.exec() == TQDialog::Rejected )
+ return;
+
+ remotePath->clear();
+ remoteView->clear();
+
+ if ( ftp->state() != TQFtp::Unconnected )
+ ftp->close();
+
+ ftp->connectToHost( connectDialog.host->text(), connectDialog.port->value() );
+ ftp->login( connectDialog.username->text(), connectDialog.password->text() );
+ ftp->rawCommand( "PWD" );
+ ftp->list();
+}
+
+// This slot is connected to the TQComboBox::activated() signal of the
+// remotePath.
+void FtpMainWindow::changePath( const TQString &newPath )
+{
+ ftp->cd( newPath );
+ ftp->rawCommand( "PWD" );
+ ftp->list();
+}
+
+// This slot is connected to the TQListView::doubleClicked() and
+// TQListView::returnPressed() signals of the remoteView.
+void FtpMainWindow::changePathOrDownload( TQListViewItem *item )
+{
+ if ( ((FtpViewItem*)item)->isDir() )
+ changePath( item->text(0) );
+ else
+ downloadFile();
+}
+
+/****************************************************************************
+**
+** Slots connected to signals of the TQFtp class
+**
+*****************************************************************************/
+
+void FtpMainWindow::ftp_commandStarted()
+{
+ TQApplication::setOverrideCursor( TQCursor(TQt::WaitCursor) );
+ if ( ftp->currentCommand() == TQFtp::List ) {
+ remoteView->clear();
+ if ( currentFtpDir != "/" )
+ new FtpViewItem( remoteView, FtpViewItem::Directory, "..", "", "" );
+ }
+}
+
+void FtpMainWindow::ftp_commandFinished()
+{
+ TQApplication::restoreOverrideCursor();
+ delete ftp->currentDevice();
+}
+
+void FtpMainWindow::ftp_done( bool error )
+{
+ if ( error ) {
+ TQMessageBox::critical( this, tr("FTP Error"), ftp->errorString() );
+
+ // If we are connected, but not logged in, it is not meaningful to stay
+ // connected to the server since the error is a really fatal one (login
+ // failed).
+ if ( ftp->state() == TQFtp::Connected )
+ ftp->close();
+ }
+}
+
+void FtpMainWindow::ftp_stateChanged( int state )
+{
+ switch ( (TQFtp::State)state ) {
+ case TQFtp::Unconnected:
+ stateFtp->setText( tr("Unconnected") );
+ break;
+ case TQFtp::HostLookup:
+ stateFtp->setText( tr("Host lookup") );
+ break;
+ case TQFtp::Connecting:
+ stateFtp->setText( tr("Connecting") );
+ break;
+ case TQFtp::Connected:
+ stateFtp->setText( tr("Connected") );
+ break;
+ case TQFtp::LoggedIn:
+ stateFtp->setText( tr("Logged in") );
+ break;
+ case TQFtp::Closing:
+ stateFtp->setText( tr("Closing") );
+ break;
+ }
+}
+
+void FtpMainWindow::ftp_listInfo( const TQUrlInfo &i )
+{
+ FtpViewItem::Type type;
+ if ( i.isDir() )
+ type = FtpViewItem::Directory;
+ else
+ type = FtpViewItem::File;
+
+ new FtpViewItem( remoteView, type,
+ i.name(), TQString::number(i.size()), i.lastModified().toString() );
+}
+
+void FtpMainWindow::ftp_rawCommandReply( int code, const TQString &text )
+{
+ if ( code == 257 ) {
+ currentFtpDir = text.section( '"', 1, 1 );
+
+ for ( int i = 0; i<remotePath->count(); i++ ) {
+ // make sure that we don't insert duplicates
+ if ( remotePath->text( i ) == currentFtpDir )
+ remotePath->removeItem( i );
+ }
+ remotePath->insertItem( currentFtpDir, 0 );
+ remotePath->setCurrentItem( 0 );
+ }
+}
diff --git a/examples/network/ftpclient/ftpviewitem.cpp b/examples/network/ftpclient/ftpviewitem.cpp
new file mode 100644
index 000000000..0763c1b0d
--- /dev/null
+++ b/examples/network/ftpclient/ftpviewitem.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qpixmap.h>
+
+#include "ftpviewitem.h"
+
+
+FtpViewItem::FtpViewItem( TQListView *parent, Type t, const TQString &name, const TQString &size, const TQString &lastModified )
+ : TQListViewItem(parent,name,size,lastModified), type(t)
+{
+ // the pixmaps for folders and files are in an image collection
+ if ( type == Directory )
+ setPixmap( 0, TQPixmap::fromMimeSource( "folder.png" ) );
+ else
+ setPixmap( 0, TQPixmap::fromMimeSource( "file.png" ) );
+}
+
+int FtpViewItem::compare( TQListViewItem * i, int col, bool ascending ) const
+{
+ // The entry ".." is always the first one.
+ if ( text(0) == ".." ) {
+ if ( ascending )
+ return -1;
+ else
+ return 1;
+ }
+ if ( i->text(0) == ".." ) {
+ if ( ascending )
+ return 1;
+ else
+ return -1;
+ }
+
+ // Directories are before files.
+ if ( type != ((FtpViewItem*)i)->type ) {
+ if ( type == Directory ) {
+ if ( ascending )
+ return -1;
+ else
+ return 1;
+ } else {
+ if ( ascending )
+ return 1;
+ else
+ return -1;
+ }
+ }
+
+ // Use default sorting otherwise.
+ return TQListViewItem::compare( i, col, ascending );
+}
diff --git a/examples/network/ftpclient/ftpviewitem.h b/examples/network/ftpclient/ftpviewitem.h
new file mode 100644
index 000000000..3387f030a
--- /dev/null
+++ b/examples/network/ftpclient/ftpviewitem.h
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef FTPVIEWITEM_H
+#define FTPVIEWITEM_H
+
+#include <qlistview.h>
+#include <qdatetime.h>
+
+class FtpViewItem : public TQListViewItem
+{
+public:
+ enum Type {
+ Directory,
+ File
+ };
+
+ FtpViewItem( TQListView *parent, Type t, const TQString &name, const TQString &size, const TQString &lastModified );
+
+ int compare( TQListViewItem * i, int col, bool ascending ) const;
+
+ bool isDir()
+ { return type==Directory; }
+
+private:
+ Type type;
+};
+
+#endif
diff --git a/examples/network/ftpclient/images/file.png b/examples/network/ftpclient/images/file.png
new file mode 100644
index 000000000..f042c917b
--- /dev/null
+++ b/examples/network/ftpclient/images/file.png
Binary files differ
diff --git a/examples/network/ftpclient/images/folder.png b/examples/network/ftpclient/images/folder.png
new file mode 100644
index 000000000..5fd0a4335
--- /dev/null
+++ b/examples/network/ftpclient/images/folder.png
Binary files differ
diff --git a/examples/network/ftpclient/main.cpp b/examples/network/ftpclient/main.cpp
new file mode 100644
index 000000000..df636dcb9
--- /dev/null
+++ b/examples/network/ftpclient/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "ftpmainwindow.h"
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ FtpMainWindow m;
+ a.setMainWidget( &m );
+ m.show();
+ a.processEvents();
+ m.connectToHost();
+ return a.exec();
+}
diff --git a/examples/network/httpd/README b/examples/network/httpd/README
new file mode 100644
index 000000000..dc7229d4a
--- /dev/null
+++ b/examples/network/httpd/README
@@ -0,0 +1,7 @@
+This is an example for the QServerSocket class which is included in the
+network module.
+
+It is a simple http daemon. After starting it you can connect to port
+8080 with a web browser and an html page is shown. The program does
+not really parse the http request; so it is not of much use except for
+being a small example for QServerSocket.
diff --git a/examples/network/httpd/httpd.cpp b/examples/network/httpd/httpd.cpp
new file mode 100644
index 000000000..fd42891bb
--- /dev/null
+++ b/examples/network/httpd/httpd.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+#include <stdlib.h>
+#include <qsocket.h>
+#include <qregexp.h>
+#include <qserversocket.h>
+#include <qapplication.h>
+#include <qmainwindow.h>
+#include <qtextstream.h>
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qtextview.h>
+#include <qpushbutton.h>
+
+// HttpDaemon is the the class that implements the simple HTTP server.
+class HttpDaemon : public TQServerSocket
+{
+ Q_OBJECT
+public:
+ HttpDaemon( TQObject* parent=0 ) :
+ TQServerSocket(8080,1,parent)
+ {
+ if ( !ok() ) {
+ qWarning("Failed to bind to port 8080");
+ exit( 1 );
+ }
+ }
+
+ void newConnection( int socket )
+ {
+ // When a new client connects, the server constructs a TQSocket and all
+ // communication with the client is done over this TQSocket. TQSocket
+ // works asynchronouslyl, this means that all the communication is done
+ // in the two slots readClient() and discardClient().
+ TQSocket* s = new TQSocket( this );
+ connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) );
+ connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
+ s->setSocket( socket );
+ emit newConnect();
+ }
+
+signals:
+ void newConnect();
+ void endConnect();
+ void wroteToClient();
+
+private slots:
+ void readClient()
+ {
+ // This slot is called when the client sent data to the server. The
+ // server looks if it was a get request and sends a very simple HTML
+ // document back.
+ TQSocket* socket = (TQSocket*)sender();
+ if ( socket->canReadLine() ) {
+ TQStringList tokens = TQStringList::split( TQRegExp("[ \r\n][ \r\n]*"), socket->readLine() );
+ if ( tokens[0] == "GET" ) {
+ TQTextStream os( socket );
+ os.setEncoding( TQTextStream::UnicodeUTF8 );
+ os << "HTTP/1.0 200 Ok\r\n"
+ "Content-Type: text/html; charset=\"utf-8\"\r\n"
+ "\r\n"
+ "<h1>Nothing to see here</h1>\n";
+ socket->close();
+ emit wroteToClient();
+ }
+ }
+ }
+ void discardClient()
+ {
+ TQSocket* socket = (TQSocket*)sender();
+ delete socket;
+ emit endConnect();
+ }
+};
+
+
+// HttpInfo provides a simple graphical user interface to the server and shows
+// the actions of the server.
+class HttpInfo : public TQVBox
+{
+ Q_OBJECT
+public:
+ HttpInfo()
+ {
+ HttpDaemon *httpd = new HttpDaemon( this );
+
+ TQString itext = TQString(
+ "This is a small httpd example.\n"
+ "You can connect with your\n"
+ "web browser to port %1"
+ ).arg( httpd->port() );
+ TQLabel *lb = new TQLabel( itext, this );
+ lb->setAlignment( AlignHCenter );
+ infoText = new TQTextView( this );
+ TQPushButton *tquit = new TQPushButton( "tquit" , this );
+
+ connect( httpd, SIGNAL(newConnect()), SLOT(newConnect()) );
+ connect( httpd, SIGNAL(endConnect()), SLOT(endConnect()) );
+ connect( httpd, SIGNAL(wroteToClient()), SLOT(wroteToClient()) );
+ connect( tquit, SIGNAL(pressed()), qApp, SLOT(tquit()) );
+ }
+
+ ~HttpInfo()
+ {
+ }
+
+private slots:
+ void newConnect()
+ {
+ infoText->append( "New connection" );
+ }
+ void endConnect()
+ {
+ infoText->append( "Connection closed\n\n" );
+ }
+ void wroteToClient()
+ {
+ infoText->append( "Wrote to client" );
+ }
+
+private:
+ TQTextView *infoText;
+};
+
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ HttpInfo info;
+ app.setMainWidget( &info );
+ info.show();
+ return app.exec();
+}
+
+#include "httpd.moc"
diff --git a/examples/network/httpd/httpd.doc b/examples/network/httpd/httpd.doc
new file mode 100644
index 000000000..de1e0be9f
--- /dev/null
+++ b/examples/network/httpd/httpd.doc
@@ -0,0 +1,20 @@
+/*
+*/
+
+/*! \page httpd-example.html
+
+ \ingroup network-examples
+
+ \title A simple HTTP daemon
+
+ This example shows how to use the QServerSocket class. It is a very
+ simple implementation of a HTTP daemon that listens on port 8080 and
+ sends back a simple HTML page back for every GET request it gets. After
+ sending the page, it closes the connection.
+
+ <hr>
+
+ Implementation (httpd.cpp):
+
+ \include network/httpd/httpd.cpp
+*/
diff --git a/examples/network/httpd/httpd.pro b/examples/network/httpd/httpd.pro
new file mode 100644
index 000000000..a364499ff
--- /dev/null
+++ b/examples/network/httpd/httpd.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+TARGET = httpd
+
+CONFIG += qt warn_on release
+
+REQUIRES = network large-config
+
+HEADERS =
+SOURCES = httpd.cpp
diff --git a/examples/network/infoprotocol/infoclient/client.cpp b/examples/network/infoprotocol/infoclient/client.cpp
new file mode 100644
index 000000000..24861ab55
--- /dev/null
+++ b/examples/network/infoprotocol/infoclient/client.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qsocket.h>
+#include <qapplication.h>
+#include <qtextedit.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qtextstream.h>
+#include <qlistbox.h>
+
+#include "client.h"
+
+
+ClientInfo::ClientInfo( TQWidget *parent, const char *name ) :
+ ClientInfoBase( parent, name ), socket( 0 )
+{
+ edHost->setText( "localhost" );
+ edPort->setText( TQString::number( (uint)infoPort ) );
+
+ connect( infoList, SIGNAL(selected(const TQString&)), SLOT(selectItem(const TQString&)) );
+ connect( btnConnect, SIGNAL(clicked()), SLOT(connectToServer()) );
+ connect( btnBack, SIGNAL(clicked()), SLOT(stepBack()) );
+ connect( btnQuit, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+}
+
+
+void ClientInfo::connectToServer()
+{
+ delete socket;
+ socket = new TQSocket( this );
+ connect( socket, SIGNAL(connected()), SLOT(socketConnected()) );
+ connect( socket, SIGNAL(connectionClosed()), SLOT(socketConnectionClosed()) );
+ connect( socket, SIGNAL(readyRead()), SLOT(socketReadyRead()) );
+ connect( socket, SIGNAL(error(int)), SLOT(socketError(int)) );
+
+ socket->connectToHost( edHost->text(), edPort->text().toInt() );
+}
+
+void ClientInfo::selectItem( const TQString& item )
+{
+ // item in listBox selected, use LIST or GET depending of the node type.
+ if ( item.endsWith( "/" ) ) {
+ sendToServer( List, infoPath->text() + item );
+ infoPath->setText( infoPath->text() + item );
+ } else
+ sendToServer( Get, infoPath->text() + item );
+}
+
+void ClientInfo::stepBack()
+{
+ // go back (up) in path hierarchy
+ int i = infoPath->text().findRev( '/', -2 );
+ if ( i > 0 )
+ infoPath->setText( infoPath->text().left( i + 1 ) );
+ else
+ infoPath->setText( "/" );
+ infoList->clear();
+ sendToServer( List, infoPath->text() );
+}
+
+
+void ClientInfo::socketConnected()
+{
+ sendToServer( List, "/" );
+}
+
+void ClientInfo::sendToServer( Operation op, const TQString& location )
+{
+ TQString line;
+ switch (op) {
+ case List:
+ infoList->clear();
+ line = "LIST " + location;
+ break;
+ case Get:
+ line = "GET " + location;
+ break;
+ }
+ infoText->clear();
+ TQTextStream os(socket);
+ os << line << "\r\n";
+}
+
+void ClientInfo::socketReadyRead()
+{
+ TQTextStream stream( socket );
+ TQString line;
+ while ( socket->canReadLine() ) {
+ line = stream.readLine();
+ if ( line.startsWith( "500" ) || line.startsWith( "550" ) ) {
+ infoText->append( tr( "error: " ) + line.mid( 4 ) );
+ } else if ( line.startsWith( "212+" ) ) {
+ infoList->insertItem( line.mid( 6 ) + TQString( ( line[ 4 ] == 'D' ) ? "/" : "" ) );
+ } else if ( line.startsWith( "213+" ) ) {
+ infoText->append( line.mid( 4 ) );
+ }
+ }
+}
+
+
+void ClientInfo::socketConnectionClosed()
+{
+ infoText->clear();
+ infoText->append( tr( "error: Connection closed by the server\n" ) );
+}
+
+void ClientInfo::socketError( int code )
+{
+ infoText->clear();
+ infoText->append( tr( "error: Error number %1 occurred\n" ).arg( code ) );
+}
+
diff --git a/examples/network/infoprotocol/infoclient/client.h b/examples/network/infoprotocol/infoclient/client.h
new file mode 100644
index 000000000..50a31bdad
--- /dev/null
+++ b/examples/network/infoprotocol/infoclient/client.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef CLIENT_H
+#define CLIENT_H
+
+#include "clientbase.h"
+
+class TQSocket;
+class TQTextEdit;
+class TQLineEdit;
+class TQListBox;
+class TQLabel;
+
+static const Q_UINT16 infoPort = 42417;
+
+class ClientInfo : public ClientInfoBase
+{
+ Q_OBJECT
+public:
+ ClientInfo( TQWidget *parent = 0, const char *name = 0 );
+
+private:
+ enum Operation { List, Get };
+
+private slots:
+ void connectToServer();
+ void selectItem( const TQString& item );
+ void stepBack();
+ void sendToServer( Operation op, const TQString& location );
+ void socketConnected();
+ void socketReadyRead();
+ void socketConnectionClosed();
+ void socketError( int code );
+
+private:
+ TQSocket *socket;
+};
+
+#endif // CLIENT_H
+
diff --git a/examples/network/infoprotocol/infoclient/clientbase.ui b/examples/network/infoprotocol/infoclient/clientbase.ui
new file mode 100644
index 000000000..6d5ea21d6
--- /dev/null
+++ b/examples/network/infoprotocol/infoclient/clientbase.ui
@@ -0,0 +1,276 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ClientInfoBase</class>
+<widget class="TQWidget">
+ <property name="name">
+ <cstring>ClientInfoBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>384</width>
+ <height>488</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Info Client</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="TQLayoutWidget">
+ <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="TQPushButton">
+ <property name="name">
+ <cstring>btnConnect</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Connect</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Host:</string>
+ </property>
+ </widget>
+ <widget class="TQLineEdit">
+ <property name="name">
+ <cstring>edHost</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="TQLineEdit">
+ <property name="name">
+ <cstring>edPort</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQSplitter">
+ <property name="name">
+ <cstring>Splitter4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout16</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="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout14</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="TQPushButton">
+ <property name="name">
+ <cstring>btnBack</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Back</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>go one step back</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>infoPath</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>/</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>current path</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQListBox">
+ <property name="name">
+ <cstring>infoList</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>double click to open</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Data:</string>
+ </property>
+ </widget>
+ <widget class="TQTextEdit">
+ <property name="name">
+ <cstring>infoText</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout12</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" stdset="0">
+ <cstring>Spacer10</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="TQPushButton">
+ <property name="name">
+ <cstring>btnQuit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer9</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>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/infoprotocol/infoclient/infoclient.pro b/examples/network/infoprotocol/infoclient/infoclient.pro
new file mode 100644
index 000000000..46759dd23
--- /dev/null
+++ b/examples/network/infoprotocol/infoclient/infoclient.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = infoclient
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config nocrosscompiler
+
+HEADERS = client.h
+SOURCES = main.cpp \
+ client.cpp
+INTERFACES = clientbase.ui
diff --git a/examples/network/infoprotocol/infoclient/main.cpp b/examples/network/infoprotocol/infoclient/main.cpp
new file mode 100644
index 000000000..502026958
--- /dev/null
+++ b/examples/network/infoprotocol/infoclient/main.cpp
@@ -0,0 +1,21 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+
+#include "client.h"
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ ClientInfo info;
+ app.setMainWidget( &info );
+ info.show();
+ return app.exec();
+}
diff --git a/examples/network/infoprotocol/infoserver/infodata.cpp b/examples/network/infoprotocol/infoserver/infodata.cpp
new file mode 100644
index 000000000..347c78d31
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/infodata.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "infodata.h"
+
+
+// we hard code all nodes and data in InfoData class
+InfoData::InfoData() :
+ nodes( 17, TRUE ), data( 17, TRUE )
+{
+ nodes.setAutoDelete(TRUE);
+ data.setAutoDelete(TRUE);
+ TQStringList *item;
+
+ nodes.insert( "/", item = new TQStringList( ) );
+ (*item) << "D network";
+ nodes.insert( "/network/", item = new TQStringList() );
+ (*item) << "D workstations" << "D printers" << "D fax";
+ nodes.insert( "/network/workstations/", item = new TQStringList() );
+ (*item) << "D nibble" << "D douglas";
+ nodes.insert( "/network/workstations/nibble/", item = new TQStringList() );
+ (*item) << "F os" << "F cpu" << "F memory";
+ nodes.insert( "/network/workstations/douglas/", item = new TQStringList() );
+ (*item) << "F os" << "F cpu" << "F memory";
+ nodes.insert( "/network/printers/", item = new TQStringList() );
+ (*item) << "D overbitt" << "D kroksleiven";
+ nodes.insert( "/network/printers/overbitt/", item = new TQStringList() );
+ (*item) << "D jobs" << "F type";
+ nodes.insert( "/network/printers/overbitt/jobs/", item = new TQStringList() );
+ (*item) << "F job1" << "F job2";
+ nodes.insert( "/network/printers/kroksleiven/", item = new TQStringList() );
+ (*item) << "D jobs" << "F type";
+ nodes.insert( "/network/printers/kroksleiven/jobs/", item = new TQStringList() );
+ nodes.insert( "/network/fax/", item = new TQStringList() );
+ (*item) << "F last_number";
+
+ data.insert( "/network/workstations/nibble/os", new TQString( "Linux" ) );
+ data.insert( "/network/workstations/nibble/cpu", new TQString( "AMD Athlon 1000" ) );
+ data.insert( "/network/workstations/nibble/memory", new TQString( "256 MB" ) );
+ data.insert( "/network/workstations/douglas/os", new TQString( "Windows 2000" ) );
+ data.insert( "/network/workstations/douglas/cpu", new TQString( "2 x Intel Pentium III 800" ) );
+ data.insert( "/network/workstations/douglas/memory", new TQString( "256 MB" ) );
+ data.insert( "/network/printers/overbitt/type", new TQString( "Lexmark Optra S 1255 PS" ) );
+ data.insert( "/network/printers/overbitt/jobs/job1",
+ new TQString( "TQt manual\n" "A4 size\n" "3000 pages" ) );
+ data.insert( "/network/printers/overbitt/jobs/job2",
+ new TQString( "Monthly report\n" "Letter size\n" "24 pages\n" "8 copies" ) );
+ data.insert( "/network/printers/kroksleiven/type", new TQString( "HP C LaserJet 4500-PS" ) );
+ data.insert( "/network/fax/last_number", new TQString( "22 22 22 22" ) );
+}
+
+TQStringList InfoData::list( TQString path, bool *found ) const
+{
+ if ( !path.endsWith( "/" ) )
+ path += "/";
+ if ( !path.startsWith( "/" ) )
+ path = "/" + path;
+ TQStringList *list = nodes[ path ];
+ if ( list ) {
+ *found = TRUE;
+ return *list;
+ } else {
+ *found = FALSE;
+ TQStringList empty;
+ return empty;
+ }
+}
+
+TQString InfoData::get( TQString path, bool *found ) const
+{
+ if ( !path.startsWith( "/" ) )
+ path = "/" + path;
+ TQString *file = data[ path ];
+ if ( file ) {
+ *found = TRUE;
+ return *file;
+ } else {
+ *found = FALSE;
+ TQString empty;
+ return empty;
+ }
+}
diff --git a/examples/network/infoprotocol/infoserver/infodata.h b/examples/network/infoprotocol/infoserver/infodata.h
new file mode 100644
index 000000000..5a293ceb0
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/infodata.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef INFODATA_H
+#define INFODATA_H
+
+#include <qdict.h>
+#include <qstringlist.h>
+
+
+// The InfoData class manages data, organized in tree structure.
+class InfoData
+{
+public:
+ InfoData();
+ TQStringList list( TQString path, bool *found ) const;
+ TQString get( TQString path, bool *found ) const;
+
+private:
+ TQDict< TQStringList > nodes;
+ TQDict< TQString > data;
+};
+
+#endif // INFODATA_H
+
diff --git a/examples/network/infoprotocol/infoserver/infoserver.pro b/examples/network/infoprotocol/infoserver/infoserver.pro
new file mode 100644
index 000000000..3d79aeff2
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/infoserver.pro
@@ -0,0 +1,13 @@
+TEMPLATE = app
+TARGET = infoserver
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config nocrosscompiler
+
+HEADERS = server.h \
+ infodata.h
+SOURCES = main.cpp \
+ server.cpp \
+ infodata.cpp
+INTERFACES = serverbase.ui
diff --git a/examples/network/infoprotocol/infoserver/main.cpp b/examples/network/infoprotocol/infoserver/main.cpp
new file mode 100644
index 000000000..42c0c7fad
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/main.cpp
@@ -0,0 +1,22 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+
+#include "server.h"
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ Q_UINT16 port = ( argc > 1 ) ? TQString( argv[ 1 ] ).toInt() : infoPort;
+ ServerInfo info( port, 0, "server info" );
+ app.setMainWidget( &info );
+ info.show();
+ return app.exec();
+}
diff --git a/examples/network/infoprotocol/infoserver/server.cpp b/examples/network/infoprotocol/infoserver/server.cpp
new file mode 100644
index 000000000..4e5ef6d17
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/server.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qtextview.h>
+#include <qpushbutton.h>
+#include <qtextstream.h>
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include <stdlib.h>
+
+#include "server.h"
+
+
+
+ServerInfo::ServerInfo( Q_UINT16 port, TQWidget *parent, const char *name ) :
+ ServerInfoBase( parent, name )
+{
+ SimpleServer *server = new SimpleServer( port, this, "simple server" );
+ connect( server, SIGNAL(newConnect()), SLOT(newConnect()) );
+ connect( btnQuit, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+}
+
+void ServerInfo::newConnect()
+{
+ infoText->append( tr( "New connection\n" ) );
+}
+
+
+SimpleServer::SimpleServer( Q_UINT16 port, TQObject* parent, const char *name ) :
+ TQServerSocket( port, 1, parent, name )
+{
+ if ( !ok() ) {
+ TQMessageBox::critical( 0, tr( "Error" ), tr( "Failed to bind to port %1" ).arg( port ) );
+ exit(1);
+ }
+}
+
+void SimpleServer::newConnection( int socket )
+{
+ (void)new ClientSocket( socket, &info, this, "client socket" );
+ emit newConnect();
+}
+
+
+ClientSocket::ClientSocket( int sock, InfoData *i, TQObject *parent, const char *name ) :
+ TQSocket( parent, name ), info( i )
+{
+ connect( this, SIGNAL(readyRead()), SLOT(readClient()) );
+ connect( this, SIGNAL(connectionClosed()), SLOT(connectionClosed()) );
+ setSocket( sock );
+}
+
+void ClientSocket::readClient()
+{
+ TQTextStream stream( this );
+ TQStringList answer;
+ while ( canReadLine() ) {
+ stream << processCommand( stream.readLine() );
+ }
+}
+
+TQString ClientSocket::processCommand( const TQString& command )
+{
+ TQString answer;
+ TQString com = command.simplifyWhiteSpace ();
+ if ( com.startsWith( "LIST" ) ) {
+ bool ok;
+ TQStringList nodes = info->list( com.mid( 5 ), &ok );
+ if ( ok ) {
+ for ( TQStringList::Iterator it = nodes.begin(); it != nodes.end(); ++it )
+ answer += "212+" + *it + "\r\n";
+ answer += "212 \r\n";
+ } else
+ answer += "550 Invalid path\r\n";
+ } else if ( com.startsWith( "GET " ) ) {
+ bool ok;
+ TQStringList data = TQStringList::split( '\n', info->get( com.mid( 4 ), &ok ), TRUE );
+ if ( ok ) {
+ for ( TQStringList::Iterator it = data.begin(); it != data.end(); ++it )
+ answer += "213+" + *it + "\r\n";
+ answer += "213 \r\n";
+ } else
+ answer += "550 Info not found\r\n";
+ } else
+ answer += "500 Syntax error\r\n";
+
+ return answer;
+}
+
+void ClientSocket::connectionClosed()
+{
+ delete this;
+}
diff --git a/examples/network/infoprotocol/infoserver/server.h b/examples/network/infoprotocol/infoserver/server.h
new file mode 100644
index 000000000..d7b9c9ae2
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/server.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SERVER_H
+#define SERVER_H
+
+#include <qsocket.h>
+#include <qserversocket.h>
+
+#include "infodata.h"
+#include "serverbase.h"
+
+static const Q_UINT16 infoPort = 42417;
+
+
+/*
+ The ServerInfo class provides a small GUI for the server. It also creates the
+ SimpleServer and as a result the server.
+*/
+class ServerInfo : public ServerInfoBase
+{
+ Q_OBJECT
+public:
+ ServerInfo( Q_UINT16 port = infoPort, TQWidget *parent = 0, const char *name = 0 );
+
+private slots:
+ void newConnect();
+};
+
+
+class SimpleServer : public TQServerSocket
+{
+ Q_OBJECT
+public:
+ SimpleServer( Q_UINT16 port = infoPort, TQObject* parent = 0, const char *name = 0 );
+ void newConnection( int socket );
+
+signals:
+ void newConnect();
+
+private:
+ InfoData info;
+};
+
+
+class ClientSocket : public TQSocket
+{
+ Q_OBJECT
+public:
+ ClientSocket( int sock, InfoData *i, TQObject *parent = 0, const char *name = 0 );
+
+private slots:
+ void readClient();
+ void connectionClosed();
+
+private:
+ TQString processCommand( const TQString& command );
+ InfoData *info;
+};
+
+
+#endif //SERVER_H
+
diff --git a/examples/network/infoprotocol/infoserver/serverbase.ui b/examples/network/infoprotocol/infoserver/serverbase.ui
new file mode 100644
index 000000000..ddf1bffb2
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/serverbase.ui
@@ -0,0 +1,117 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ServerInfoBase</class>
+<widget class="TQWidget">
+ <property name="name">
+ <cstring>ServerInfoBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>272</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Info Server</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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>This is a small Information Server.
+Accepting client requests...</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="TQTextEdit">
+ <property name="name">
+ <cstring>infoText</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <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>
+ <spacer>
+ <property name="name" stdset="0">
+ <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>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>btnQuit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <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>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/infoprotocol/infourlclient/client.cpp b/examples/network/infoprotocol/infourlclient/client.cpp
new file mode 100644
index 000000000..ba61d3b31
--- /dev/null
+++ b/examples/network/infoprotocol/infourlclient/client.cpp
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qtextedit.h>
+#include <qpushbutton.h>
+#include <qfiledialog.h>
+
+#include "qip.h"
+#include "client.h"
+
+
+
+
+ClientInfo::ClientInfo( TQWidget *parent, const char *name ) :
+ ClientInfoBase( parent, name )
+{
+ connect( btnOpen, SIGNAL(clicked()), SLOT(downloadFile()) );
+ connect( btnQuit, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+ connect( &op, SIGNAL( data( const TQByteArray &, TQNetworkOperation * ) ),
+ this, SLOT( newData( const TQByteArray & ) ) );
+}
+
+void ClientInfo::downloadFile()
+{
+ // under Windows you must not use the native file dialog
+ TQString file = getOpenFileName();
+ if ( !file.isEmpty() ) {
+ infoText->clear();
+ // download the data
+ op = file;
+ op.get();
+ }
+}
+
+TQString ClientInfo::getOpenFileName()
+{
+ static TQString workingDirectory( "qip://localhost/" );
+
+ TQFileDialog dlg( workingDirectory, TQString::null, 0, 0, TRUE );
+ dlg.setCaption( TQFileDialog::tr( "Open" ) );
+ dlg.setMode( TQFileDialog::ExistingFile );
+ TQString result;
+ if ( dlg.exec() == TQDialog::Accepted ) {
+ result = dlg.selectedFile();
+ workingDirectory = dlg.url();
+ }
+ return result;
+}
+
+void ClientInfo::newData( const TQByteArray &ba )
+{
+ infoText->append( TQString::fromUtf8( ba ) );
+}
diff --git a/examples/network/infoprotocol/infourlclient/client.h b/examples/network/infoprotocol/infourlclient/client.h
new file mode 100644
index 000000000..439edbbbb
--- /dev/null
+++ b/examples/network/infoprotocol/infourlclient/client.h
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef CLIENT_H
+#define CLIENT_H
+
+#include <qurloperator.h>
+
+#include "clientbase.h"
+
+
+class ClientInfo : public ClientInfoBase
+{
+ Q_OBJECT
+
+public:
+ ClientInfo( TQWidget *parent = 0, const char *name = 0 );
+
+private slots:
+ void downloadFile();
+ void newData( const TQByteArray &ba );
+
+private:
+ TQUrlOperator op;
+ TQString getOpenFileName();
+};
+
+#endif // CLIENT_H
+
diff --git a/examples/network/infoprotocol/infourlclient/clientbase.ui b/examples/network/infoprotocol/infourlclient/clientbase.ui
new file mode 100644
index 000000000..115b0f3b7
--- /dev/null
+++ b/examples/network/infoprotocol/infourlclient/clientbase.ui
@@ -0,0 +1,118 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ClientInfoBase</class>
+<widget class="TQWidget">
+ <property name="name">
+ <cstring>ClientInfoBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>325</width>
+ <height>279</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Info Client Protocol</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="TQLayoutWidget">
+ <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="TQPushButton">
+ <property name="name">
+ <cstring>btnOpen</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Open</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>open data</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer4</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="TQPushButton">
+ <property name="name">
+ <cstring>btnQuit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Data:</string>
+ </property>
+ </widget>
+ <widget class="TQTextEdit">
+ <property name="name">
+ <cstring>infoText</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/infoprotocol/infourlclient/infourlclient.pro b/examples/network/infoprotocol/infourlclient/infourlclient.pro
new file mode 100644
index 000000000..219083d2f
--- /dev/null
+++ b/examples/network/infoprotocol/infourlclient/infourlclient.pro
@@ -0,0 +1,13 @@
+TEMPLATE = app
+TARGET = infourlclient
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config nocrosscompiler
+
+HEADERS = client.h \
+ qip.h
+SOURCES = main.cpp \
+ client.cpp \
+ qip.cpp
+INTERFACES = clientbase.ui
diff --git a/examples/network/infoprotocol/infourlclient/main.cpp b/examples/network/infoprotocol/infourlclient/main.cpp
new file mode 100644
index 000000000..fbe6aedb0
--- /dev/null
+++ b/examples/network/infoprotocol/infourlclient/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+
+#include "qip.h"
+#include "client.h"
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ TQNetworkProtocol::registerNetworkProtocol( "qip", new TQNetworkProtocolFactory< Qip > );
+ ClientInfo info;
+ app.setMainWidget( &info );
+ info.show();
+ return app.exec();
+}
diff --git a/examples/network/infoprotocol/infourlclient/qip.cpp b/examples/network/infoprotocol/infourlclient/qip.cpp
new file mode 100644
index 000000000..5424370e2
--- /dev/null
+++ b/examples/network/infoprotocol/infourlclient/qip.cpp
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qsocket.h>
+#include <qurlinfo.h>
+#include <qurloperator.h>
+#include <qtextstream.h>
+
+#include "qip.h"
+
+
+Qip::Qip()
+{
+ state = Start;
+ socket = new TQSocket( this );
+ connect( socket, SIGNAL(connected()), SLOT(socketConnected()) );
+ connect( socket, SIGNAL(connectionClosed()), SLOT(socketConnectionClosed()) );
+ connect( socket, SIGNAL(readyRead()), SLOT(socketReadyRead()) );
+ connect( socket, SIGNAL(error(int)), SLOT(socketError(int)) );
+}
+
+int Qip::supportedOperations() const
+{
+ return OpListChildren | OpGet;
+}
+
+bool Qip::checkConnection( TQNetworkOperation * )
+{
+ if ( socket->isOpen() )
+ return TRUE;
+
+ // don't call connectToHost() if we are already trying to connect
+ if ( socket->state() == TQSocket::Connecting )
+ return FALSE;
+
+ socket->connectToHost( url()->host(), url()->port() != -1 ? url()->port() : infoPort );
+ return FALSE;
+}
+
+void Qip::operationListChildren( TQNetworkOperation * )
+{
+ TQTextStream os(socket);
+ os << "LIST " + url()->path() + "\r\n";
+ operationInProgress()->setState( StInProgress );
+}
+
+void Qip::operationGet( TQNetworkOperation * )
+{
+ TQTextStream os(socket);
+ os << "GET " + url()->path() + "\r\n";
+ operationInProgress()->setState( StInProgress );
+}
+
+void Qip::socketConnected()
+{
+ if ( url() )
+ emit connectionStateChanged( ConConnected, tr( "Connected to host %1" ).arg( url()->host() ) );
+ else
+ emit connectionStateChanged( ConConnected, tr ("Connected to host" ) );
+}
+
+void Qip::socketConnectionClosed()
+{
+ if ( url() )
+ emit connectionStateChanged( ConClosed, tr( "Connection to %1 closed" ).arg( url()->host() ) );
+ else
+ emit connectionStateChanged( ConClosed, tr ("Connection closed" ) );
+}
+
+void Qip::socketError( int code )
+{
+ if ( code == TQSocket::ErrHostNotFound ||
+ code == TQSocket::ErrConnectionRefused ) {
+ error( ErrHostNotFound, tr( "Host not found or couldn't connect to: %1\n" ).arg( url()->host() ) );
+ } else
+ error( ErrUnsupported, tr( "Error" ) );
+}
+
+void Qip::socketReadyRead()
+{
+ // read from the server
+ TQTextStream stream( socket );
+ TQString line;
+ while ( socket->canReadLine() ) {
+ line = stream.readLine();
+ if ( line.startsWith( "500" ) ) {
+ error( ErrValid, line.mid( 4 ) );
+ } else if ( line.startsWith( "550" ) ) {
+ error( ErrFileNotExisting, line.mid( 4 ) );
+ } else if ( line.startsWith( "212+" ) ) {
+ if ( state != List ) {
+ state = List;
+ emit start( operationInProgress() );
+ }
+ TQUrlInfo inf;
+ inf.setName( line.mid( 6 ) + TQString( ( line[ 4 ] == 'D' ) ? "/" : "" ) );
+ inf.setDir( line[ 4 ] == 'D' );
+ inf.setSymLink( FALSE );
+ inf.setFile( line[ 4 ] == 'F' );
+ inf.setWritable( FALSE );
+ inf.setReadable( TRUE );
+ emit newChild( inf, operationInProgress() );
+ } else if ( line.startsWith( "213+" ) ) {
+ state = Data;
+ emit data( line.mid( 4 ).utf8(), operationInProgress() );
+ }
+ if( line[3] == ' ' && state != Start) {
+ state = Start;
+ operationInProgress()->setState( StDone );
+ emit finished( operationInProgress() );
+ }
+ }
+}
+
+void Qip::error( int code, const TQString& msg )
+{
+ if ( operationInProgress() ) {
+ operationInProgress()->setState( StFailed );
+ operationInProgress()->setErrorCode( code );
+ operationInProgress()->setProtocolDetail( msg );
+ clearOperationQueue();
+ emit finished( operationInProgress() );
+ }
+ state = Start;
+}
+
diff --git a/examples/network/infoprotocol/infourlclient/qip.h b/examples/network/infoprotocol/infourlclient/qip.h
new file mode 100644
index 000000000..f2b9db98d
--- /dev/null
+++ b/examples/network/infoprotocol/infourlclient/qip.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TQIP_H
+#define TQIP_H
+
+#include <qnetworkprotocol.h>
+
+class TQSocket;
+
+static const Q_UINT16 infoPort = 42417;
+
+
+class Qip : public TQNetworkProtocol
+{
+ Q_OBJECT
+
+public:
+ Qip();
+ virtual int supportedOperations() const;
+
+protected:
+ virtual void operationListChildren( TQNetworkOperation *op );
+ virtual void operationGet( TQNetworkOperation *op );
+ virtual bool checkConnection( TQNetworkOperation *op );
+
+private slots:
+ void socketConnected();
+ void socketReadyRead();
+ void socketConnectionClosed();
+ void socketError( int code );
+
+private:
+ TQSocket *socket;
+ enum State { Start, List, Data } state;
+ void error( int code, const TQString& msg );
+};
+
+
+
+#endif // TQIP_H
+
diff --git a/examples/network/mail/composer.cpp b/examples/network/mail/composer.cpp
new file mode 100644
index 000000000..f5ec2383c
--- /dev/null
+++ b/examples/network/mail/composer.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "composer.h"
+#include "smtp.h"
+
+#include <qlineedit.h>
+#include <qmultilineedit.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+Composer::Composer( TQWidget *parent )
+ : TQWidget( parent )
+{
+ TQGridLayout * layout = new TQGridLayout( this, 1, 1, 6 );
+
+ layout->addWidget( new TQLabel( tr( "From:" ), this ), 0, 0 );
+ from = new TQLineEdit( this );
+ layout->addWidget( from, 0, 1 );
+
+ layout->addWidget( new TQLabel( tr( "To:" ), this ), 1, 0 );
+ to = new TQLineEdit( this );
+ layout->addWidget( to, 1, 1 );
+
+ layout->addWidget( new TQLabel( tr( "Subject:" ), this ), 2, 0 );
+ subject = new TQLineEdit( this );
+ layout->addWidget( subject, 2, 1 );
+
+ message = new TQMultiLineEdit( this );
+ layout->addMultiCellWidget( message, 3, 3, 0, 1 );
+
+ send = new TQPushButton( tr( "&Send" ), this );
+ layout->addWidget( send, 4, 0 );
+ connect( send, SIGNAL( clicked() ), this, SLOT( sendMessage() ) );
+
+ sendStatus = new TQLabel( this );
+ layout->addWidget( sendStatus, 4, 1 );
+}
+
+
+void Composer::sendMessage()
+{
+ send->setEnabled( FALSE );
+ sendStatus->setText( tr( "Looking up mail servers" ) );
+ Smtp *smtp = new Smtp( from->text(), to->text(),
+ subject->text(),
+ message->text() );
+ connect( smtp, SIGNAL(destroyed()),
+ this, SLOT(enableSend()) );
+ connect( smtp, SIGNAL(status(const TQString &)),
+ sendStatus, SLOT(setText(const TQString &)) );
+}
+
+
+void Composer::enableSend()
+{
+ send->setEnabled( TRUE );
+}
diff --git a/examples/network/mail/composer.h b/examples/network/mail/composer.h
new file mode 100644
index 000000000..6ef323139
--- /dev/null
+++ b/examples/network/mail/composer.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef COMPOSER_H
+#define COMPOSER_H
+
+#include <qwidget.h>
+
+
+class TQLineEdit;
+class TQMultiLineEdit;
+class TQLabel;
+class TQPushButton;
+
+
+class Composer : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ Composer( TQWidget *parent = 0 );
+
+private slots:
+ void sendMessage();
+ void enableSend();
+
+private:
+ TQLineEdit *from, *to, *subject;
+ TQMultiLineEdit *message;
+ TQLabel * sendStatus;
+ TQPushButton * send;
+};
+
+
+#endif
diff --git a/examples/network/mail/mail.doc b/examples/network/mail/mail.doc
new file mode 100644
index 000000000..009f15520
--- /dev/null
+++ b/examples/network/mail/mail.doc
@@ -0,0 +1,25 @@
+/*
+*/
+
+/*! \page mail-example.html
+
+ \ingroup network-examples
+
+ \title A simple mail client
+
+ This example shows how to use the QSocket class. The client can only be
+ used to send mails. The interesting part is the implementation of the
+ SMTP protocol.
+
+ <hr>
+
+ Header file (smtp.h):
+
+ \include network/mail/smtp.h
+
+ <hr>
+
+ Implementation (smtp.cpp):
+
+ \include network/mail/smtp.cpp
+*/
diff --git a/examples/network/mail/mail.pro b/examples/network/mail/mail.pro
new file mode 100644
index 000000000..39c9de535
--- /dev/null
+++ b/examples/network/mail/mail.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+TARGET = mail
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config
+
+HEADERS = composer.h \
+ smtp.h
+SOURCES = composer.cpp \
+ main.cpp \
+ smtp.cpp
diff --git a/examples/network/mail/main.cpp b/examples/network/mail/main.cpp
new file mode 100644
index 000000000..c80507699
--- /dev/null
+++ b/examples/network/mail/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+
+#include "composer.h"
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ Composer c;
+ a.setMainWidget( &c );
+ c.resize( 400, 500 );
+ c.show();
+ return a.exec();
+}
diff --git a/examples/network/mail/smtp.cpp b/examples/network/mail/smtp.cpp
new file mode 100644
index 000000000..a0256867b
--- /dev/null
+++ b/examples/network/mail/smtp.cpp
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "smtp.h"
+
+#include <qtextstream.h>
+#include <qsocket.h>
+#include <qdns.h>
+#include <qtimer.h>
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include <qregexp.h>
+
+
+Smtp::Smtp( const TQString &from, const TQString &to,
+ const TQString &subject,
+ const TQString &body )
+{
+ socket = new TQSocket( this );
+ connect ( socket, SIGNAL( readyRead() ),
+ this, SLOT( readyRead() ) );
+ connect ( socket, SIGNAL( connected() ),
+ this, SLOT( connected() ) );
+
+ mxLookup = new TQDns( to.mid( to.find( '@' )+1 ), TQDns::Mx );
+ connect( mxLookup, SIGNAL(resultsReady()),
+ this, SLOT(dnsLookupHelper()) );
+
+ message = TQString::fromLatin1( "From: " ) + from +
+ TQString::fromLatin1( "\nTo: " ) + to +
+ TQString::fromLatin1( "\nSubject: " ) + subject +
+ TQString::fromLatin1( "\n\n" ) + body + "\n";
+ message.replace( TQString::fromLatin1( "\n" ),
+ TQString::fromLatin1( "\r\n" ) );
+ message.replace( TQString::fromLatin1( "\r\n.\r\n" ),
+ TQString::fromLatin1( "\r\n..\r\n" ) );
+
+ this->from = from;
+ rcpt = to;
+
+ state = Init;
+}
+
+
+Smtp::~Smtp()
+{
+ delete t;
+ delete socket;
+}
+
+
+void Smtp::dnsLookupHelper()
+{
+ TQValueList<TQDns::MailServer> s = mxLookup->mailServers();
+ if ( s.isEmpty() ) {
+ if ( !mxLookup->isWorking() )
+ emit status( tr( "Error in MX record lookup" ) );
+ return;
+ }
+
+ emit status( tr( "Connecting to %1" ).arg( s.first().name ) );
+
+ socket->connectToHost( s.first().name, 25 );
+ t = new TQTextStream( socket );
+}
+
+
+void Smtp::connected()
+{
+ emit status( tr( "Connected to %1" ).arg( socket->peerName() ) );
+}
+
+void Smtp::readyRead()
+{
+ // SMTP is line-oriented
+ if ( !socket->canReadLine() )
+ return;
+
+ TQString responseLine;
+ do {
+ responseLine = socket->readLine();
+ response += responseLine;
+ } while( socket->canReadLine() && responseLine[3] != ' ' );
+ responseLine.truncate( 3 );
+
+ if ( state == Init && responseLine[0] == '2' ) {
+ // banner was okay, let's go on
+ *t << "HELO there\r\n";
+ state = Mail;
+ } else if ( state == Mail && responseLine[0] == '2' ) {
+ // HELO response was okay (well, it has to be)
+ *t << "MAIL FROM: <" << from << ">\r\n";
+ state = Rcpt;
+ } else if ( state == Rcpt && responseLine[0] == '2' ) {
+ *t << "RCPT TO: <" << rcpt << ">\r\n";
+ state = Data;
+ } else if ( state == Data && responseLine[0] == '2' ) {
+ *t << "DATA\r\n";
+ state = Body;
+ } else if ( state == Body && responseLine[0] == '3' ) {
+ *t << message << ".\r\n";
+ state = Quit;
+ } else if ( state == Quit && responseLine[0] == '2' ) {
+ *t << "TQUIT\r\n";
+ // here, we just close.
+ state = Close;
+ emit status( tr( "Message sent" ) );
+ } else if ( state == Close ) {
+ deleteLater();
+ return;
+ } else {
+ // something broke.
+ TQMessageBox::warning( qApp->activeWindow(),
+ tr( "TQt Mail Example" ),
+ tr( "Unexpected reply from SMTP server:\n\n" ) +
+ response );
+ state = Close;
+ }
+
+ response = "";
+}
diff --git a/examples/network/mail/smtp.h b/examples/network/mail/smtp.h
new file mode 100644
index 000000000..66cf5fda5
--- /dev/null
+++ b/examples/network/mail/smtp.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SMTP_H
+#define SMTP_H
+
+#include <qobject.h>
+#include <qstring.h>
+
+class TQSocket;
+class TQTextStream;
+class TQDns;
+
+class Smtp : public TQObject
+{
+ Q_OBJECT
+
+public:
+ Smtp( const TQString &from, const TQString &to,
+ const TQString &subject, const TQString &body );
+ ~Smtp();
+
+signals:
+ void status( const TQString & );
+
+private slots:
+ void dnsLookupHelper();
+ void readyRead();
+ void connected();
+
+private:
+ enum State {
+ Init,
+ Mail,
+ Rcpt,
+ Data,
+ Body,
+ Quit,
+ Close
+ };
+
+ TQString message;
+ TQString from;
+ TQString rcpt;
+ TQSocket *socket;
+ TQTextStream * t;
+ int state;
+ TQString response;
+ TQDns * mxLookup;
+};
+
+#endif
diff --git a/examples/network/networkprotocol/README b/examples/network/networkprotocol/README
new file mode 100644
index 000000000..7c1e69d52
--- /dev/null
+++ b/examples/network/networkprotocol/README
@@ -0,0 +1,5 @@
+This class shows you how to implement your own network protocols and how to
+use them in a program. This example is part of the network module.
+
+The class Nntp implements the nntp protocol. The implementation of the
+protocol is not complete and should not be used in real programs.
diff --git a/examples/network/networkprotocol/main.cpp b/examples/network/networkprotocol/main.cpp
new file mode 100644
index 000000000..ce4d90e87
--- /dev/null
+++ b/examples/network/networkprotocol/main.cpp
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qnetwork.h>
+
+#include "nntp.h"
+#include "view.h"
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ qInitNetworkProtocols();
+ TQNetworkProtocol::registerNetworkProtocol( "nntp", new TQNetworkProtocolFactory<Nntp> );
+
+ View v;
+ v.resize( 600, 600 );
+ v.show();
+ a.setMainWidget( &v );
+
+ return a.exec();
+}
diff --git a/examples/network/networkprotocol/networkprotocol.doc b/examples/network/networkprotocol/networkprotocol.doc
new file mode 100644
index 000000000..ea0079767
--- /dev/null
+++ b/examples/network/networkprotocol/networkprotocol.doc
@@ -0,0 +1,26 @@
+/*
+*/
+
+/*! \page networkprotocol-example.html
+
+ \ingroup network-examples
+
+ \title A simple NNTP implementation
+
+ This example shows how to implement your own QNetworkProtocol. The
+ protocol that was chosen for this example is NTTP. Please note that this
+ implementation is very simple since it is designed to be an example. It
+ should not be used as a real NNTP implemention.
+
+ <hr>
+
+ Header file (nntp.h):
+
+ \include network/networkprotocol/nntp.h
+
+ <hr>
+
+ Implementation (nntp.cpp):
+
+ \include network/networkprotocol/nntp.cpp
+*/
diff --git a/examples/network/networkprotocol/networkprotocol.pro b/examples/network/networkprotocol/networkprotocol.pro
new file mode 100644
index 000000000..1c6ea07c2
--- /dev/null
+++ b/examples/network/networkprotocol/networkprotocol.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = networkprotocol
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config
+
+HEADERS = nntp.h view.h
+SOURCES = main.cpp \
+ nntp.cpp view.cpp
diff --git a/examples/network/networkprotocol/nntp.cpp b/examples/network/networkprotocol/nntp.cpp
new file mode 100644
index 000000000..eccc1f974
--- /dev/null
+++ b/examples/network/networkprotocol/nntp.cpp
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "nntp.h"
+#include <qurlinfo.h>
+#include <stdlib.h>
+#include <qurloperator.h>
+#include <qstringlist.h>
+#include <qregexp.h>
+
+Nntp::Nntp()
+ : TQNetworkProtocol(), connectionReady( FALSE ),
+ readGroups( FALSE ), readArticle( FALSE )
+{
+ // create the command socket and connect to its signals
+ commandSocket = new TQSocket( this );
+ connect( commandSocket, SIGNAL( hostFound() ),
+ this, SLOT( hostFound() ) );
+ connect( commandSocket, SIGNAL( connected() ),
+ this, SLOT( connected() ) );
+ connect( commandSocket, SIGNAL( connectionClosed() ),
+ this, SLOT( closed() ) );
+ connect( commandSocket, SIGNAL( readyRead() ),
+ this, SLOT( readyRead() ) );
+ connect( commandSocket, SIGNAL( error( int ) ),
+ this, SLOT( error( int ) ) );
+}
+
+Nntp::~Nntp()
+{
+ close();
+ delete commandSocket;
+}
+
+void Nntp::operationListChildren( TQNetworkOperation * )
+{
+ // create a command
+ TQString path = url()->path(), cmd;
+ if ( path.isEmpty() || path == "/" ) {
+ // if the path is empty or we are in the root dir,
+ // we want to read the list of available newsgroups
+ cmd = "list newsgroups\r\n";
+ } else if ( url()->isDir() ) {
+ // if the path is a directory (in our case a news group)
+ // we want to list the articles of this group
+ path = path.replace( "/", "" );
+ cmd = "listgroup " + path + "\r\n";
+ } else
+ return;
+
+ // write the command to the socket
+ commandSocket->writeBlock( cmd.latin1(), cmd.length() );
+ readGroups = TRUE;
+}
+
+void Nntp::operationGet( TQNetworkOperation *op )
+{
+ // get the dirPath of the URL (this is our news group)
+ // and the filename (which is the article we want to read)
+ TQUrl u( op->arg( 0 ) );
+ TQString dirPath = u.dirPath(), file = u.fileName();
+ dirPath = dirPath.replace( "/", "" );
+
+ // go to the group in which the article is
+ TQString cmd;
+ cmd = "group " + dirPath + "\r\n";
+ commandSocket->writeBlock( cmd.latin1(), cmd.length() );
+
+ // read the head of the article
+ cmd = "article " + file + "\r\n";
+ commandSocket->writeBlock( cmd.latin1(), cmd.length() );
+ readArticle = TRUE;
+}
+
+bool Nntp::checkConnection( TQNetworkOperation * )
+{
+ // we are connected, return TRUE
+ if ( commandSocket->isOpen() && connectionReady )
+ return TRUE;
+
+ // seems that there is no chance to connect
+ if ( commandSocket->isOpen() )
+ return FALSE;
+
+ // don't call connectToHost() if we are already trying to connect
+ if ( commandSocket->state() == TQSocket::Connecting )
+ return FALSE;
+
+ // start connecting
+ connectionReady = FALSE;
+ commandSocket->connectToHost( url()->host(),
+ url()->port() != -1 ? url()->port() : 119 );
+ return FALSE;
+}
+
+void Nntp::close()
+{
+ // close the command socket
+ if ( commandSocket->isOpen() ) {
+ commandSocket->writeBlock( "tquit\r\n", strlen( "tquit\r\n" ) );
+ commandSocket->close();
+ }
+}
+
+int Nntp::supportedOperations() const
+{
+ // we only support listing children and getting data
+ return OpListChildren | OpGet;
+}
+
+void Nntp::hostFound()
+{
+ if ( url() )
+ emit connectionStateChanged( ConHostFound, tr( "Host %1 found" ).arg( url()->host() ) );
+ else
+ emit connectionStateChanged( ConHostFound, tr( "Host found" ) );
+}
+
+void Nntp::connected()
+{
+ if ( url() )
+ emit connectionStateChanged( ConConnected, tr( "Connected to host %1" ).arg( url()->host() ) );
+ else
+ emit connectionStateChanged( ConConnected, tr( "Connected to host" ) );
+}
+
+void Nntp::closed()
+{
+ if ( url() )
+ emit connectionStateChanged( ConClosed, tr( "Connection to %1 closed" ).arg( url()->host() ) );
+ else
+ emit connectionStateChanged( ConClosed, tr( "Connection closed" ) );
+}
+
+void Nntp::readyRead()
+{
+ // new data arrived on the command socket
+
+ // of we should read the list of available groups, let's do so
+ if ( readGroups ) {
+ parseGroups();
+ return;
+ }
+
+ // of we should read an article, let's do so
+ if ( readArticle ) {
+ parseArticle();
+ return;
+ }
+
+ // read the new data from the socket
+ TQCString s;
+ s.resize( commandSocket->bytesAvailable() + 1 );
+ commandSocket->readBlock( s.data(), commandSocket->bytesAvailable() );
+
+ if ( !url() )
+ return;
+
+ // of the code of the server response was 200, we know that the
+ // server is ready to get commands from us now
+ if ( s.left( 3 ) == "200" )
+ connectionReady = TRUE;
+}
+
+void Nntp::parseGroups()
+{
+ if ( !commandSocket->canReadLine() )
+ return;
+
+ // read one line after the other
+ while ( commandSocket->canReadLine() ) {
+ TQString s = commandSocket->readLine();
+
+ // if the line starts with a dot, all groups or articles have been listed,
+ // so we finished processing the listChildren() command
+ if ( s[ 0 ] == '.' ) {
+ readGroups = FALSE;
+ operationInProgress()->setState( StDone );
+ emit finished( operationInProgress() );
+ return;
+ }
+
+ // if the code of the server response is 215 or 211
+ // the next line will be the first group or article (depending on what we read).
+ // So let others know that we start reading now...
+ if ( s.left( 3 ) == "215" || s.left( 3 ) == "211" ) {
+ operationInProgress()->setState( StInProgress );
+ emit start( operationInProgress() );
+ continue;
+ }
+
+ // parse the line and create a TQUrlInfo object
+ // which describes the child (group or article)
+ bool tab = s.find( '\t' ) != -1;
+ TQString group = s.mid( 0, s.find( tab ? '\t' : ' ' ) );
+ TQUrlInfo inf;
+ inf.setName( group );
+ TQString path = url()->path();
+ inf.setDir( path.isEmpty() || path == "/" );
+ inf.setSymLink( FALSE );
+ inf.setFile( !inf.isDir() );
+ inf.setWritable( FALSE );
+ inf.setReadable( TRUE );
+
+ // let others know about our new child
+ emit newChild( inf, operationInProgress() );
+ }
+
+}
+
+void Nntp::parseArticle()
+{
+ if ( !commandSocket->canReadLine() )
+ return;
+
+ // read an article one line after the other
+ while ( commandSocket->canReadLine() ) {
+ TQString s = commandSocket->readLine();
+
+ // if the line starts with a dot, we finished reading something
+ if ( s[ 0 ] == '.' ) {
+ readArticle = FALSE;
+ operationInProgress()->setState( StDone );
+ emit finished( operationInProgress() );
+ return;
+ }
+
+ if ( s.right( 1 ) == "\n" )
+ s.remove( s.length() - 1, 1 );
+
+ // emit the new data of the article which we read
+ emit data( TQCString( s.ascii() ), operationInProgress() );
+ }
+}
+
+void Nntp::error( int code )
+{
+ if ( code == TQSocket::ErrHostNotFound ||
+ code == TQSocket::ErrConnectionRefused ) {
+ // this signal is called if connecting to the server failed
+ if ( operationInProgress() ) {
+ TQString msg = tr( "Host not found or couldn't connect to: \n" + url()->host() );
+ operationInProgress()->setState( StFailed );
+ operationInProgress()->setProtocolDetail( msg );
+ operationInProgress()->setErrorCode( (int)ErrHostNotFound );
+ clearOperationQueue();
+ emit finished( operationInProgress() );
+ }
+ }
+}
diff --git a/examples/network/networkprotocol/nntp.h b/examples/network/networkprotocol/nntp.h
new file mode 100644
index 000000000..2940a1add
--- /dev/null
+++ b/examples/network/networkprotocol/nntp.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef NNTP_H
+#define NNTP_H
+
+#include <qsocket.h>
+#include <qnetworkprotocol.h>
+
+class Nntp : public TQNetworkProtocol
+{
+ Q_OBJECT
+
+public:
+ Nntp();
+ virtual ~Nntp();
+ virtual int supportedOperations() const;
+
+protected:
+ virtual void operationListChildren( TQNetworkOperation *op );
+ virtual void operationGet( TQNetworkOperation *op );
+
+ TQSocket *commandSocket;
+ bool connectionReady;
+ bool readGroups;
+ bool readArticle;
+
+private:
+ bool checkConnection( TQNetworkOperation *op );
+ void close();
+ void parseGroups();
+ void parseArticle();
+
+protected slots:
+ void hostFound();
+ void connected();
+ void closed();
+ void readyRead();
+ void error( int );
+
+};
+
+#endif
diff --git a/examples/network/networkprotocol/view.cpp b/examples/network/networkprotocol/view.cpp
new file mode 100644
index 000000000..c6ee717d1
--- /dev/null
+++ b/examples/network/networkprotocol/view.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "view.h"
+
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qmultilineedit.h>
+#include <qfiledialog.h>
+
+View::View()
+ : TQVBox()
+{
+ // setup the GUI
+ setSpacing( 5 );
+ setMargin( 5 );
+
+ TQLabel *l = new TQLabel( this );
+ l->setAlignment( TQt::WordBreak ),
+ l->setText( tr( "The button below opens the TQFileDialog and you "
+ "can choose a file then which is downloaded and "
+ "opened below then. You can use for that the <b>local "
+ "filesystem</b> using the file protocol, you can download "
+ "files from an <b>FTP</b> server using the ftp protocol and "
+ "you can download and open <b>USENET</b> articles using the "
+ "demo implementation of the nntp protocol of this "
+ "example (<i>This implementation of the nntp protocol is a very "
+ "basic and incomplete one, so you need to connect to a news server "
+ "which allows reading without authentification</i>)\n"
+ "To open a file from the local filesystem, enter in the "
+ "path combobox of the file dialog a url starting with file "
+ "(like <u>file:/usr/bin</u>), to download something from an FTP "
+ "server, use something like <u>ftp://ftp.trolltech.com</u> as url, and "
+ "for downloading a news article start with an url like "
+ "<u>nntp://news.tu-graz.ac.at</u> " ) );
+ TQPushButton *b = new TQPushButton( tr( "Open a file..." ), this );
+ connect( b, SIGNAL( clicked() ),
+ this, SLOT( downloadFile() ) );
+
+ fileView = new TQMultiLineEdit( this );
+ fileView->setReadOnly( TRUE );
+
+ // if new data comes in, display it
+ connect( &op, SIGNAL( data( const TQByteArray &, TQNetworkOperation * ) ),
+ this, SLOT( newData( const TQByteArray & ) ) );
+}
+
+void View::downloadFile()
+{
+ // TQString file = TQFileDialog::getOpenFileName();
+ // under Windows you must not use the native file dialog
+ TQString file = getOpenFileName();
+ if ( !file.isEmpty() ) {
+ // clear the view
+ fileView->clear();
+
+ // download the data
+ op = file;
+ op.get();
+ }
+}
+
+TQString View::getOpenFileName()
+{
+ static TQString workingDirectory = TQDir::currentDirPath();
+
+ TQFileDialog *dlg = new TQFileDialog( workingDirectory,
+ TQString::null, 0, 0, TRUE );
+ dlg->setCaption( TQFileDialog::tr( "Open" ) );
+ dlg->setMode( TQFileDialog::ExistingFile );
+ TQString result;
+ if ( dlg->exec() == TQDialog::Accepted ) {
+ result = dlg->selectedFile();
+ workingDirectory = dlg->url();
+ }
+ delete dlg;
+ return result;
+}
+
+void View::newData( const TQByteArray &ba )
+{
+ // append new data
+ fileView->append( ba );
+}
diff --git a/examples/network/networkprotocol/view.h b/examples/network/networkprotocol/view.h
new file mode 100644
index 000000000..29c0f6e5f
--- /dev/null
+++ b/examples/network/networkprotocol/view.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef VIEW_H
+#define VIEW_H
+
+#include <qvbox.h>
+#include <qcstring.h>
+#include <qurloperator.h>
+
+class TQMultiLineEdit;
+
+class View : public TQVBox
+{
+ Q_OBJECT
+
+public:
+ View();
+
+private slots:
+ void downloadFile();
+ void newData( const TQByteArray &ba );
+
+private:
+ TQMultiLineEdit *fileView;
+ TQUrlOperator op;
+
+ TQString getOpenFileName();
+};
+
+#endif
diff --git a/examples/network/remotecontrol/ipcserver.cpp b/examples/network/remotecontrol/ipcserver.cpp
new file mode 100644
index 000000000..35595673f
--- /dev/null
+++ b/examples/network/remotecontrol/ipcserver.cpp
@@ -0,0 +1,84 @@
+#include "ipcserver.h"
+
+#include <qsocket.h>
+#include <qvariant.h>
+#include <qimage.h>
+#include <qpalette.h>
+#include <qapplication.h>
+
+class IpcSocket : public TQSocket
+{
+ Q_OBJECT
+
+public:
+ IpcSocket( TQObject *parent) : TQSocket( parent )
+ {
+ packetSize = 0;
+ connect( this, SIGNAL(readyRead()), SLOT(read()) );
+ }
+
+signals:
+ void receivedText( const TQString& );
+ void receivedPixmap( const TQPixmap& );
+
+private slots:
+ void read()
+ {
+ Q_ULONG bytesAvail = bytesAvailable();
+ for ( ;; ) {
+ if ( packetSize == 0 ) {
+ TQDataStream ds( this );
+ if ( bytesAvail < 4 )
+ return;
+ ds >> packetSize;
+ bytesAvail -= 4;
+ } else {
+ if ( bytesAvail < packetSize )
+ return;
+ // read the packet in a byte array to be sure that you don't
+ // read too much or too less
+ TQByteArray ba( packetSize );
+ readBlock( ba.data(), packetSize );
+ bytesAvail -= packetSize;
+ packetSize = 0;
+
+ TQVariant variant;
+ TQDataStream ds( ba, IO_ReadOnly );
+ ds >> variant;
+ switch ( variant.type() ) {
+ case TQVariant::String:
+ emit receivedText( variant.toString() );
+ break;
+ case TQVariant::Image:
+ emit receivedPixmap( TQPixmap(variant.toImage()) );
+ break;
+ case TQVariant::Palette:
+ TQApplication::setPalette( variant.toPalette(), TRUE );
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+private:
+ Q_UINT32 packetSize;
+};
+
+IpcServer::IpcServer( Q_UINT16 port, TQObject *parent ) :
+ TQServerSocket( 0x7f000001, port, 1, parent )
+{
+}
+
+void IpcServer::newConnection( int socket )
+{
+ IpcSocket *s = new IpcSocket( this );
+ s->setSocket( socket );
+ connect( s, SIGNAL(receivedText(const TQString&)),
+ SIGNAL(receivedText(const TQString&)) );
+ connect( s, SIGNAL(receivedPixmap(const TQPixmap&)),
+ SIGNAL(receivedPixmap(const TQPixmap&)) );
+}
+
+#include "ipcserver.moc"
diff --git a/examples/network/remotecontrol/ipcserver.h b/examples/network/remotecontrol/ipcserver.h
new file mode 100644
index 000000000..f4c86f49f
--- /dev/null
+++ b/examples/network/remotecontrol/ipcserver.h
@@ -0,0 +1,20 @@
+#ifndef IPCSERVER_H
+#define IPCSERVER_H
+
+#include <qserversocket.h>
+
+class IpcServer : public TQServerSocket
+{
+ Q_OBJECT
+
+public:
+ IpcServer( Q_UINT16 port, TQObject *parent );
+
+ void newConnection( int socket );
+
+signals:
+ void receivedText( const TQString& );
+ void receivedPixmap( const TQPixmap& );
+};
+
+#endif // IPCSERVER_H
diff --git a/examples/network/remotecontrol/main.cpp b/examples/network/remotecontrol/main.cpp
new file mode 100644
index 000000000..c153d02d2
--- /dev/null
+++ b/examples/network/remotecontrol/main.cpp
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+
+#include "startup.h"
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ StartUp s;
+ TQObject::connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) );
+ return a.exec();
+}
diff --git a/examples/network/remotecontrol/maindialog.ui b/examples/network/remotecontrol/maindialog.ui
new file mode 100644
index 000000000..ede1cfe95
--- /dev/null
+++ b/examples/network/remotecontrol/maindialog.ui
@@ -0,0 +1,165 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>MainDialog</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>MainDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>273</width>
+ <height>263</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Image viewer</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>MShape</enum>
+ </property>
+ <property name="text">
+ <string>If you start another instance of this application, you can use that instance to control this one.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>image</cstring>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>description</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>26</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>The TQt logo</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer2_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>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</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" stdset="0">
+ <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>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="55092">789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>MainDialog</receiver>
+ <slot>close()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/remotecontrol/remotecontrol.pro b/examples/network/remotecontrol/remotecontrol.pro
new file mode 100644
index 000000000..0570253c2
--- /dev/null
+++ b/examples/network/remotecontrol/remotecontrol.pro
@@ -0,0 +1,16 @@
+TEMPLATE = app
+TARGET = remotecontrol
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config nocrosscompiler
+
+HEADERS = startup.h \
+ remotectrlimpl.h \
+ ipcserver.h
+SOURCES = main.cpp \
+ startup.cpp \
+ remotectrlimpl.cpp \
+ ipcserver.cpp
+INTERFACES = remotectrl.ui \
+ maindialog.ui
diff --git a/examples/network/remotecontrol/remotectrl.ui b/examples/network/remotecontrol/remotectrl.ui
new file mode 100644
index 000000000..c28482ff2
--- /dev/null
+++ b/examples/network/remotecontrol/remotectrl.ui
@@ -0,0 +1,145 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>RemoteCtrl</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>RemoteCtrl</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>279</width>
+ <height>185</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Remote control</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </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="TQLayoutWidget">
+ <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="TQLineEdit">
+ <property name="name">
+ <cstring>textToSend</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer5_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>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <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="TQPushButton">
+ <property name="name">
+ <cstring>sText</cstring>
+ </property>
+ <property name="text">
+ <string>Send &amp;Text</string>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>sImage</cstring>
+ </property>
+ <property name="text">
+ <string>Send &amp;Image...</string>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>sPalette</cstring>
+ </property>
+ <property name="text">
+ <string>Send &amp;Palette...</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>tquitButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+</widget>
+<connections>
+ <connection>
+ <sender>tquitButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RemoteCtrl</receiver>
+ <slot>close()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/network/remotecontrol/remotectrlimpl.cpp b/examples/network/remotecontrol/remotectrlimpl.cpp
new file mode 100644
index 000000000..03af938f8
--- /dev/null
+++ b/examples/network/remotecontrol/remotectrlimpl.cpp
@@ -0,0 +1,50 @@
+#include "remotectrlimpl.h"
+
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qsocket.h>
+#include <qfiledialog.h>
+#include <qcolordialog.h>
+#include <qimage.h>
+
+RemoteCtrlImpl::RemoteCtrlImpl( TQSocket *s )
+{
+ socket = s;
+ connect( sImage, SIGNAL(clicked()), SLOT(sendImage()) );
+ connect( sText, SIGNAL(clicked()), SLOT(sendText()) );
+ connect( sPalette, SIGNAL(clicked()), SLOT(sendPalette()) );
+}
+
+void RemoteCtrlImpl::sendPacket( const TQVariant &v )
+{
+ TQByteArray ba;
+ TQDataStream varDs( ba, IO_WriteOnly );
+ varDs << v;
+
+ TQDataStream ds( socket );
+ ds << (Q_UINT32) ba.size();
+ socket->writeBlock( ba.data(), ba.size() );
+}
+
+void RemoteCtrlImpl::sendImage()
+{
+ TQString imageName = TQFileDialog::getOpenFileName( TQString::null,
+ "Images (*.png *.xpm *.jpg)", this );
+ TQImage image( imageName );
+ if ( !image.isNull() ) {
+ sendPacket( image );
+ }
+}
+
+void RemoteCtrlImpl::sendText()
+{
+ sendPacket( textToSend->text() );
+}
+
+void RemoteCtrlImpl::sendPalette()
+{
+ TQColor col = TQColorDialog::getColor( white, this );
+ if ( col.isValid() ) {
+ sendPacket( TQPalette(col,col) );
+ }
+}
diff --git a/examples/network/remotecontrol/remotectrlimpl.h b/examples/network/remotecontrol/remotectrlimpl.h
new file mode 100644
index 000000000..a14d1be76
--- /dev/null
+++ b/examples/network/remotecontrol/remotectrlimpl.h
@@ -0,0 +1,26 @@
+#ifndef REMOTECTRLIMPL_H
+#define REMOTECTRLIMPL_H
+
+#include "remotectrl.h"
+
+class TQSocket;
+
+class RemoteCtrlImpl : public RemoteCtrl
+{
+ Q_OBJECT
+
+public:
+ RemoteCtrlImpl( TQSocket * );
+
+private slots:
+ void sendImage();
+ void sendText();
+ void sendPalette();
+
+private:
+ void sendPacket( const TQVariant & );
+
+ TQSocket *socket;
+};
+
+#endif // REMOTECTRLIMPL_H
diff --git a/examples/network/remotecontrol/startup.cpp b/examples/network/remotecontrol/startup.cpp
new file mode 100644
index 000000000..f555499b7
--- /dev/null
+++ b/examples/network/remotecontrol/startup.cpp
@@ -0,0 +1,45 @@
+#include "startup.h"
+#include "remotectrlimpl.h"
+#include "maindialog.h"
+#include "ipcserver.h"
+
+#include <qsocket.h>
+#include <qlabel.h>
+
+static const Q_UINT16 ipcPort = 54923;
+
+StartUp::StartUp()
+{
+ remoteCtrl = 0;
+ mainDialog = 0;
+
+ socket = new TQSocket( this );
+ connect( socket, SIGNAL(connected()), SLOT(startRemoteCtrl()) );
+ connect( socket, SIGNAL(error(int)), SLOT(startMainDialog()) );
+ socket->connectToHost( "localhost", ipcPort );
+}
+
+StartUp::~StartUp()
+{
+ delete remoteCtrl;
+ delete mainDialog;
+}
+
+void StartUp::startRemoteCtrl()
+{
+ remoteCtrl = new RemoteCtrlImpl( socket );
+ remoteCtrl->show();
+}
+
+void StartUp::startMainDialog()
+{
+ mainDialog = new MainDialog();
+ mainDialog->show();
+
+ IpcServer *server = new IpcServer( ipcPort, this );
+
+ connect( server, SIGNAL(receivedText(const TQString&)),
+ mainDialog->description, SLOT(setText(const TQString&)) );
+ connect( server, SIGNAL(receivedPixmap(const TQPixmap&)),
+ mainDialog->image, SLOT(setPixmap(const TQPixmap&)) );
+}
diff --git a/examples/network/remotecontrol/startup.h b/examples/network/remotecontrol/startup.h
new file mode 100644
index 000000000..5530cba8f
--- /dev/null
+++ b/examples/network/remotecontrol/startup.h
@@ -0,0 +1,28 @@
+#ifndef STARTUP_H
+#define STARTUP_H
+
+#include <qobject.h>
+
+class TQSocket;
+class RemoteCtrlImpl;
+class MainDialog;
+
+class StartUp : public TQObject
+{
+ Q_OBJECT
+
+public:
+ StartUp();
+ ~StartUp();
+
+private slots:
+ void startRemoteCtrl();
+ void startMainDialog();
+
+private:
+ TQSocket *socket;
+ RemoteCtrlImpl *remoteCtrl;
+ MainDialog *mainDialog;
+};
+
+#endif // STARTUP_H
diff --git a/examples/opengl/box/README b/examples/opengl/box/README
new file mode 100644
index 000000000..113f82d6c
--- /dev/null
+++ b/examples/opengl/box/README
@@ -0,0 +1,8 @@
+
+The box example
+
+This example program shows how to use OpenGL in Qt: Put your OpenGL
+code in a class inherited from QGLWidget. The resulting subclass may
+be used like any other Qt widget, with signals and slots, geometry
+management, etc..
+
diff --git a/examples/opengl/box/box.doc b/examples/opengl/box/box.doc
new file mode 100644
index 000000000..51297fa35
--- /dev/null
+++ b/examples/opengl/box/box.doc
@@ -0,0 +1,18 @@
+/*! \page opengl-box-example.html
+
+ \ingroup opengl-examples
+ \title OpenGL Box Example
+
+This example demonstrates how to use OpenGL in Qt.
+
+Essentially, all you do is put your OpenGL code in a class inherited
+from QGLWidget. This class may then be used like any other Qt widget,
+including the use of signals and slots and geometry management.
+
+See \c{$QTDIR/examples/opengl/box} for the source code.
+
+*/
+
+
+
+
diff --git a/examples/opengl/box/box.pro b/examples/opengl/box/box.pro
new file mode 100644
index 000000000..80784531f
--- /dev/null
+++ b/examples/opengl/box/box.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+TARGET = box
+
+CONFIG += qt opengl warn_on release
+CONFIG -= dlopen_opengl
+
+DEPENDPATH = ../include
+
+REQUIRES = opengl
+
+HEADERS = glbox.h \
+ globjwin.h
+SOURCES = glbox.cpp \
+ globjwin.cpp \
+ main.cpp
diff --git a/examples/opengl/box/glbox.cpp b/examples/opengl/box/glbox.cpp
new file mode 100644
index 000000000..aa1792241
--- /dev/null
+++ b/examples/opengl/box/glbox.cpp
@@ -0,0 +1,170 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget 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( TQWidget* parent, const char* name )
+ : TQGLWidget( parent, name )
+{
+ 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();
+ glTranslatef( 0.0, 0.0, -10.0 );
+ 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 );
+
+ glCallList( object );
+}
+
+
+/*!
+ 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;
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the X axis.
+*/
+
+void GLBox::setXRotation( int degrees )
+{
+ xRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Y axis.
+*/
+
+void GLBox::setYRotation( int degrees )
+{
+ yRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Z axis.
+*/
+
+void GLBox::setZRotation( int degrees )
+{
+ zRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
diff --git a/examples/opengl/box/glbox.h b/examples/opengl/box/glbox.h
new file mode 100644
index 000000000..a04a8122a
--- /dev/null
+++ b/examples/opengl/box/glbox.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLBOX_H
+#define GLBOX_H
+
+#include <qgl.h>
+
+
+class GLBox : public TQGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ GLBox( TQWidget* parent, const char* name );
+ ~GLBox();
+
+public slots:
+
+ void setXRotation( int degrees );
+ void setYRotation( int degrees );
+ void setZRotation( int degrees );
+
+protected:
+
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ virtual GLuint makeObject();
+
+private:
+
+ GLuint object;
+ GLfloat xRot, yRot, zRot, scale;
+
+};
+
+
+#endif // GLBOX_H
diff --git a/examples/opengl/box/globjwin.cpp b/examples/opengl/box/globjwin.cpp
new file mode 100644
index 000000000..f4af52c36
--- /dev/null
+++ b/examples/opengl/box/globjwin.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <qframe.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+#include <qkeycode.h>
+#include "globjwin.h"
+#include "glbox.h"
+
+
+GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name )
+ : TQWidget( parent, name )
+{
+
+ // Create a menu
+ TQPopupMenu *file = new TQPopupMenu( this );
+ file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ // Create a menu bar
+ TQMenuBar *m = new TQMenuBar( this );
+ m->setSeparator( TQMenuBar::InWindowsStyle );
+ m->insertItem("&File", file );
+
+ // Create a nice frame to put around the OpenGL widget
+ TQFrame* f = new TQFrame( this, "frame" );
+ f->setFrameStyle( TQFrame::Sunken | TQFrame::Panel );
+ f->setLineWidth( 2 );
+
+ // Create our OpenGL widget
+ GLBox* c = new GLBox( f, "glbox");
+
+ // Create the three sliders; one for each rotation axis
+ TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" );
+ x->setTickmarks( TQSlider::Left );
+ TQObject::connect( x, SIGNAL(valueChanged(int)),c,SLOT(setXRotation(int)) );
+
+ TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" );
+ y->setTickmarks( TQSlider::Left );
+ TQObject::connect( y, SIGNAL(valueChanged(int)),c,SLOT(setYRotation(int)) );
+
+ TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" );
+ z->setTickmarks( TQSlider::Left );
+ TQObject::connect( z, SIGNAL(valueChanged(int)),c,SLOT(setZRotation(int)) );
+
+
+ // Now that we have all the widgets, put them into a nice layout
+
+ // Put the sliders on top of each other
+ TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout");
+ vlayout->addWidget( x );
+ vlayout->addWidget( y );
+ vlayout->addWidget( z );
+
+ // Put the GL widget inside the frame
+ TQHBoxLayout* flayout = new TQHBoxLayout( f, 2, 2, "flayout");
+ flayout->addWidget( c, 1 );
+
+ // Top level layout, puts the sliders to the left of the frame/GL widget
+ TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout");
+ hlayout->setMenuBar( m );
+ hlayout->addLayout( vlayout );
+ hlayout->addWidget( f, 1 );
+}
diff --git a/examples/opengl/box/globjwin.h b/examples/opengl/box/globjwin.h
new file mode 100644
index 000000000..98dad489e
--- /dev/null
+++ b/examples/opengl/box/globjwin.h
@@ -0,0 +1,32 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** The GLObjectWindow contains a GLBox and three sliders connected to
+** the GLBox's rotation slots.
+**
+****************************************************************************/
+
+#ifndef GLOBJWIN_H
+#define GLOBJWIN_H
+
+#include <qwidget.h>
+
+
+class GLObjectWindow : public TQWidget
+{
+ Q_OBJECT
+public:
+ GLObjectWindow( TQWidget* parent = 0, const char* name = 0 );
+
+};
+
+
+#endif // GLOBJWIN_H
diff --git a/examples/opengl/box/main.cpp b/examples/opengl/box/main.cpp
new file mode 100644
index 000000000..4a3863232
--- /dev/null
+++ b/examples/opengl/box/main.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// TQt OpenGL example: Box
+//
+// A small example showing how a GLWidget can be used just as any TQt widget
+//
+// File: main.cpp
+//
+// The main() function
+//
+
+#include "globjwin.h"
+#include <qapplication.h>
+#include <qgl.h>
+
+/*
+ The main program is here.
+*/
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a(argc,argv);
+
+ if ( !TQGLFormat::hasOpenGL() ) {
+ qWarning( "This system has no OpenGL support. Exiting." );
+ return -1;
+ }
+
+ GLObjectWindow w;
+ w.resize( 400, 350 );
+ a.setMainWidget( &w );
+ w.show();
+ return a.exec();
+}
diff --git a/examples/opengl/gear/README b/examples/opengl/gear/README
new file mode 100644
index 000000000..15f55e77d
--- /dev/null
+++ b/examples/opengl/gear/README
@@ -0,0 +1,4 @@
+
+The gear example
+
+This example program demonstrates how to use OpenGL display lists.
diff --git a/examples/opengl/gear/gear.cpp b/examples/opengl/gear/gear.cpp
new file mode 100644
index 000000000..843f56384
--- /dev/null
+++ b/examples/opengl/gear/gear.cpp
@@ -0,0 +1,296 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. 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 <qgl.h>
+#include <qapplication.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();
+
+}
+
+
+static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0;
+static GLint gear1, gear2, gear3;
+static GLfloat angle = 0.0;
+
+
+static void draw()
+{
+ angle += 2.0;
+ view_roty += 1.0;
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ 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();
+}
+
+
+static int timer_interval = 10; // timer interval (millisec)
+
+
+class GearWidget : public TQGLWidget
+{
+public:
+ GearWidget( TQWidget *parent=0, const char *name=0 );
+protected:
+ void initializeGL();
+ void resizeGL( int, int );
+ void paintGL();
+ void timerEvent( TQTimerEvent * );
+};
+
+GearWidget::GearWidget( TQWidget *parent, const char *name )
+ : TQGLWidget( parent, name )
+{
+ startTimer( timer_interval );
+}
+
+void GearWidget::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 GearWidget::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 GearWidget::paintGL()
+{
+ draw();
+}
+
+void GearWidget::timerEvent(TQTimerEvent*)
+{
+ updateGL();
+}
+
+
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a( argc, argv );
+
+ if ( !TQGLFormat::hasOpenGL() ) {
+ qWarning( "This system has no OpenGL support. Exiting." );
+ return -1;
+ }
+
+ if ( argc >= 2 ) {
+ bool ok = TRUE;
+ timer_interval = TQString::fromLatin1( argv[1] ).toInt( &ok );
+ if ( !ok )
+ timer_interval = 10;
+ }
+
+ GearWidget w;
+ a.setMainWidget( &w );
+ w.show();
+ return a.exec();
+}
diff --git a/examples/opengl/gear/gear.doc b/examples/opengl/gear/gear.doc
new file mode 100644
index 000000000..2fe049a93
--- /dev/null
+++ b/examples/opengl/gear/gear.doc
@@ -0,0 +1,11 @@
+/*! \page opengl-gear-example.html
+
+ \ingroup opengl-examples
+ \title OpenGL Gear Example
+
+
+This example demonstrates how to use OpenGL display lists.
+
+See \c{$QTDIR/examples/opengl/gear} for the source code.
+
+*/
diff --git a/examples/opengl/gear/gear.pro b/examples/opengl/gear/gear.pro
new file mode 100644
index 000000000..b91691cba
--- /dev/null
+++ b/examples/opengl/gear/gear.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+TARGET = gear
+
+CONFIG += qt opengl warn_on release
+CONFIG -= dlopen_opengl
+!mac:unix:LIBS += -lm
+DEPENDPATH = ../include
+
+REQUIRES = opengl
+
+HEADERS =
+SOURCES = gear.cpp
diff --git a/examples/opengl/glpixmap/README b/examples/opengl/glpixmap/README
new file mode 100644
index 000000000..b01cfafee
--- /dev/null
+++ b/examples/opengl/glpixmap/README
@@ -0,0 +1,8 @@
+
+The OpenGL pixmap example
+
+This example program is an extension of the "box" example program.
+
+It demonstrates how to render OpenGL into a QPixmap.
+
+
diff --git a/examples/opengl/glpixmap/glbox.cpp b/examples/opengl/glpixmap/glbox.cpp
new file mode 100644
index 000000000..fe7c682c5
--- /dev/null
+++ b/examples/opengl/glpixmap/glbox.cpp
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying a box
+**
+** The OpenGL code is mostly borrowed from Brian Pauls "spin" example
+** in the Mesa distribution
+**
+****************************************************************************/
+
+#include <math.h>
+
+#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( TQWidget* parent, const char* name, const TQGLWidget* shareWidget )
+ : TQGLWidget( parent, name, shareWidget )
+{
+ xRot = yRot = zRot = 0.0; // default object rotation
+ scale = 1.5; // default object scale
+}
+
+
+/*!
+ Create a GLBox widget
+*/
+
+GLBox::GLBox( const TQGLFormat& format, TQWidget* parent, const char* name,
+ const TQGLWidget* shareWidget )
+ : TQGLWidget( format, parent, name, shareWidget )
+{
+ xRot = yRot = zRot = 0.0; // default object rotation
+ scale = 1.5; // default object scale
+}
+
+
+/*!
+ Release allocated resources
+*/
+
+GLBox::~GLBox()
+{
+}
+
+
+/*!
+ Set up the OpenGL rendering state, and define display list
+*/
+
+void GLBox::initializeGL()
+{
+ qglClearColor( green ); // Let OpenGL clear to green
+ object = makeObject(); // Make display list
+ glEnable( GL_DEPTH_TEST );
+}
+
+
+/*!
+ 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, 1.0, 200.0);
+}
+
+
+/*!
+ Paint the box. The actual openGL commands for drawing the box are
+ performed here.
+*/
+
+void GLBox::paintGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -3.0 );
+ 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 );
+
+ glCallList( object );
+}
+
+
+
+
+
+
+/*!
+ 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 );
+
+ GLint i, j, rings, sides;
+ float theta1, phi1, theta2, phi2;
+ float v0[03], v1[3], v2[3], v3[3];
+ float t0[03], t1[3], t2[3], t3[3];
+ float n0[3], n1[3], n2[3], n3[3];
+ float innerRadius=0.4;
+ float outerRadius=0.8;
+ float scalFac;
+ double pi = 3.14159265358979323846;
+
+ rings = 8;
+ sides = 10;
+ scalFac=1/(outerRadius*2);
+
+ for (i = 0; i < rings; i++) {
+ theta1 = (float)i * 2.0 * pi / rings;
+ theta2 = (float)(i + 1) * 2.0 * pi / rings;
+ for (j = 0; j < sides; j++) {
+ phi1 = (float)j * 2.0 * pi / sides;
+ phi2 = (float)(j + 1) * 2.0 * pi / sides;
+
+ v0[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi1));
+ v0[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi1));
+ v0[2] = innerRadius * sin(phi1);
+
+ v1[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi1));
+ v1[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi1));
+ v1[2] = innerRadius * sin(phi1);
+ v2[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi2));
+ v2[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi2));
+ v2[2] = innerRadius * sin(phi2);
+
+ v3[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi2));
+ v3[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi2));
+ v3[2] = innerRadius * sin(phi2);
+
+ n0[0] = cos(theta1) * (cos(phi1));
+ n0[1] = -sin(theta1) * (cos(phi1));
+ n0[2] = sin(phi1);
+
+ n1[0] = cos(theta2) * (cos(phi1));
+ n1[1] = -sin(theta2) * (cos(phi1));
+ n1[2] = sin(phi1);
+
+ n2[0] = cos(theta2) * (cos(phi2));
+ n2[1] = -sin(theta2) * (cos(phi2));
+ n2[2] = sin(phi2);
+
+ n3[0] = cos(theta1) * (cos(phi2));
+ n3[1] = -sin(theta1) * (cos(phi2));
+ n3[2] = sin(phi2);
+
+ t0[0] = v0[0]*scalFac + 0.5;
+ t0[1] = v0[1]*scalFac + 0.5;
+ t0[2] = v0[2]*scalFac + 0.5;
+
+ t1[0] = v1[0]*scalFac + 0.5;
+ t1[1] = v1[1]*scalFac + 0.5;
+ t1[2] = v1[2]*scalFac + 0.5;
+
+ t2[0] = v2[0]*scalFac + 0.5;
+ t2[1] = v2[1]*scalFac + 0.5;
+ t2[2] = v2[2]*scalFac + 0.5;
+
+ t3[0] = v3[0]*scalFac + 0.5;
+ t3[1] = v3[1]*scalFac + 0.5;
+ t3[2] = v3[2]*scalFac + 0.5;
+
+ // Create blue-black checkered coloring
+ if ( (i+j) % 2 )
+ qglColor( black );
+ else
+ qglColor( TQColor( "steelblue" ) );
+
+ glBegin(GL_POLYGON);
+ glNormal3fv(n3); glTexCoord3fv(t3); glVertex3fv(v3);
+ glNormal3fv(n2); glTexCoord3fv(t2); glVertex3fv(v2);
+ glNormal3fv(n1); glTexCoord3fv(t1); glVertex3fv(v1);
+ glNormal3fv(n0); glTexCoord3fv(t0); glVertex3fv(v0);
+ glEnd();
+ }
+ }
+ glEndList();
+
+ return list;
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the X axis.
+*/
+
+void GLBox::setXRotation( int degrees )
+{
+ xRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Y axis.
+*/
+
+void GLBox::setYRotation( int degrees )
+{
+ yRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Z axis.
+*/
+
+void GLBox::setZRotation( int degrees )
+{
+ zRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+
+
+/*!
+ Sets the rotation angles of this object to that of \a fromBox
+*/
+
+void GLBox::copyRotation( const GLBox& fromBox )
+{
+ xRot = fromBox.xRot;
+ yRot = fromBox.yRot;
+ zRot = fromBox.zRot;
+}
diff --git a/examples/opengl/glpixmap/glbox.h b/examples/opengl/glpixmap/glbox.h
new file mode 100644
index 000000000..0b58cda0b
--- /dev/null
+++ b/examples/opengl/glpixmap/glbox.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying a box
+**
+****************************************************************************/
+
+#ifndef GLBOX_H
+#define GLBOX_H
+
+#include <qgl.h>
+
+
+class GLBox : public TQGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ GLBox( TQWidget* parent, const char* name, const TQGLWidget* shareWidget=0 );
+ GLBox( const TQGLFormat& format, TQWidget* parent, const char* name,
+ const TQGLWidget* shareWidget=0 );
+ ~GLBox();
+
+ void copyRotation( const GLBox& fromBox );
+
+public slots:
+
+ void setXRotation( int degrees );
+ void setYRotation( int degrees );
+ void setZRotation( int degrees );
+
+protected:
+
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ virtual GLuint makeObject();
+
+private:
+
+ GLuint object;
+
+ GLfloat xRot, yRot, zRot, scale;
+
+};
+
+
+#endif // GLBOX_H
diff --git a/examples/opengl/glpixmap/globjwin.cpp b/examples/opengl/glpixmap/globjwin.cpp
new file mode 100644
index 000000000..6341c3e07
--- /dev/null
+++ b/examples/opengl/glpixmap/globjwin.cpp
@@ -0,0 +1,214 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** Implementation of GLObjectWindow widget class
+**
+****************************************************************************/
+
+
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+#include <qkeycode.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include "globjwin.h"
+#include "glbox.h"
+
+
+GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name )
+ : TQWidget( parent, name )
+{
+ // Create a menu
+ file = new TQPopupMenu( this );
+ file->setCheckable( TRUE );
+ file->insertItem( "Grab Frame Buffer", this, SLOT(grabFrameBuffer()) );
+ file->insertItem( "Render Pixmap", this, SLOT(makePixmap()) );
+ file->insertItem( "Render Pixmap Hidden", this, SLOT(makePixmapHidden()) );
+ file->insertSeparator();
+ fixMenuItemId = file->insertItem( "Use Fixed Pixmap Size", this,
+ SLOT(useFixedPixmapSize()) );
+ file->insertSeparator();
+ insertMenuItemId = file->insertItem( "Insert Pixmap Here", this,
+ SLOT(makePixmapForMenu()) );
+ file->insertSeparator();
+ file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ // Create a menu bar
+ TQMenuBar *m = new TQMenuBar( this );
+ m->setSeparator( TQMenuBar::InWindowsStyle );
+ m->insertItem("&File", file );
+
+ // Create nice frames to put around the OpenGL widgets
+ TQFrame* f1 = new TQFrame( this, "frame1" );
+ f1->setFrameStyle( TQFrame::Sunken | TQFrame::Panel );
+ f1->setLineWidth( 2 );
+
+ // Create an OpenGL widget
+ c1 = new GLBox( f1, "glbox1");
+
+ // Create a label that can display the pixmap
+ lb = new TQLabel( this, "pixlabel" );
+ lb->setFrameStyle( TQFrame::Sunken | TQFrame::Panel );
+ lb->setLineWidth( 2 );
+ lb->setAlignment( AlignCenter );
+ lb->setMargin( 0 );
+ lb->setIndent( 0 );
+
+ // Create the three sliders; one for each rotation axis
+ TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" );
+ x->setTickmarks( TQSlider::Left );
+ connect( x, SIGNAL(valueChanged(int)), c1, SLOT(setXRotation(int)) );
+
+ TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" );
+ y->setTickmarks( TQSlider::Left );
+ connect( y, SIGNAL(valueChanged(int)), c1, SLOT(setYRotation(int)) );
+
+ TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" );
+ z->setTickmarks( TQSlider::Left );
+ connect( z, SIGNAL(valueChanged(int)), c1, SLOT(setZRotation(int)) );
+
+
+ // Now that we have all the widgets, put them into a nice layout
+
+ // Put the sliders on top of each other
+ TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout");
+ vlayout->addWidget( x );
+ vlayout->addWidget( y );
+ vlayout->addWidget( z );
+
+ // Put the GL widget inside the frame
+ TQHBoxLayout* flayout1 = new TQHBoxLayout( f1, 2, 2, "flayout1");
+ flayout1->addWidget( c1, 1 );
+
+ // Top level layout, puts the sliders to the left of the frame/GL widget
+ TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout");
+ hlayout->setMenuBar( m );
+ hlayout->addLayout( vlayout );
+ hlayout->addWidget( f1, 1 );
+ hlayout->addWidget( lb, 1 );
+
+}
+
+
+
+void GLObjectWindow::grabFrameBuffer()
+{
+ TQImage img = c1->grabFrameBuffer();
+
+ // Convert image to pixmap so we can show it
+ TQPixmap pm;
+ pm.convertFromImage( img, AvoidDither );
+ drawOnPixmap( &pm );
+ lb->setPixmap( pm );
+}
+
+
+
+void GLObjectWindow::makePixmap()
+{
+ // Make a pixmap to to be rendered by the gl widget
+ TQPixmap pm;
+
+ // Render the pixmap, with either c1's size or the fixed size pmSz
+ if ( pmSz.isValid() )
+ pm = c1->renderPixmap( pmSz.width(), pmSz.height() );
+ else
+ pm = c1->renderPixmap();
+
+ if ( !pm.isNull() ) {
+ // Present the pixmap to the user
+ drawOnPixmap( &pm );
+ lb->setPixmap( pm );
+ }
+ else {
+ lb->setText( "Failed to render Pixmap." );
+ }
+}
+
+
+void GLObjectWindow::makePixmapHidden()
+{
+ // Make a TQGLWidget to draw the pixmap. This widget will not be shown.
+ GLBox* w = new GLBox( this, "temporary glwidget", c1 );
+
+ bool success = FALSE;
+ TQPixmap pm;
+
+ if ( w->isValid() ) {
+ // Set the current rotation
+ w->copyRotation( *c1 );
+
+ // Determine wanted pixmap size
+ TQSize sz = pmSz.isValid() ? pmSz : c1->size();
+
+ // Make our hidden glwidget render the pixmap
+ pm = w->renderPixmap( sz.width(), sz.height() );
+
+ if ( !pm.isNull() )
+ success = TRUE;
+ }
+
+ if ( success ) {
+ // Present the pixmap to the user
+ drawOnPixmap( &pm );
+ lb->setPixmap( pm );
+ }
+ else {
+ lb->setText( "Failed to render Pixmap." );
+ }
+ delete w;
+}
+
+
+void GLObjectWindow::drawOnPixmap( TQPixmap* pm )
+{
+ // Draw some text on the pixmap to differentiate it from the GL window
+
+ if ( pm->isNull() ) {
+ qWarning("Cannot draw on null pixmap");
+ return;
+ }
+ else {
+ TQPainter p( pm );
+ p.setFont( TQFont( "Helvetica", 18 ) );
+ p.setPen( white );
+ p.drawText( pm->rect(), AlignCenter, "This is a Pixmap" );
+ }
+}
+
+
+
+void GLObjectWindow::useFixedPixmapSize()
+{
+ if ( pmSz.isValid() ) {
+ pmSz = TQSize();
+ file->setItemChecked( fixMenuItemId, FALSE );
+ }
+ else {
+ pmSz = TQSize( 200, 200 );
+ file->setItemChecked( fixMenuItemId, TRUE );
+ }
+}
+
+
+void GLObjectWindow::makePixmapForMenu()
+{
+ TQPixmap pm = c1->renderPixmap( 32, 32 );
+ if ( !pm.isNull() )
+ file->changeItem( pm, "Insert Pixmap Here", insertMenuItemId );
+}
diff --git a/examples/opengl/glpixmap/globjwin.h b/examples/opengl/glpixmap/globjwin.h
new file mode 100644
index 000000000..b02ed67eb
--- /dev/null
+++ b/examples/opengl/glpixmap/globjwin.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** The GLObjectWindow contains a GLBox and three sliders connected to
+** the GLBox's rotation slots.
+**
+****************************************************************************/
+
+#ifndef GLOBJWIN_H
+#define GLOBJWIN_H
+
+#include <qwidget.h>
+
+class GLBox;
+class TQLabel;
+class TQPopupMenu;
+
+class GLObjectWindow : public TQWidget
+{
+ Q_OBJECT
+public:
+ GLObjectWindow( TQWidget* parent = 0, const char* name = 0 );
+
+protected slots:
+
+ void grabFrameBuffer();
+ void makePixmap();
+ void makePixmapHidden();
+ void makePixmapForMenu();
+ void useFixedPixmapSize();
+
+private:
+ void drawOnPixmap( TQPixmap* pm );
+ GLBox* c1;
+ TQLabel* lb;
+ int fixMenuItemId;
+ int insertMenuItemId;
+ TQSize pmSz;
+ TQPopupMenu* file;
+};
+
+
+#endif // GLOBJWIN_H
diff --git a/examples/opengl/glpixmap/glpixmap.doc b/examples/opengl/glpixmap/glpixmap.doc
new file mode 100644
index 000000000..840607682
--- /dev/null
+++ b/examples/opengl/glpixmap/glpixmap.doc
@@ -0,0 +1,14 @@
+/*! \page opengl-pixmap-example.html
+
+ \ingroup opengl-examples
+ \title OpenGL Pixmap Example
+
+This example program is an extension of the \link
+opengl-box-example.html OpenGL Box example\endlink.
+
+It demonstrates how to render OpenGL into a QPixmap.
+
+See \c{$QTDIR/examples/opengl/glpixmap} for the source code.
+
+*/
+
diff --git a/examples/opengl/glpixmap/glpixmap.pro b/examples/opengl/glpixmap/glpixmap.pro
new file mode 100644
index 000000000..597f94c2f
--- /dev/null
+++ b/examples/opengl/glpixmap/glpixmap.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+TARGET = glpixmap
+
+CONFIG += qt opengl warn_on release
+CONFIG -= dlopen_opengl
+!mac:unix:LIBS += -lm
+DEPENDPATH = ../include
+
+REQUIRES = opengl
+
+HEADERS = glbox.h \
+ globjwin.h
+SOURCES = glbox.cpp \
+ globjwin.cpp \
+ main.cpp
diff --git a/examples/opengl/glpixmap/main.cpp b/examples/opengl/glpixmap/main.cpp
new file mode 100644
index 000000000..13e474007
--- /dev/null
+++ b/examples/opengl/glpixmap/main.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// TQt OpenGL example: Shared Box
+//
+// A small example showing how to use OpenGL display list sharing
+//
+// File: main.cpp
+//
+// The main() function
+//
+
+#include "globjwin.h"
+#include <qapplication.h>
+#include <qgl.h>
+
+/*
+ The main program is here.
+*/
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a(argc,argv);
+
+ if ( !TQGLFormat::hasOpenGL() ) {
+ qWarning( "This system has no OpenGL support. Exiting." );
+ return -1;
+ }
+
+ GLObjectWindow w;
+ w.resize( 550, 350 );
+ a.setMainWidget( &w );
+ w.show();
+ return a.exec();
+}
diff --git a/examples/opengl/overlay/README b/examples/opengl/overlay/README
new file mode 100644
index 000000000..f08e539d2
--- /dev/null
+++ b/examples/opengl/overlay/README
@@ -0,0 +1,9 @@
+
+The overlay example
+
+This example program shows how to use OpenGL overlays with the Qt OpenGL
+Extension. It contains a QGLWidget with a relatively expensive
+redrawing operation, and rubber-band drawing in the overlay plane.
+Using the overlay has the advantage that the rubber-band may be drawn
+and erased without damaging the image in the main plane, so costly
+redraws are avoided.
diff --git a/examples/opengl/overlay/globjwin.cpp b/examples/opengl/overlay/globjwin.cpp
new file mode 100644
index 000000000..fd5545512
--- /dev/null
+++ b/examples/opengl/overlay/globjwin.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qlayout.h>
+#include <qframe.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include "globjwin.h"
+#include "glteapots.h"
+
+
+GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name )
+ : TQWidget( parent, name )
+{
+ // Create a menu
+ TQPopupMenu *file = new TQPopupMenu( this );
+ file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ // Create a menu bar
+ TQMenuBar *m = new TQMenuBar( this );
+ m->setSeparator( TQMenuBar::InWindowsStyle );
+ m->insertItem("&File", file );
+
+ // Create a nice frame to put around the OpenGL widget
+ TQFrame* f = new TQFrame( this, "frame" );
+ f->setFrameStyle( TQFrame::Sunken | TQFrame::Panel );
+ f->setLineWidth( 2 );
+
+ // Create our OpenGL widget.
+ GLTeapots* c = new GLTeapots( f, "glteapots" );
+
+ // Check if we obtained an overlay
+ if ( !c->format().hasOverlay() ) {
+ TQMessageBox::warning( 0, qApp->argv()[0],
+ "Failed to get an OpenGL overlay",
+ "OK" );
+ }
+
+ // Now that we have all the widgets, put them into a nice layout
+
+ // Put the GL widget inside the frame
+ TQHBoxLayout* flayout = new TQHBoxLayout( f, 2, 2, "flayout");
+ flayout->addWidget( c, 1 );
+
+ // Top level layout
+ TQVBoxLayout* hlayout = new TQVBoxLayout( this, 20, 20, "hlayout");
+ hlayout->setMenuBar( m );
+ hlayout->addWidget( f, 1 );
+}
diff --git a/examples/opengl/overlay/globjwin.h b/examples/opengl/overlay/globjwin.h
new file mode 100644
index 000000000..ede00a35c
--- /dev/null
+++ b/examples/opengl/overlay/globjwin.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** The GLObjectWindow contains a GLBox and three sliders connected to
+** the GLBox's rotation slots.
+**
+****************************************************************************/
+
+#ifndef GLOBJWIN_H
+#define GLOBJWIN_H
+
+#include <qwidget.h>
+
+
+class GLObjectWindow : public TQWidget
+{
+ Q_OBJECT
+public:
+ GLObjectWindow( TQWidget* parent = 0, const char* name = 0 );
+
+
+};
+
+
+#endif // GLOBJWIN_H
diff --git a/examples/opengl/overlay/glteapots.cpp b/examples/opengl/overlay/glteapots.cpp
new file mode 100644
index 000000000..7aff716de
--- /dev/null
+++ b/examples/opengl/overlay/glteapots.cpp
@@ -0,0 +1,457 @@
+/****************************************************************************
+**
+** Implementation of GLTeapots
+** This is a TQGLWidget displaying a group of teapots and a rubber-band
+** in an overlay plane
+**
+** The OpenGL code in this example is mostly borrowed from the "teapots"
+** example program in the "OpenGL Programming Guide", by Jackie Neider,
+** Tom Davis, and Mason Woo, Addison Wesley 1993.
+** It can be obtained from ftp.sgi.com and contains the following copyright
+** notice:
+
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSETQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+
+****************************************************************************/
+
+#include "glteapots.h"
+#include <qapplication.h>
+
+#if defined(Q_CC_MSVC)
+#pragma warning(disable:4305) // init: truncation from const double to float
+#endif
+
+/*!
+ Create a GLTeapots widget.
+
+ Specifies the following frame buffer retquirements to the TQGLWidget
+ constructor:
+ <ul>
+ <li> HasOverlay - we want an overlay context to draw the rubber-band in
+ <li> SingleBuffer - makes the drawing process of the teapots visible
+ </ul>
+*/
+
+
+GLTeapots::GLTeapots( TQWidget* parent, const char* name )
+ : TQGLWidget( TQGLFormat( TQGL::SingleBuffer | TQGL::HasOverlay ),
+ parent, name )
+{
+ teapotList = 0;
+ rubberOn = FALSE;
+}
+
+/*!
+ Release allocated resources
+*/
+
+GLTeapots::~GLTeapots()
+{
+ makeCurrent();
+ glDeleteLists( teapotList, 1 );
+}
+
+
+/*!
+ Do the main plane painting: a set of teapots.
+*/
+
+void GLTeapots::paintGL()
+{
+ TQApplication::setOverrideCursor( waitCursor ); // Since it takes some time
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ renderTeapot( 2.0, 17.0, 0.0215, 0.1745, 0.0215,
+ 0.07568, 0.61424, 0.07568,
+ 0.633, 0.727811, 0.633, 0.6 );
+ renderTeapot( 2.0, 14.0, 0.135, 0.2225, 0.1575,
+ 0.54, 0.89, 0.63, 0.316228,
+ 0.316228, 0.316228, 0.1 );
+ renderTeapot( 2.0, 11.0, 0.05375, 0.05, 0.06625,
+ 0.18275, 0.17, 0.22525,
+ 0.332741, 0.328634, 0.346435, 0.3 );
+ renderTeapot( 2.0, 8.0, 0.25, 0.20725, 0.20725,
+ 1, 0.829, 0.829, 0.296648,
+ 0.296648, 0.296648, 0.088 );
+ renderTeapot( 2.0, 5.0, 0.1745, 0.01175, 0.01175,
+ 0.61424, 0.04136, 0.04136,
+ 0.727811, 0.626959, 0.626959, 0.6);
+ renderTeapot( 2.0, 2.0, 0.1, 0.18725, 0.1745,
+ 0.396, 0.74151, 0.69102,
+ 0.297254, 0.30829, 0.306678, 0.1 );
+
+ renderTeapot( 6.0, 17.0, 0.329412, 0.223529, 0.027451,
+ 0.780392, 0.568627, 0.113725,
+ 0.992157, 0.941176, 0.807843, 0.21794872 );
+ renderTeapot( 6.0, 14.0, 0.2125, 0.1275, 0.054,
+ 0.714, 0.4284, 0.18144,
+ 0.393548, 0.271906, 0.166721, 0.2 );
+ renderTeapot( 6.0, 11.0, 0.25, 0.25, 0.25,
+ 0.4, 0.4, 0.4,
+ 0.774597, 0.774597, 0.774597, 0.6 );
+ renderTeapot( 6.0, 8.0, 0.19125, 0.0735, 0.0225,
+ 0.7038, 0.27048, 0.0828,
+ 0.256777, 0.137622, 0.086014, 0.1 );
+ renderTeapot( 6.0, 5.0, 0.24725, 0.1995, 0.0745,
+ 0.75164, 0.60648, 0.22648,
+ 0.628281, 0.555802, 0.366065, 0.4 );
+ renderTeapot( 6.0, 2.0, 0.19225, 0.19225, 0.19225,
+ 0.50754, 0.50754, 0.50754,
+ 0.508273, 0.508273, 0.508273, 0.4 );
+
+ renderTeapot( 10.0, 17.0, 0.0, 0.0, 0.0,
+ 0.01, 0.01, 0.01,
+ 0.50, 0.50, 0.50, .25 );
+ renderTeapot( 10.0, 14.0, 0.0, 0.1, 0.06,
+ 0.0, 0.50980392, 0.50980392,
+ 0.50196078, 0.50196078, 0.50196078, .25 );
+ renderTeapot( 10.0, 11.0, 0.0, 0.0, 0.0,
+ 0.1, 0.35, 0.1,
+ 0.45, 0.55, 0.45, .25 );
+ renderTeapot( 10.0, 8.0, 0.0, 0.0, 0.0,
+ 0.5, 0.0, 0.0,
+ 0.7, 0.6, 0.6, .25 );
+ renderTeapot( 10.0, 5.0, 0.0, 0.0, 0.0,
+ 0.55, 0.55, 0.55,
+ 0.70, 0.70, 0.70, .25 );
+ renderTeapot( 10.0, 2.0, 0.0, 0.0, 0.0,
+ 0.5, 0.5, 0.0,
+ 0.60, 0.60, 0.50, .25 );
+
+ renderTeapot( 14.0, 17.0, 0.02, 0.02, 0.02,
+ 0.01, 0.01, 0.01,
+ 0.4, 0.4, 0.4, .078125 );
+ renderTeapot( 14.0, 14.0, 0.0, 0.05, 0.05,
+ 0.4, 0.5, 0.5,
+ 0.04, 0.7, 0.7, .078125 );
+ renderTeapot( 14.0, 11.0, 0.0, 0.05, 0.0,
+ 0.4, 0.5, 0.4,
+ 0.04, 0.7, 0.04, .078125 );
+ renderTeapot( 14.0, 8.0, 0.05, 0.0, 0.0,
+ 0.5, 0.4, 0.4,
+ 0.7, 0.04, 0.04, .078125 );
+ renderTeapot( 14.0, 5.0, 0.05, 0.05, 0.05,
+ 0.5, 0.5, 0.5,
+ 0.7, 0.7, 0.7, .078125 );
+ renderTeapot( 14.0, 2.0, 0.05, 0.05, 0.0,
+ 0.5, 0.5, 0.4,
+ 0.7, 0.7, 0.04, .078125 );
+
+ // May add a glFinish() here to make sure the GL rendering has finished
+ // before the mouse cursor is reset from "waiting" to normal.
+ TQApplication::restoreOverrideCursor();
+}
+
+
+/*!
+ Set up the OpenGL rendering state of the main plane
+*/
+
+void GLTeapots::initializeGL()
+{
+ GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+ GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+ GLfloat position[] = { 0.0, 3.0, 3.0, 0.0 };
+
+ GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
+ GLfloat local_view[] = { 0.0 };
+
+ glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );
+ glLightfv( GL_LIGHT0, GL_POSITION, position );
+ glLightModelfv( GL_LIGHT_MODEL_AMBIENT, lmodel_ambient );
+ glLightModelfv( GL_LIGHT_MODEL_LOCAL_VIEWER, local_view );
+
+ glFrontFace( GL_CW );
+ glEnable( GL_LIGHTING );
+ glEnable( GL_LIGHT0 );
+ glEnable( GL_AUTO_NORMAL );
+ glEnable( GL_NORMALIZE );
+ glEnable( GL_DEPTH_TEST );
+ glDepthFunc( GL_LESS );
+}
+
+
+
+/*!
+ Set up the main plane's view port, matrix mode, etc. suitably for
+ viewing the teapots.
+*/
+
+void GLTeapots::resizeGL( int w, int h )
+{
+ glViewport(0, 0, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if ( w <= h )
+ glOrtho( 0.0, 20.0, 0.0, 20.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0 );
+ else
+ glOrtho( 0.0, 20.0*(GLfloat)w/(GLfloat)h, 0.0, 20.0, -10.0, 10.0 );
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+/*!
+ Set up the OpenGL rendering state of the overlay plane
+*/
+
+void GLTeapots::initializeOverlayGL()
+{
+ glLineWidth( 2 );
+ glLineStipple( 3, 0xAAAA );
+ glEnable( GL_LINE_STIPPLE );
+}
+
+
+/*!
+ Do the overlay plane painting: a rubber-band (if the user has
+ dragged out one).
+
+*/
+
+void GLTeapots::paintOverlayGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT );
+ if ( rubberOn ) {
+ qglColor( TQColor( 255, 255, 0 ) );
+ glBegin( GL_LINE_LOOP );
+ glVertex2i( rubberP1.x(), rubberP1.y() );
+ glVertex2i( rubberP2.x(), rubberP1.y() );
+ glVertex2i( rubberP2.x(), rubberP2.y() );
+ glVertex2i( rubberP1.x(), rubberP2.y() );
+ glEnd();
+ }
+}
+
+
+/*!
+ Set up the overlay plane's view port, matrix mode, etc. suitably for
+ viewing the rubber-band.
+*/
+
+void GLTeapots::resizeOverlayGL( int w, int h )
+{
+ glViewport( 0, 0, w, h );
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D( 0, w, h, 0 );
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+/*!
+ User presses a mouse button: start pulling out a rubber-band rectangle
+*/
+
+// We do a simple rubber-band drawing here; erasing the whole overlay
+// plane for each repaint. For less flickering of the rubber-band
+// itself, we could remember the coordinates of the last rectangle
+// drawn, and then erase only that by painting it again with
+// transparent color.
+
+void GLTeapots::mousePressEvent( TQMouseEvent* e )
+{
+ rubberP1 = e->pos();
+ rubberP2 = rubberP1;
+ rubberOn = TRUE;
+}
+
+/*!
+ User drags the mouse: Update the rubber-band coordinates and repaint
+ the overlay.
+*/
+
+void GLTeapots::mouseMoveEvent( TQMouseEvent* e )
+{
+ if ( rubberOn ) {
+ rubberP2 = e->pos();
+ updateOverlayGL();
+ }
+}
+
+/*!
+ User releases the mouse button: remove the rubber-band.
+*/
+
+void GLTeapots::mouseReleaseEvent( TQMouseEvent* )
+{
+ if ( rubberOn ) {
+ rubberOn = FALSE;
+ updateOverlayGL();
+ }
+}
+
+
+/*!
+ Renders a teapot with the given material properties
+*/
+
+void GLTeapots::renderTeapot( GLfloat x, GLfloat y, GLfloat ambr,
+ GLfloat ambg, GLfloat ambb, GLfloat difr,
+ GLfloat difg, GLfloat difb,
+ GLfloat specr, GLfloat specg,
+ GLfloat specb, GLfloat shine )
+{
+ float mat[4];
+
+ glPushMatrix();
+ glTranslatef (x, y, 0.0);
+ mat[0] = ambr; mat[1] = ambg; mat[2] = ambb; mat[3] = 1.0;
+ glMaterialfv (GL_FRONT, GL_AMBIENT, mat);
+ mat[0] = difr; mat[1] = difg; mat[2] = difb;
+ glMaterialfv (GL_FRONT, GL_DIFFUSE, mat);
+ mat[0] = specr; mat[1] = specg; mat[2] = specb;
+ glMaterialfv (GL_FRONT, GL_SPECULAR, mat);
+ glMaterialf (GL_FRONT, GL_SHININESS, shine*128.0);
+ teapot();
+ glPopMatrix();
+}
+
+
+/*!
+ Draw a classic OpenGL teapot
+*/
+
+void GLTeapots::teapot()
+{
+ static long patchdata[][16] = {
+ {102,103,104,105,4,5,6,7,8,9,10,11,12,13,14,15},
+ {12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27},
+ {24,25,26,27,29,30,31,32,33,34,35,36,37,38,39,40},
+ {96,96,96,96,97,98,99,100,101,101,101,101,0,1,2,3,},
+ {0,1,2,3,106,107,108,109,110,111,112,113,114,115,116,117},
+ {118,118,118,118,124,122,119,121,123,126,125,120,40,39,38,37},
+ {41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56},
+ {53,54,55,56,57,58,59,60,61,62,63,64,28,65,66,67},
+ {68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83},
+ {80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95}
+ };
+
+ static float cpdata[][3] = {
+ {0.2,0,2.7},{0.2,-0.112,2.7},{0.112,-0.2,2.7},{0,-0.2,2.7},
+ {1.3375,0,2.53125},{1.3375,-0.749,2.53125},{0.749,-1.3375,2.53125},
+ {0,-1.3375,2.53125},{1.4375,0,2.53125},{1.4375,-0.805,2.53125},
+ {0.805,-1.4375,2.53125},{0,-1.4375,2.53125},{1.5,0,2.4},
+ {1.5,-0.84,2.4},{0.84,-1.5,2.4},{0,-1.5,2.4},{1.75,0,1.875},
+ {1.75,-0.98,1.875},{0.98,-1.75,1.875},{0,-1.75,1.875},{2,0,1.35},
+ {2,-1.12,1.35},{1.12,-2,1.35},{0,-2,1.35},{2,0,0.9},{2,-1.12,0.9},
+ {1.12,-2,0.9},{0,-2,0.9},{-2,0,0.9},{2,0,0.45},{2,-1.12,0.45},
+ {1.12,-2,0.45},{0,-2,0.45},{1.5,0,0.225},{1.5,-0.84,0.225},
+ {0.84,-1.5,0.225},{0,-1.5,0.225},{1.5,0,0.15},{1.5,-0.84,0.15},
+ {0.84,-1.5,0.15},{0,-1.5,0.15},{-1.6,0,2.025},{-1.6,-0.3,2.025},
+ {-1.5,-0.3,2.25},{-1.5,0,2.25},{-2.3,0,2.025},{-2.3,-0.3,2.025},
+ {-2.5,-0.3,2.25},{-2.5,0,2.25},{-2.7,0,2.025},{-2.7,-0.3,2.025},
+ {-3,-0.3,2.25},{-3,0,2.25},{-2.7,0,1.8},{-2.7,-0.3,1.8},{-3,-0.3,1.8},
+ {-3,0,1.8},{-2.7,0,1.575},{-2.7,-0.3,1.575},{-3,-0.3,1.35},{-3,0,1.35},
+ {-2.5,0,1.125},{-2.5,-0.3,1.125},{-2.65,-0.3,0.9375},{-2.65,0,0.9375},
+ {-2,-0.3,0.9},{-1.9,-0.3,0.6},{-1.9,0,0.6},{1.7,0,1.425},
+ {1.7,-0.66,1.425},{1.7,-0.66,0.6},{1.7,0,0.6},{2.6,0,1.425},
+ {2.6,-0.66,1.425},{3.1,-0.66,0.825},{3.1,0,0.825},{2.3,0,2.1},
+ {2.3,-0.25,2.1},{2.4,-0.25,2.025},{2.4,0,2.025},{2.7,0,2.4},
+ {2.7,-0.25,2.4},{3.3,-0.25,2.4},{3.3,0,2.4},{2.8,0,2.475},
+ {2.8,-0.25,2.475},{3.525,-0.25,2.49375},{3.525,0,2.49375},
+ {2.9,0,2.475},{2.9,-0.15,2.475},{3.45,-0.15,2.5125},{3.45,0,2.5125},
+ {2.8,0,2.4},{2.8,-0.15,2.4},{3.2,-0.15,2.4},{3.2,0,2.4},{0,0,3.15},
+ {0.8,0,3.15},{0.8,-0.45,3.15},{0.45,-0.8,3.15},{0,-0.8,3.15},
+ {0,0,2.85},{1.4,0,2.4},{1.4,-0.784,2.4},{0.784,-1.4,2.4},{0,-1.4,2.4},
+ {0.4,0,2.55},{0.4,-0.224,2.55},{0.224,-0.4,2.55},{0,-0.4,2.55},
+ {1.3,0,2.55},{1.3,-0.728,2.55},{0.728,-1.3,2.55},{0,-1.3,2.55},
+ {1.3,0,2.4},{1.3,-0.728,2.4},{0.728,-1.3,2.4},{0,-1.3,2.4},{0,0,0},
+ {1.425,-0.798,0},{1.5,0,0.075},{1.425,0,0},{0.798,-1.425,0},
+ {0,-1.5,0.075},{0,-1.425,0},{1.5,-0.84,0.075},{0.84,-1.5,0.075}
+ };
+
+ static float tex[2][2][2] = {{{0, 0},{1, 0}},{{0, 1},{1, 1}}};
+
+ if ( !glIsList( teapotList ) ) {
+ float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
+ long grid = 14;
+
+ teapotList = glGenLists( 1 );
+ glNewList( teapotList, GL_COMPILE );
+ glPushMatrix();
+ glRotatef( 270.0, 1.0, 0.0, 0.0 );
+ glScalef( 0.5, 0.5, 0.5 );
+ glTranslatef( 0.0, 0.0, -1.5 );
+ for ( long i = 0; i < 10; i++ ) {
+ for ( long j = 0; j < 4; j++ ) {
+ for ( long k = 0; k < 4; k++ ) {
+ for ( long l = 0; l < 3; l++ ) {
+ p[j][k][l] = cpdata[patchdata[i][j*4+k]][l];
+ q[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l];
+ if ( l == 1 )
+ q[j][k][l] *= -1.0;
+ if ( i < 6 ) {
+ r[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l];
+ if ( l == 0 )
+ r[j][k][l] *= -1.0;
+ s[j][k][l] = cpdata[patchdata[i][j*4+k]][l];
+ if ( l == 0 )
+ s[j][k][l] *= -1.0;
+ if ( l == 1 )
+ s[j][k][l] *= -1.0;
+ }
+ }
+ }
+ }
+ glMap2f( GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2,
+ &tex[0][0][0] );
+ glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &p[0][0][0] );
+ glEnable( GL_MAP2_VERTEX_3);
+ glEnable(GL_MAP2_TEXTURE_COORD_2 );
+ glMapGrid2f( grid, 0.0, 1.0, grid, 0.0, 1.0 );
+ glEvalMesh2( GL_LINE, 0, grid, 0, grid );
+ glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &q[0][0][0] );
+ glEvalMesh2( GL_LINE, 0, grid, 0, grid );
+ if ( i < 6 ) {
+ glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &r[0][0][0]);
+ glEvalMesh2( GL_LINE, 0, grid, 0, grid );
+ glMap2f( GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &s[0][0][0] );
+ glEvalMesh2( GL_LINE, 0, grid, 0, grid );
+ }
+ }
+ glDisable(GL_MAP2_VERTEX_3);
+ glDisable(GL_MAP2_TEXTURE_COORD_2);
+ glPopMatrix();
+ glEndList();
+ }
+
+ glCallList( teapotList );
+}
diff --git a/examples/opengl/overlay/glteapots.h b/examples/opengl/overlay/glteapots.h
new file mode 100644
index 000000000..4fbec9b83
--- /dev/null
+++ b/examples/opengl/overlay/glteapots.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a TQGLWidget displaying a group of teapots and a rubber-band
+** in an overlay plane
+**
+****************************************************************************/
+
+#ifndef GLBOX_H
+#define GLBOX_H
+
+#include <qgl.h>
+
+
+class GLTeapots : public TQGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ GLTeapots( TQWidget* parent, const char* name );
+ ~GLTeapots();
+
+protected:
+
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ void initializeOverlayGL();
+ void paintOverlayGL();
+ void resizeOverlayGL( int w, int h );
+
+ void mousePressEvent( TQMouseEvent* e );
+ void mouseMoveEvent( TQMouseEvent* e );
+ void mouseReleaseEvent( TQMouseEvent* e );
+
+ void renderTeapot( GLfloat x, GLfloat y, GLfloat ambr,
+ GLfloat ambg, GLfloat ambb, GLfloat difr,
+ GLfloat difg, GLfloat difb,
+ GLfloat specr, GLfloat specg,
+ GLfloat specb, GLfloat shine );
+
+ void teapot();
+
+private:
+ GLuint teapotList;
+ TQPoint rubberP1;
+ TQPoint rubberP2;
+ bool rubberOn;
+};
+
+
+#endif // GLBOX_H
diff --git a/examples/opengl/overlay/main.cpp b/examples/opengl/overlay/main.cpp
new file mode 100644
index 000000000..3844704fd
--- /dev/null
+++ b/examples/opengl/overlay/main.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// TQt OpenGL example: Box
+//
+// A small example showing how a GLWidget can be used just as any TQt widget
+//
+// File: main.cpp
+//
+// The main() function
+//
+
+#include "globjwin.h"
+#include <qapplication.h>
+#include <qgl.h>
+#include <qmessagebox.h>
+
+/*
+ The main program is here.
+*/
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a(argc,argv);
+
+ if ( !TQGLFormat::hasOpenGL() ) {
+ qWarning( "This system has no OpenGL support. Exiting." );
+ return -1;
+ }
+
+ // Check for existence of overlays
+ if ( !TQGLFormat::hasOpenGLOverlays() ) {
+ TQMessageBox::critical( 0, qApp->argv()[0],
+ "This system does not support OpenGL overlays",
+ "Exit" );
+ return 1;
+ }
+
+ GLObjectWindow w;
+ w.resize( 400, 350 );
+ a.setMainWidget( &w );
+
+ w.show();
+ return a.exec();
+}
diff --git a/examples/opengl/overlay/overlay.doc b/examples/opengl/overlay/overlay.doc
new file mode 100644
index 000000000..7a10b3cbd
--- /dev/null
+++ b/examples/opengl/overlay/overlay.doc
@@ -0,0 +1,16 @@
+/*! \page opengl-overlay-example.html
+
+ \ingroup opengl-examples
+ \title OpenGL Overlay Example
+
+This example demonstrates how to use OpenGL overlays with the Qt OpenGL
+Extension. It features a QGLWidget with a relatively expensive redrawing
+operation, and rubber-band drawing in the overlay plane. Using the
+overlay has the advantage that the rubber-band may be drawn and erased
+without damaging the image in the main plane, so costly redraws are
+avoided.
+
+See \c{$QTDIR/examples/opengl/overlay} for the source code.
+
+*/
+
diff --git a/examples/opengl/overlay/overlay.pro b/examples/opengl/overlay/overlay.pro
new file mode 100644
index 000000000..bc0816515
--- /dev/null
+++ b/examples/opengl/overlay/overlay.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = overlay
+
+CONFIG += qt opengl warn_on release
+CONFIG -= dlopen_opengl
+DEPENDPATH = ../include
+
+REQUIRES = opengl
+
+HEADERS = glteapots.h \
+ globjwin.h
+SOURCES = glteapots.cpp \
+ globjwin.cpp \
+ main.cpp
diff --git a/examples/opengl/overlay_x11/README b/examples/opengl/overlay_x11/README
new file mode 100644
index 000000000..eba728e67
--- /dev/null
+++ b/examples/opengl/overlay_x11/README
@@ -0,0 +1,74 @@
+
+-----------------------------------------------------------------------
+UPDATE: From version 5.0 onwards, the Qt OpenGL Extension includes
+direct support for use of OpenGL overlays. For many uses of overlays,
+this makes the technique described below redundant. See the 'overlay'
+example program. The following is a discussion on how to use non-QGL
+widgets in overlay planes.
+-----------------------------------------------------------------------
+
+Overlayrubber: An example program showing how to use Qt and Qt OpenGL
+Extension with X11 overlay visuals.
+
+(Background information for this example can be found in the file
+ README.X11-OVERLAYS)
+
+The example program has three main parts:
+
+GearWidget: A simple QGLWidget that renders the usual gears. Modified
+so that it will print a debug message every time it redraws (renders)
+itself. Thus, you can eaily confirm that drawing in the overlay plane
+does not cause redrawings in the main plane where the QGLWidget
+resides.
+
+RubberbandWidget: Very simple standard (non-GL) Qt widget that
+implements rubberband drawing. Designed for use in an overlay
+plane. It takes the planes' transparent color as a constructor
+argument and uses that for its background color. Thus, the widget
+itself will be invisible, only the rubberbands it draws will be
+visible.
+
+main.cpp: Creates a GearWidget and a Rubberbandwidget and puts the
+latter on top of the former. Contains a routine that checks that the
+default visual is in an overlay plane, and returns the transparent
+color of that plane.
+
+
+Running it:
+-----------
+
+Start the overlayrubber executable. Click and drag with the left mouse
+button to see rubberband drawing. Observe that the QGLWidget does
+not redraw itself (no redraw debug messages are output), and yet the
+image is not destroyed. Marvel at the coolness of X11 overlays!
+
+
+Using this technique in a real application
+------------------------------------------
+
+For clarity, this example program has been kept very simple. Here are
+some hints for real application use:
+
+All normal widgets can go in the overlay plane: This means that you
+can put all kinds of Qt widgets (your own or those provided with Qt)
+on top of the OpenGL image (widget), e.g. pushbuttons etc., and they
+can be moved, resized, or removed without destroying the OpenGL image.
+
+Using with geometry management: The QLayout classes will not allow you
+to put one widget (the overlay) on top of another (the OpenGL widget);
+that would defy the whole purpose of the automatic layout. The
+solution is to add just one of them to the QLayout object. Have it
+keep a pointer to the other (i.e. the QGLWidget knows about its
+overlay widget or vice versa). Implement the resizeEvent() method of
+the widget you put in the layout, and make it call setGeometry() on
+the other widget with its own geometry as parameters, thus keeping the
+two widgets' geometries synchronized.
+
+Using with QPalette and QColorGroup: Instead of the somewhat
+simplistic setBackgroundColor( transparentColor ), you can use Qt's
+QPalette system for having your overlay widgets use transparent color
+for what you want. This way, the normal Qt widgets can be used as
+overlays for fancy effects: just create a palette for them with the
+transparent color for the wanted color roles, e.g. Background and
+Base, in the Normal and/or Active modes. This way, you can create
+see-through QPushButtons etc.
diff --git a/examples/opengl/overlay_x11/README.X11-OVERLAYS b/examples/opengl/overlay_x11/README.X11-OVERLAYS
new file mode 100644
index 000000000..6029ca3eb
--- /dev/null
+++ b/examples/opengl/overlay_x11/README.X11-OVERLAYS
@@ -0,0 +1,92 @@
+
+ HOW TO USE X11 OVERLAYS WITH THE QT OPENGL EXTENSION
+
+X11 overlays is a powerful mechanism that allows one to draw
+annotations etc. on top of an image without destroying it, thus saving
+significant image rendering time. For more information, consult the
+highly recommended book "OpenGL Programming for the X Window System"
+(Mark Kilgard, Addison Wesley Developers Press 1996).
+
+-----------------------------------------------------------------------
+UPDATE: From version 5.0 onwards, the Qt OpenGL Extension includes
+direct support for use of OpenGL overlays. For many uses of overlays,
+this makes the technique described below redundant. See the 'overlay'
+example program. The following is a discussion on how to use non-QGL
+widgets in overlay planes.
+-----------------------------------------------------------------------
+
+In the typical case, X11 overlays can easily be used together with the
+current version of Qt and the Qt OpenGL Extension. The following
+retquirements apply:
+
+1) Your X server and graphics card/hardware must support overlays (of
+ course). For many X servers, overlay support can be turned on with
+ a configuration option; consult your X server installation
+ documentation.
+
+2) Your X server must (be configured to) use an overlay visual as the
+ default visual. Most modern X servers do this, since this has the
+ added advantage that pop-up menus, overlapping windows etc. will
+ not destroy underlying images in the main plane, saving expensive
+ redraws.
+
+3) The best (deepest) visual for OpenGL rendering is in the main
+ plane. This is the normal case. Typically, X servers that support
+ overlays provide a 24 bit deep TrueColor visuals in the main plane,
+ and an 8 bit PseudoColor (default) visual in the overlay plane.
+
+The provided example program "overlayrubber" will check for all this
+and tell you what is wrong, if anything. See "About X11 Visuals" below
+for more information.
+
+
+How it works:
+-------------
+
+Given the above, a QGLWidget will by default use the main plane
+visual, while all other widgets will use the overlay visual. Thus, one
+can place a normal widget on top of the QGLWidget, and do drawing in
+it, without destroying the image in the OpenGL window. In other words,
+one can use all the drawing capabilities of QPainter to draw the
+annotations, rubberbands, whatever. For the typical use of overlays,
+this is much easier than using OpenGL for rendering the annotations.
+
+An overlay plane has a specific color called the transparent
+color. Pixels drawn in this color will not be visible, instead the
+underlying OpenGL image will show through. In the example program
+"overlayrubber", the file main.cpp contains a routine that returns a
+QColor containing the transparent color. For the overlay widget, one
+will typically want to set the background color to the transparent
+color, so that the OpenGL image shows through except where explicitly
+overpainted.
+
+Note: To use this technique, you must not use the "ManyColor" or
+"TrueColor" ColorSpec for the QApplication, because this will force
+the normal Qt widgets to use a TrueColor visual, which will typically
+be in the main plane, not in the overlay plane as desired.
+
+
+
+About X11 visuals:
+------------------
+
+The utilities directory contains two small programs that can help you
+determine the capabilities of your X server. These programs are from
+the OpenGL book mentioned above, see utilities/NOTICE for copyright
+information. The full set of example programs from this book is
+available at ftp://ftp.sgi.com/pub/opengl/opengl_for_x/
+
+"glxvisuals" will list all the GL-capable visuals the X server provides,
+together with the depth and other GL-specific information for
+each. Note especially the column "lvl"; a number in this column means
+the visual is in an overlay plane.
+
+"sovinfo" will list all available visuals, and provides special
+transparency information for overlay visuals.
+
+The overlayrubber example program will output what visual is used for
+the normal Qt widgets, and what visual is used by the QGLWidget.
+
+
+
+Comments are welcome at info@trolltech.com.
diff --git a/examples/opengl/overlay_x11/gearwidget.cpp b/examples/opengl/overlay_x11/gearwidget.cpp
new file mode 100644
index 000000000..4d717f27e
--- /dev/null
+++ b/examples/opengl/overlay_x11/gearwidget.cpp
@@ -0,0 +1,268 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// A TQt OpenGL widget that draws a gear.
+//
+// Portions of this code has been borrowed from Brian Paul's Mesa
+// distribution.
+//
+
+#include "gearwidget.h"
+#include <math.h>
+#if defined(Q_WS_X11)
+#include <X11/Xlib.h>
+#endif
+
+#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();
+
+}
+
+
+static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0;
+static GLint gear1, gear2, gear3;
+static GLfloat angle = 0.0;
+
+
+static void draw()
+{
+ angle += 2.0;
+ view_roty += 1.0;
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ 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();
+}
+
+
+
+GearWidget::GearWidget( TQWidget *parent, const char *name )
+ : TQGLWidget( parent, name )
+{
+}
+
+void GearWidget::initializeGL()
+{
+ static GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 };
+ static GLfloat redgear[4] = {0.8, 0.1, 0.0, 1.0 };
+ static GLfloat greengear[4] = {0.0, 0.8, 0.2, 1.0 };
+ static GLfloat bluegear[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, redgear );
+ 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, greengear );
+ 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, bluegear );
+ gear( 1.3, 2.0, 0.5, 10, 0.7 );
+ glEndList();
+
+ glEnable( GL_NORMALIZE );
+}
+
+
+void GearWidget::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 GearWidget::paintGL()
+{
+ qDebug( "GearWidget: Doing GL rendering." );
+#if defined (Q_GLX)
+ static bool doneIt = FALSE;
+ if ( !doneIt ) {
+ doneIt = TRUE;
+ // Print out the Visual ID. Access to this will be made
+ // simpler in future versions of TQt!
+ XWindowAttributes a;
+ XGetWindowAttributes( x11Display(), winId(), &a );
+ qDebug( "TQGLWidget: using Visual ID: 0x%x.",
+ (int)XVisualIDFromVisual( a.visual ) );
+ }
+#endif
+ draw();
+}
+
diff --git a/examples/opengl/overlay_x11/gearwidget.h b/examples/opengl/overlay_x11/gearwidget.h
new file mode 100644
index 000000000..6154e36da
--- /dev/null
+++ b/examples/opengl/overlay_x11/gearwidget.h
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Definition of a simple TQt OpenGL widget
+**
+** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef GEAR_H
+#define GEAR_H
+
+#include <qgl.h>
+
+class GearWidget : public TQGLWidget
+{
+public:
+ GearWidget( TQWidget *parent=0, const char *name=0 );
+
+protected:
+ void initializeGL();
+ void resizeGL( int, int );
+ void paintGL();
+};
+
+
+#endif
diff --git a/examples/opengl/overlay_x11/main.cpp b/examples/opengl/overlay_x11/main.cpp
new file mode 100644
index 000000000..70a6f4362
--- /dev/null
+++ b/examples/opengl/overlay_x11/main.cpp
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Example application showing how to use TQt and TQt OpenGL Extension on an
+** X11 overlay visual
+**
+** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "gearwidget.h"
+#include "rubberbandwidget.h"
+
+#if defined(Q_WS_X11)
+#include <X11/Xlib.h>
+#endif
+
+TQColor findOverlayTransparentColor()
+{
+ TQColor invalidColor;
+
+#if defined(Q_WS_X11)
+
+ Display* appDisplay;
+ Visual* appVisual;
+
+ // The static methods are called 'App' in TQt 2.x
+#if QT_VERSION < 200
+ appDisplay = TQPaintDevice::x__Display();
+ appVisual = (Visual*)TQPaintDevice::x11Visual();
+#else
+ appDisplay = TQPaintDevice::x11AppDisplay();
+ appVisual = (Visual*)TQPaintDevice::x11AppVisual();
+#endif
+
+ qDebug( "Default Visual ID: 0x%x", (int)XVisualIDFromVisual(appVisual) );
+
+ typedef struct OverlayProp {
+ long visual;
+ long type;
+ long value;
+ long layer;
+ } OverlayProp;
+
+ TQWidget* rootWin = TQApplication::desktop();
+ if ( !rootWin )
+ return invalidColor; // Should not happen
+
+ Atom overlayVisualsAtom = XInternAtom( appDisplay,
+ "SERVER_OVERLAY_VISUALS", True );
+ if ( overlayVisualsAtom == None ) {
+ warning( "Server has no overlay visuals" );
+ return invalidColor;
+ }
+
+ Atom actualType;
+ int actualFormat;
+ ulong nItems;
+ ulong bytesAfter;
+ OverlayProp* overlayProp;
+ int res = XGetWindowProperty( appDisplay, TQApplication::desktop()->winId(),
+ overlayVisualsAtom, 0, 10000, False,
+ overlayVisualsAtom, &actualType,
+ &actualFormat, &nItems, &bytesAfter,
+ (uchar**)&overlayProp );
+
+ if ( res != Success || actualType != overlayVisualsAtom
+ || actualFormat != 32 || nItems < 4 ) {
+ warning( "Failed to get overlay visual property from server" );
+ return invalidColor;
+ }
+
+
+ for ( uint i = 0; i < nItems/4; i++ ) {
+ if ( (VisualID)overlayProp[i].visual == XVisualIDFromVisual(appVisual)
+ && overlayProp[i].type == 1 )
+ return TQColor( qRgb( 1, 2, 3 ), overlayProp[i].value );
+ }
+
+ qWarning( "Default visual is not in overlay plane" );
+ return invalidColor;
+
+#else // defined(Q_WS_X11)
+ qWarning( "Wrong window system - Only X11 has overlay support." );
+ return invalidColor;
+#endif
+}
+
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a( argc, argv );
+
+ if ( !TQGLFormat::hasOpenGL() ) {
+ qWarning( "This system has no OpenGL support. Exiting." );
+ return -1;
+ }
+
+ TQColor transparentColor = findOverlayTransparentColor();
+ if ( !transparentColor.isValid() ) {
+ qWarning( "Failed to get transparent color for overlay. Exiting." );
+ return -1;
+ }
+
+ TQWidget top;
+ a.setMainWidget( &top );
+ top.setGeometry( 50, 50, 600, 400 );
+
+ // Make an OpenGL widget. It will use the deepest visual available
+ // (typically a TrueColor visual), which typically is in the normal layer.
+ GearWidget g( &top );
+ g.setGeometry( 20, 20, 560, 360 );
+
+ // Put the rubberband widget (which uses the default, i.e. overlay visual)
+ // on top of the OpenGL widget:
+ RubberbandWidget r( transparentColor, &top );
+ r.setGeometry( 20, 20, 560, 360 );
+
+ top.show();
+ return a.exec();
+}
diff --git a/examples/opengl/overlay_x11/overlay_x11.doc b/examples/opengl/overlay_x11/overlay_x11.doc
new file mode 100644
index 000000000..6dddc9b9b
--- /dev/null
+++ b/examples/opengl/overlay_x11/overlay_x11.doc
@@ -0,0 +1,82 @@
+/*! \page opengl-overlay-x11-example.html
+
+ \ingroup opengl-examples
+ \title OpenGL Overlay X11 Example
+
+\warning From version 5.0 onwards, the Qt OpenGL Extension includes
+direct support for use of OpenGL overlays. For many uses of overlays,
+this makes the technique described below redundant. See the \link
+opengl-overlay-example.html overlay\endlink example program. The
+following is a discussion on how to use non-QGL widgets in overlay
+planes.
+
+Overlayrubber: An example program showing how to use Qt and Qt OpenGL
+Extension with X11 overlay visuals.
+
+See \c{$QTDIR/examples/opengl/overlay_x11} for the source code.
+
+Background information for this example can be found in the
+information on \link opengl-x11-overlays.html overlays\endlink.
+
+The example program has three main parts:
+
+\list 1
+\i \e GearWidget - a normal, simple QGLWidget. This renders the usual
+gears. It has been modified to print a debug message every time it
+redraws (renders) itself. Thus, you can easily confirm that drawing in
+the overlay plane does not cause redrawings in the main plane where
+the QGLWidget resides.
+
+\i \e RubberbandWidget - Very simple standard (non-GL) Qt widget that
+implements rubberband drawing. Designed for use in an overlay plane.
+It takes the plane's transparent color as a constructor argument and
+uses that for its background color. Thus, the widget itself will be
+invisible, only the rubberbands it draws will be visible.
+
+\i \e{main.cpp} Creates a GearWidget and a Rubberbandwidget and puts the
+latter on top of the former. Contains a routine that checks that the
+default visual is in an overlay plane, and returns the transparent
+color of that plane.
+\endlist
+
+\section1 Running the Example
+
+Start the \c overlayrubber executable. Click and drag with the left
+mouse button to see rubberband drawing. Observe that the QGLWidget
+does not redraw itself (no redraw debug messages are output), and yet
+the image is not destroyed. Marvel at the coolness of X11 overlays!
+
+
+\section1 Using this technique in a real application
+
+For clarity, this example program has been kept very simple. Here are
+some hints for real application usage:
+
+\list
+
+\i \e{All normal widgets are in the overlay plane.} This means that you
+can put all kinds of Qt widgets (your own or standard Qt widgets) on
+top of the OpenGL image (widget), e.g. pushbuttons etc., and they can
+be moved, resized, or removed without destroying the OpenGL image.
+
+\i \e{Using with geometry management.} The QLayout classes don't permit
+putting one widget (the overlay) on top of another (the OpenGL
+widget); that would defy the whole purpose of the automatic layout.
+The solution is to add just one of them to the QLayout object. Have it
+keep a pointer to the other (i.e. the QGLWidget knows about its
+overlay widget or vice versa). Implement the resizeEvent() method of
+the widget you put in the layout, and make it call setGeometry() on
+the other widget with its own geometry as parameters, thus keeping the
+two widgets' geometries synchronized.
+
+\i \e{Using together with QPalette and QColorGroup.} Instead of the
+simplistic setBackgroundColor( transparentColor ), you can
+use Qt's QPalette system to make your overlay widgets use
+transparent color for what you want. This way, the normal Qt widgets
+can be used as overlays for fancy effects. Just create a palette for
+them with the transparent color for the relevant color roles, e.g.
+Background and Base, in the Normal and/or Active modes. This way, you
+can create see-through QPushButtons etc.
+\endlist
+
+*/
diff --git a/examples/opengl/overlay_x11/overlayrubber.pro b/examples/opengl/overlay_x11/overlayrubber.pro
new file mode 100644
index 000000000..5381ebb2e
--- /dev/null
+++ b/examples/opengl/overlay_x11/overlayrubber.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = overlayrubber
+
+CONFIG += qt opengl warn_on release
+CONFIG -= dlopen_opengl
+DEPENDPATH = ../include
+
+REQUIRES = opengl full-config
+
+HEADERS = gearwidget.h \
+ rubberbandwidget.h
+SOURCES = gearwidget.cpp \
+ main.cpp \
+ rubberbandwidget.cpp
diff --git a/examples/opengl/overlay_x11/rubberbandwidget.cpp b/examples/opengl/overlay_x11/rubberbandwidget.cpp
new file mode 100644
index 000000000..5cd5c5654
--- /dev/null
+++ b/examples/opengl/overlay_x11/rubberbandwidget.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Implementation of a widget that draws a rubberband. Designed to be used
+** in an X11 overlay visual
+**
+** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "rubberbandwidget.h"
+#include <qpainter.h>
+
+
+RubberbandWidget::RubberbandWidget( TQColor transparentColor, TQWidget *parent,
+ const char *name, WFlags f )
+ : TQWidget( parent, name, f )
+{
+ setBackgroundColor( transparentColor );
+ on = FALSE;
+}
+
+
+void RubberbandWidget::mousePressEvent( TQMouseEvent* e )
+{
+ p1 = e->pos();
+ p2 = p1;
+ p3 = p1;
+ on = TRUE;
+ setMouseTracking( TRUE );
+}
+
+
+void RubberbandWidget::mouseMoveEvent( TQMouseEvent* e )
+{
+ if ( on ) {
+ p2 = e->pos();
+ TQPainter p( this );
+ // Erase last drawn rubberband:
+ p.setPen( TQPen( backgroundColor(), 3 ) );
+ p.drawRect( TQRect( p1, p3 ) );
+ // Draw the new one:
+ p.setPen( TQPen( white, 3 ) );
+ p.drawRect( TQRect(p1, p2) );
+ p3 = p2;
+ }
+}
+
+void RubberbandWidget::mouseReleaseEvent( TQMouseEvent* )
+{
+ if ( on ) {
+ TQPainter p ( this );
+ p.eraseRect( rect() );
+ }
+ on = FALSE;
+ setMouseTracking( FALSE );
+}
diff --git a/examples/opengl/overlay_x11/rubberbandwidget.h b/examples/opengl/overlay_x11/rubberbandwidget.h
new file mode 100644
index 000000000..10513a6d6
--- /dev/null
+++ b/examples/opengl/overlay_x11/rubberbandwidget.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+**
+** Definition of a widget that draws a rubberband. Designed to be used
+** in an X11 overlay visual
+**
+** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef RUBBERBANDWIDGET_H
+#define RUBBERBANDWIDGET_H
+
+#include <qwidget.h>
+
+
+class RubberbandWidget : public TQWidget
+{
+public:
+ RubberbandWidget( TQColor transparentColor, TQWidget *parent=0,
+ const char *name=0, WFlags f=0 );
+
+protected:
+ void mousePressEvent( TQMouseEvent* e );
+ void mouseMoveEvent( TQMouseEvent* e );
+ void mouseReleaseEvent( TQMouseEvent* e );
+
+ TQColor c;
+ TQPoint p1;
+ TQPoint p2;
+ TQPoint p3;
+ bool on;
+};
+
+#endif
diff --git a/examples/opengl/overlay_x11/utilities/NOTICE b/examples/opengl/overlay_x11/utilities/NOTICE
new file mode 100644
index 000000000..4157392b3
--- /dev/null
+++ b/examples/opengl/overlay_x11/utilities/NOTICE
@@ -0,0 +1,11 @@
+
+NOTICE: This source code distribution contains source code contained
+in the book "Programming OpenGL for the X Window System" (ISBN:
+0-201-48359-9) published by Addison-Wesley. The programs and
+associated files contained in the distribution were developed by Mark
+J. Kilgard and are Copyright 1994, 1995, 1996 by Mark J. Kilgard
+(unless otherwise noted). The programs are not in the public domain,
+but they are freely distributable without licensing fees. These
+programs are provided without guarantee or warranty expressed or
+implied.
+
diff --git a/examples/opengl/overlay_x11/utilities/README b/examples/opengl/overlay_x11/utilities/README
new file mode 100644
index 000000000..d96f3437b
--- /dev/null
+++ b/examples/opengl/overlay_x11/utilities/README
@@ -0,0 +1,22 @@
+
+Welcome to the "Programming OpenGL for the X Window System" Xlib-based
+example source code. The following table names each example program
+directory and what section of the book discusses the example.
+
+Section Example directory
+---------- ------------------
+ 1.5 glxsimple
+ 2.1 glxdino
+ 2.2.2 glxvisuals
+ 2.6.1 pixmap2eps
+ 6.2.3.1 xdevices
+ 6.2.7 dials
+ 6.3.4 sovinfo
+ 6.3.5 layerdemo
+
+I've tried to make the Makefiles as simple and as portable as
+possible. If you find problems with these examples, please report bugs
+to mjk@sgi.com
+
+- Mark Kilgard
+
diff --git a/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c b/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c
new file mode 100644
index 000000000..3c1a21e68
--- /dev/null
+++ b/examples/opengl/overlay_x11/utilities/glxvisuals/glxvisuals.c
@@ -0,0 +1,147 @@
+
+/* Copyright (c) Mark J. Kilgard, 1996. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <GL/glx.h>
+
+static char *ClassOf(int c);
+static char *Format(int n, int w);
+
+void
+main(int argc, char *argv[])
+{
+ Display *dpy;
+ XVisualInfo match, *visualList, *vi, *visualToTry;
+ int errorBase, eventBase, major, minor, found;
+ int glxCapable, bufferSize, level, renderType, doubleBuffer, stereo,
+ auxBuffers, redSize, greenSize, blueSize, alphaSize, depthSize,
+ stencilSize, acRedSize, acGreenSize, acBlueSize, acAlphaSize;
+
+ dpy = XOpenDisplay(NULL);
+ if (!dpy) {
+ fprintf(stderr, "Could not connect to %s.\n", XDisplayName(NULL));
+ exit(1);
+ }
+ if (glXQueryExtension(dpy, &errorBase, &eventBase) == False) {
+ fprintf(stderr, "OpenGL not supported by X server.\n");
+ exit(1);
+ }
+
+ glXQueryVersion(dpy, &major, &minor);
+ printf("display: %s\n", XDisplayName(NULL));
+ printf("using GLX version: %d.%d\n\n", major, minor);
+
+ match.screen = DefaultScreen(dpy);
+ visualList = XGetVisualInfo(dpy, VisualScreenMask, &match, &found);
+
+ printf(" visual bf lv rg d st r g b a ax dp st accum buffs\n");
+ printf(" id dep cl sz l ci b ro sz sz sz sz bf th cl r g b a\n");
+ printf("-------------------------------------------------------------\n");
+
+ visualToTry = NULL;
+ for(vi = visualList; found > 0; found--, vi++) {
+ glXGetConfig(dpy, vi, GLX_USE_GL, &glxCapable);
+ if (glxCapable) {
+ printf("0x%x %2d %s", vi->visualid, vi->depth, ClassOf(vi->class));
+ glXGetConfig(dpy, vi, GLX_BUFFER_SIZE, &bufferSize);
+ glXGetConfig(dpy, vi, GLX_LEVEL, &level);
+ glXGetConfig(dpy, vi, GLX_RGBA, &renderType);
+ glXGetConfig(dpy, vi, GLX_DOUBLEBUFFER, &doubleBuffer);
+ glXGetConfig(dpy, vi, GLX_STEREO, &stereo);
+ glXGetConfig(dpy, vi, GLX_AUX_BUFFERS, &auxBuffers);
+ glXGetConfig(dpy, vi, GLX_RED_SIZE, &redSize);
+ glXGetConfig(dpy, vi, GLX_GREEN_SIZE, &greenSize);
+ glXGetConfig(dpy, vi, GLX_BLUE_SIZE, &blueSize);
+ glXGetConfig(dpy, vi, GLX_ALPHA_SIZE, &alphaSize);
+ glXGetConfig(dpy, vi, GLX_DEPTH_SIZE, &depthSize);
+ glXGetConfig(dpy, vi, GLX_STENCIL_SIZE, &stencilSize);
+ glXGetConfig(dpy, vi, GLX_ACCUM_RED_SIZE, &acRedSize);
+ glXGetConfig(dpy, vi, GLX_ACCUM_GREEN_SIZE, &acGreenSize);
+ glXGetConfig(dpy, vi, GLX_ACCUM_BLUE_SIZE, &acBlueSize);
+ glXGetConfig(dpy, vi, GLX_ACCUM_ALPHA_SIZE, &acAlphaSize);
+ printf(" %2s %2s %1s %1s %1s ",
+ Format(bufferSize, 2), Format(level, 2),
+ renderType ? "r" : "c",
+ doubleBuffer ? "y" : ".",
+ stereo ? "y" : ".");
+ printf("%2s %2s %2s %2s ",
+ Format(redSize, 2), Format(greenSize, 2),
+ Format(blueSize, 2), Format(alphaSize, 2));
+ printf("%2s %2s %2s %2s %2s %2s %2s",
+ Format(auxBuffers, 2), Format(depthSize, 2), Format(stencilSize, 2),
+ Format(acRedSize, 2), Format(acGreenSize, 2),
+ Format(acBlueSize, 2), Format(acAlphaSize, 2));
+ printf("\n");
+ visualToTry = vi;
+ }
+ }
+
+ if (visualToTry) {
+ GLXContext context;
+ Window window;
+ Colormap colormap;
+ XSetWindowAttributes swa;
+
+ context = glXCreateContext(dpy, visualToTry, 0, GL_TRUE);
+ colormap = XCreateColormap(dpy,
+ RootWindow(dpy, visualToTry->screen),
+ visualToTry->visual, AllocNone);
+ swa.colormap = colormap;
+ swa.border_pixel = 0;
+ window = XCreateWindow(dpy, RootWindow(dpy, visualToTry->screen), 0, 0, 100, 100,
+ 0, visualToTry->depth, InputOutput, visualToTry->visual,
+ CWBorderPixel | CWColormap, &swa);
+ glXMakeCurrent(dpy, window, context);
+ printf("\n");
+ printf("OpenGL vendor string: %s\n", glGetString(GL_VENDOR));
+ printf("OpenGL renderer string: %s\n", glGetString(GL_RENDERER));
+ printf("OpenGL version string: %s\n", glGetString(GL_VERSION));
+ if (glXIsDirect(dpy, context))
+ printf("direct rendering: supported\n");
+ printf( "GL extensions: '%s'\n\n", glGetString(GL_EXTENSIONS) );
+#if defined(GLX_VERSION_1_1)
+ printf( "GLX extensions: '%s'\n\n", glXQueryExtensionsString( dpy, visualToTry->screen ) );
+#endif
+
+ } else
+ printf("No GLX-capable visuals!\n");
+ XFree(visualList);
+}
+
+static char *
+ClassOf(int c)
+{
+ switch (c) {
+ case StaticGray: return "sg";
+ case GrayScale: return "gs";
+ case StaticColor: return "sc";
+ case PseudoColor: return "pc";
+ case TrueColor: return "tc";
+ case DirectColor: return "dc";
+ default: return "??";
+ }
+}
+
+static char *
+Format(int n, int w)
+{
+ static char buffer[256];
+ static int bufptr;
+ char *buf;
+
+ if (bufptr >= sizeof(buffer) - w)
+ bufptr = 0;
+ buf = buffer + bufptr;
+ if (n == 0)
+ sprintf(buf, "%*s", w, ".");
+ else
+ sprintf(buf, "%*d", w, n);
+ bufptr += w + 1;
+ return buf;
+}
diff --git a/examples/opengl/overlay_x11/utilities/sovinfo/sovLayerUtil.h b/examples/opengl/overlay_x11/utilities/sovinfo/sovLayerUtil.h
new file mode 100644
index 000000000..f45423a8d
--- /dev/null
+++ b/examples/opengl/overlay_x11/utilities/sovinfo/sovLayerUtil.h
@@ -0,0 +1,54 @@
+#ifndef __sovLayerUtil_h__
+#define __sovLayerUtil_h__
+
+/* Copyright (c) Mark J. Kilgard, 1996. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xmd.h>
+
+/* Transparent type values */
+/* None 0 */
+#define TransparentPixel 1
+#define TransparentMask 2
+
+/* layered visual info template flags */
+#define VisualLayerMask 0x200
+#define VisualTransparentType 0x400
+#define VisualTransparentValue 0x800
+#define VisualAllLayerMask 0xFFF
+
+/* layered visual info structure */
+typedef struct _sovVisualInfo {
+ XVisualInfo vinfo;
+ int layer;
+ int type;
+ unsigned long value;
+} sovVisualInfo;
+
+/* SERVER_OVERLAY_VISUALS property element */
+typedef struct _sovOverlayInfo {
+ long overlay_visual;
+ long transparent_type;
+ long value;
+ long layer;
+} sovOverlayInfo;
+
+extern sovVisualInfo *sovGetVisualInfo(
+ Display *display,
+ long lvinfo_mask,
+ sovVisualInfo *lvinfo_template,
+ int *nitems_return);
+extern Status sovMatchVisualInfo(
+ Display *display,
+ int screen,
+ int depth,
+ int class,
+ int layer,
+ sovVisualInfo *lvinfo_return);
+
+#endif /* __sovLayerUtil_h__ */
diff --git a/examples/opengl/overlay_x11/utilities/sovinfo/sovinfo.c b/examples/opengl/overlay_x11/utilities/sovinfo/sovinfo.c
new file mode 100644
index 000000000..059050c2f
--- /dev/null
+++ b/examples/opengl/overlay_x11/utilities/sovinfo/sovinfo.c
@@ -0,0 +1,95 @@
+
+/* Copyright (c) Mark J. Kilgard, 1996. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* compile: cc -o sovinfo sovinfo.c sovLayerUtil.c -lX11 */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "sovLayerUtil.h"
+
+int
+main(int argc, char *argv[])
+{
+ Display *dpy;
+ char *display_name, *arg, *class;
+ sovVisualInfo template, *lvinfo;
+ int nVisuals, i, overlaysOnly = 0;
+
+ display_name = NULL;
+ for (i = 1; i < argc; i++) {
+ arg = argv[i];
+ if (!strcmp(arg, "-display")) {
+ if (++i >= argc) {
+ fprintf(stderr, "sovinfo: missing argument to -display\n");
+ exit(1);
+ }
+ display_name = argv[i];
+ } else if (!strcmp(arg, "-overlays_only")) {
+ overlaysOnly = 1;
+ } else {
+ fprintf(stderr,
+ "usage: sovinfo [-display dpy] [-overlays_only]\n");
+ exit(1);
+ }
+ }
+ dpy = XOpenDisplay(display_name);
+ if (dpy == NULL) {
+ fprintf(stderr, "sovinfo: cannot open display %s\n",
+ XDisplayName(NULL));
+ exit(1);
+ }
+ lvinfo = sovGetVisualInfo(dpy, 0L, &template, &nVisuals);
+ for (i = 0; i < nVisuals; i++) {
+ if (!overlaysOnly || lvinfo[i].layer > 0) {
+ printf(" Visual ID: 0x%x\n", lvinfo[i].vinfo.visualid);
+ printf(" screen: %d\n", lvinfo[i].vinfo.screen);
+ printf(" depth: %d\n", lvinfo[i].vinfo.depth);
+ switch (lvinfo[i].vinfo.class) {
+ case StaticGray:
+ class = "StaticGray";
+ break;
+ case GrayScale:
+ class = "GrayScale";
+ break;
+ case StaticColor:
+ class = "StaticColor";
+ break;
+ case PseudoColor:
+ class = "PseudoColor";
+ break;
+ case TrueColor:
+ class = "TrueColor";
+ break;
+ case DirectColor:
+ class = "DirectColor";
+ break;
+ default:
+ class = "Unknown";
+ break;
+ }
+ printf(" class: %s\n", class);
+ switch (lvinfo[i].type) {
+ case None:
+ printf(" transparent type: None\n");
+ break;
+ case TransparentPixel:
+ printf(" transparent type: TransparentPixel\n");
+ printf(" pixel value: %d\n", lvinfo[i].value);
+ break;
+ case TransparentMask:
+ printf(" transparent type: TransparentMask\n");
+ printf(" transparency mask: %0x%x\n", lvinfo[i].value);
+ break;
+ default:
+ printf(" transparent type: Unknown or invalid\n");
+ break;
+ }
+ printf(" layer: %d\n", lvinfo[i].layer);
+ }
+ }
+ return 0;
+}
diff --git a/examples/opengl/overlay_x11/utilities/sovinfo/sovlayerutil.c b/examples/opengl/overlay_x11/utilities/sovinfo/sovlayerutil.c
new file mode 100644
index 000000000..8837d06cf
--- /dev/null
+++ b/examples/opengl/overlay_x11/utilities/sovinfo/sovlayerutil.c
@@ -0,0 +1,150 @@
+
+/* Copyright (c) Mark J. Kilgard, 1996. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+#include "sovLayerUtil.h"
+
+static Bool layersRead;
+static Atom overlayVisualsAtom;
+static sovOverlayInfo **overlayInfoPerScreen;
+static int *numOverlaysPerScreen;
+
+sovVisualInfo *
+sovGetVisualInfo(Display *display, long lvinfo_mask,
+ sovVisualInfo *lvinfo_template, int *nitems_return)
+{
+ XVisualInfo *vinfo;
+ sovVisualInfo *layerInfo;
+ Window root;
+ Status status;
+ Atom actualType;
+ unsigned long sizeData, bytesLeft;
+ int actualFormat, numVisuals, numScreens, count, i, j;
+
+ vinfo = XGetVisualInfo(display, lvinfo_mask & VisualAllMask,
+ &lvinfo_template->vinfo, nitems_return);
+ if (vinfo == NULL)
+ return NULL;
+ numVisuals = *nitems_return;
+ if (layersRead == False) {
+ overlayVisualsAtom = XInternAtom(display,
+ "SERVER_OVERLAY_VISUALS", True);
+ if (overlayVisualsAtom != None) {
+ numScreens = ScreenCount(display);
+ overlayInfoPerScreen = (sovOverlayInfo **)
+ malloc(numScreens * sizeof(sovOverlayInfo *));
+ numOverlaysPerScreen = (int *) malloc(numScreens * sizeof(int));
+ if (overlayInfoPerScreen != NULL &&
+ numOverlaysPerScreen != NULL) {
+ for (i = 0; i < numScreens; i++) {
+ root = RootWindow(display, i);
+ status = XGetWindowProperty(display, root, overlayVisualsAtom,
+ 0L, (long) 10000, False, overlayVisualsAtom,
+ &actualType, &actualFormat,
+ &sizeData, &bytesLeft,
+ (unsigned char **) &overlayInfoPerScreen[i]);
+ if (status != Success ||
+ actualType != overlayVisualsAtom ||
+ actualFormat != 32 || sizeData < 4)
+ numOverlaysPerScreen[i] = 0;
+ else
+ numOverlaysPerScreen[i] = sizeData / 4;
+ }
+ layersRead = True;
+ } else {
+ if (overlayInfoPerScreen != NULL)
+ free(overlayInfoPerScreen);
+ if (numOverlaysPerScreen != NULL)
+ free(numOverlaysPerScreen);
+ }
+ }
+ }
+ layerInfo = (sovVisualInfo *)
+ malloc(numVisuals * sizeof(sovVisualInfo));
+ if (layerInfo == NULL) {
+ XFree(vinfo);
+ return NULL;
+ }
+ count = 0;
+ for (i = 0; i < numVisuals; i++) {
+ XVisualInfo *pVinfo;
+ int screen;
+ sovOverlayInfo *overlayInfo;
+
+ pVinfo = &vinfo[i];
+ screen = pVinfo->screen;
+ overlayInfo = NULL;
+ if (layersRead) {
+ for (j = 0; j < numOverlaysPerScreen[screen]; j++)
+ if (pVinfo->visualid ==
+ overlayInfoPerScreen[screen][j].overlay_visual) {
+ overlayInfo = &overlayInfoPerScreen[screen][j];
+ break;
+ }
+ }
+ if (lvinfo_mask & VisualLayerMask)
+ if (overlayInfo == NULL) {
+ if (lvinfo_template->layer != 0)
+ continue;
+ } else if (lvinfo_template->layer != overlayInfo->layer)
+ continue;
+ if (lvinfo_mask & VisualTransparentType)
+ if (overlayInfo == NULL) {
+ if (lvinfo_template->type != None)
+ continue;
+ } else if (lvinfo_template->type !=
+ overlayInfo->transparent_type)
+ continue;
+ if (lvinfo_mask & VisualTransparentValue)
+ if (overlayInfo == NULL)
+ /* non-overlay visuals have no sense of
+ TransparentValue */
+ continue;
+ else if (lvinfo_template->value != overlayInfo->value)
+ continue;
+ layerInfo[count].vinfo = *pVinfo;
+ if (overlayInfo == NULL) {
+ layerInfo[count].layer = 0;
+ layerInfo[count].type = None;
+ layerInfo[count].value = 0; /* meaningless */
+ } else {
+ layerInfo[count].layer = overlayInfo->layer;
+ layerInfo[count].type = overlayInfo->transparent_type;
+ layerInfo[count].value = overlayInfo->value;
+ }
+ count++;
+ }
+ XFree(vinfo);
+ *nitems_return = count;
+ if (count == 0) {
+ XFree(layerInfo);
+ return NULL;
+ } else
+ return layerInfo;
+}
+
+Status
+sovMatchVisualInfo(Display *display, int screen,
+ int depth, int class, int layer, sovVisualInfo *lvinfo_return)
+{
+ sovVisualInfo *lvinfo;
+ sovVisualInfo lvinfoTemplate;
+ int nitems;
+
+ lvinfoTemplate.vinfo.screen = screen;
+ lvinfoTemplate.vinfo.depth = depth;
+ lvinfoTemplate.vinfo.class = class;
+ lvinfoTemplate.layer = layer;
+ lvinfo = sovGetVisualInfo(display,
+ VisualScreenMask|VisualDepthMask|VisualClassMask|VisualLayerMask,
+ &lvinfoTemplate, &nitems);
+ if (lvinfo != NULL && nitems > 0) {
+ *lvinfo_return = *lvinfo;
+ return 1;
+ } else
+ return 0;
+}
diff --git a/examples/opengl/sharedbox/README b/examples/opengl/sharedbox/README
new file mode 100644
index 000000000..4959294d5
--- /dev/null
+++ b/examples/opengl/sharedbox/README
@@ -0,0 +1,8 @@
+
+The shared box example
+
+This example program is an extension of the "box" example program.
+
+It demonstrates how to use OpenGL display list sharing with QGLWidgets.
+
+
diff --git a/examples/opengl/sharedbox/glbox.cpp b/examples/opengl/sharedbox/glbox.cpp
new file mode 100644
index 000000000..f3ded8888
--- /dev/null
+++ b/examples/opengl/sharedbox/glbox.cpp
@@ -0,0 +1,211 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying a box
+**
+** The OpenGL code is mostly borrowed from Brian Pauls "spin" example
+** in the Mesa distribution
+**
+****************************************************************************/
+
+#include "glbox.h"
+
+// Initialize static class variables:
+
+// Shared display list id:
+GLuint GLBox::sharedDisplayList = 0;
+
+// Counter keeping track of number of GLBox instances sharing
+// the display list, so that the last instance can delete it:
+int GLBox::sharedListUsers = 0;
+
+
+/*!
+ Create a GLBox widget
+*/
+
+GLBox::GLBox( TQWidget* parent, const char* name, const TQGLWidget* shareWidget )
+ : TQGLWidget( parent, name, shareWidget )
+{
+ xRot = yRot = zRot = 0.0; // default object rotation
+ scale = 1.0; // default object scale
+ object = 0;
+ localDisplayList = 0;
+}
+
+
+/*!
+ Set up the OpenGL rendering state. Robustly access shared display list.
+*/
+
+void GLBox::initializeGL()
+{
+ // Let OpenGL clear to black
+ qglClearColor( black );
+
+ glEnable(GL_DEPTH_TEST);
+
+ if ( sharedListUsers == 0 ) { // No shared list has been made yet
+ sharedDisplayList = makeObject(); // Make one
+ object = sharedDisplayList; // Use it
+ sharedListUsers++; // Keep reference count
+ qDebug( "GLBox %s created shared display list.", name() );
+ }
+ else { // There is a shared diplay list
+ if ( isSharing() ) { // Can we access it?
+ object = sharedDisplayList; // Yes, use it
+ sharedListUsers++; // Keep reference count
+ qDebug( "GLBox %s uses shared display list.", name() );
+ }
+ else {
+ localDisplayList = makeObject(); // No, roll our own
+ object = localDisplayList; // and use that
+ qDebug( "GLBox %s uses private display list.", name() );
+ }
+ }
+}
+
+
+
+/*!
+ Release allocated resources
+*/
+
+GLBox::~GLBox()
+{
+ makeCurrent(); // We're going to do gl calls
+ if ( localDisplayList != 0 ) { // Did we make our own?
+ glDeleteLists( localDisplayList, 1 ); // Yes, delete it
+ qDebug( "GLBox %s deleted private display list.", name() );
+ }
+ else {
+ sharedListUsers--; // No, we used the shared one; keep refcount
+ if ( sharedListUsers == 0 ) { // Any sharers left?
+ glDeleteLists( sharedDisplayList, 1 ); // No, delete it
+ sharedDisplayList = 0;
+ qDebug( "GLBox %s deleted shared display list.", name() );
+ }
+ }
+}
+
+
+/*!
+ Paint the box. The actual openGL commands for drawing the box are
+ performed here.
+*/
+
+void GLBox::paintGL()
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -3.0 );
+ 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 );
+
+ glCallList( object );
+}
+
+
+
+
+/*!
+ 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, 1.0, 10.0);
+}
+
+
+/*!
+ 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 );
+
+ glBegin(GL_QUADS);
+ /* Front face */
+ qglColor( green );
+ glVertex3f(-1.0, 1.0, 1.0);
+ glVertex3f(1.0, 1.0, 1.0);
+ glVertex3f(1.0, -1.0, 1.0);
+ glVertex3f(-1.0, -1.0, 1.0);
+ /* Back face */
+ qglColor( yellow );
+ glVertex3f(-1.0, 1.0, -1.0);
+ glVertex3f(1.0, 1.0, -1.0);
+ glVertex3f(1.0, -1.0, -1.0);
+ glVertex3f(-1.0, -1.0, -1.0);
+ /* Top side face */
+ qglColor( blue );
+ glVertex3f(-1.0, 1.0, 1.0);
+ glVertex3f(1.0, 1.0, 1.0);
+ glVertex3f(1.0, 1.0, -1.0);
+ glVertex3f(-1.0, 1.0, -1.0);
+ /* Bottom side face */
+ qglColor( red );
+ glVertex3f(-1.0, -1.0, 1.0);
+ glVertex3f(1.0, -1.0, 1.0);
+ glVertex3f(1.0, -1.0, -1.0);
+ glVertex3f(-1.0, -1.0, -1.0);
+ glEnd();
+ glEndList();
+
+ return list;
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the X axis.
+*/
+
+void GLBox::setXRotation( int degrees )
+{
+ xRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Y axis.
+*/
+
+void GLBox::setYRotation( int degrees )
+{
+ yRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Z axis.
+*/
+
+void GLBox::setZRotation( int degrees )
+{
+ zRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
diff --git a/examples/opengl/sharedbox/glbox.h b/examples/opengl/sharedbox/glbox.h
new file mode 100644
index 000000000..089513d33
--- /dev/null
+++ b/examples/opengl/sharedbox/glbox.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying a box
+**
+****************************************************************************/
+
+#ifndef GLBOX_H
+#define GLBOX_H
+
+#include <qgl.h>
+
+
+class GLBox : public TQGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ GLBox( TQWidget* parent, const char* name, const TQGLWidget* shareWidget=0 );
+ ~GLBox();
+
+public slots:
+
+ void setXRotation( int degrees );
+ void setYRotation( int degrees );
+ void setZRotation( int degrees );
+
+protected:
+
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ virtual GLuint makeObject();
+
+private:
+
+ GLuint object;
+ GLuint localDisplayList;
+
+ static GLuint sharedDisplayList;
+ static int sharedListUsers;
+
+ GLfloat xRot, yRot, zRot, scale;
+
+};
+
+
+#endif // GLBOX_H
diff --git a/examples/opengl/sharedbox/globjwin.cpp b/examples/opengl/sharedbox/globjwin.cpp
new file mode 100644
index 000000000..f908add4b
--- /dev/null
+++ b/examples/opengl/sharedbox/globjwin.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <qframe.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+#include <qkeycode.h>
+#include "globjwin.h"
+#include "glbox.h"
+
+
+GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name )
+ : TQWidget( parent, name )
+{
+ // Create a menu
+ TQPopupMenu *file = new TQPopupMenu( this );
+ file->insertItem( "Delete Left TQGLWidget", this,
+ SLOT(deleteFirstWidget()) );
+ file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ // Create a menu bar
+ TQMenuBar *m = new TQMenuBar( this );
+ m->setSeparator( TQMenuBar::InWindowsStyle );
+ m->insertItem("&File", file );
+
+ // Create nice frames to put around the OpenGL widgets
+ TQFrame* f1 = new TQFrame( this, "frame1" );
+ f1->setFrameStyle( TQFrame::Sunken | TQFrame::Panel );
+ f1->setLineWidth( 2 );
+ TQFrame* f2 = new TQFrame( this, "frame2" );
+ f2->setFrameStyle( TQFrame::Sunken | TQFrame::Panel );
+ f2->setLineWidth( 2 );
+
+ // Create an OpenGL widget
+ c1 = new GLBox( f1, "glbox1" );
+
+ // Create another OpenGL widget that shares display lists with the first
+ c2 = new GLBox( f2, "glbox2", c1 );
+
+ // Create the three sliders; one for each rotation axis
+ // Make them spin the boxes, but not in synch
+ TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" );
+ x->setTickmarks( TQSlider::Left );
+ connect( x, SIGNAL(valueChanged(int)), c1, SLOT(setXRotation(int)) );
+ connect( x, SIGNAL(valueChanged(int)), c2, SLOT(setZRotation(int)) );
+
+ TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" );
+ y->setTickmarks( TQSlider::Left );
+ connect( y, SIGNAL(valueChanged(int)), c1, SLOT(setYRotation(int)) );
+ connect( y, SIGNAL(valueChanged(int)), c2, SLOT(setXRotation(int)) );
+
+ TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" );
+ z->setTickmarks( TQSlider::Left );
+ connect( z, SIGNAL(valueChanged(int)), c1, SLOT(setZRotation(int)) );
+ connect( z, SIGNAL(valueChanged(int)), c2, SLOT(setYRotation(int)) );
+
+
+ // Now that we have all the widgets, put them into a nice layout
+
+ // Put the sliders on top of each other
+ TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout");
+ vlayout->addWidget( x );
+ vlayout->addWidget( y );
+ vlayout->addWidget( z );
+
+ // Put the GL widgets inside the frames
+ TQHBoxLayout* flayout1 = new TQHBoxLayout( f1, 2, 2, "flayout1");
+ flayout1->addWidget( c1, 1 );
+ TQHBoxLayout* flayout2 = new TQHBoxLayout( f2, 2, 2, "flayout2");
+ flayout2->addWidget( c2, 1 );
+
+ // Top level layout, puts the sliders to the left of the frame/GL widget
+ TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout");
+ hlayout->setMenuBar( m );
+ hlayout->addLayout( vlayout );
+ hlayout->addWidget( f1, 1 );
+ hlayout->addWidget( f2, 1 );
+
+}
+
+
+void GLObjectWindow::deleteFirstWidget()
+{
+ // Delete only c1; c2 will keep working and use the shared display list
+ if ( c1 ) {
+ delete c1;
+ c1 = 0;
+ }
+}
diff --git a/examples/opengl/sharedbox/globjwin.h b/examples/opengl/sharedbox/globjwin.h
new file mode 100644
index 000000000..c42f2ea72
--- /dev/null
+++ b/examples/opengl/sharedbox/globjwin.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** The GLObjectWindow contains a GLBox and three sliders connected to
+** the GLBox's rotation slots.
+**
+****************************************************************************/
+
+#ifndef GLOBJWIN_H
+#define GLOBJWIN_H
+
+#include <qwidget.h>
+class GLBox;
+
+class GLObjectWindow : public TQWidget
+{
+ Q_OBJECT
+public:
+ GLObjectWindow( TQWidget* parent = 0, const char* name = 0 );
+
+protected slots:
+
+ void deleteFirstWidget();
+
+private:
+ GLBox* c1;
+ GLBox* c2;
+};
+
+
+#endif // GLOBJWIN_H
diff --git a/examples/opengl/sharedbox/main.cpp b/examples/opengl/sharedbox/main.cpp
new file mode 100644
index 000000000..13e474007
--- /dev/null
+++ b/examples/opengl/sharedbox/main.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// TQt OpenGL example: Shared Box
+//
+// A small example showing how to use OpenGL display list sharing
+//
+// File: main.cpp
+//
+// The main() function
+//
+
+#include "globjwin.h"
+#include <qapplication.h>
+#include <qgl.h>
+
+/*
+ The main program is here.
+*/
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a(argc,argv);
+
+ if ( !TQGLFormat::hasOpenGL() ) {
+ qWarning( "This system has no OpenGL support. Exiting." );
+ return -1;
+ }
+
+ GLObjectWindow w;
+ w.resize( 550, 350 );
+ a.setMainWidget( &w );
+ w.show();
+ return a.exec();
+}
diff --git a/examples/opengl/sharedbox/sharedbox.doc b/examples/opengl/sharedbox/sharedbox.doc
new file mode 100644
index 000000000..21e7a66a3
--- /dev/null
+++ b/examples/opengl/sharedbox/sharedbox.doc
@@ -0,0 +1,16 @@
+/*! \page opengl-sharedbox-example.html
+
+ \ingroup opengl-examples
+ \title OpenGL Shared Box Example
+
+
+This example program is an extension of the \link
+opengl-box-example.html Box example\endlink.
+
+It demonstrates how to use OpenGL display list sharing with
+QGLWidgets.
+
+See \c{$QTDIR/examples/opengl/sharedbox} for the source code.
+
+*/
+
diff --git a/examples/opengl/sharedbox/sharedbox.pro b/examples/opengl/sharedbox/sharedbox.pro
new file mode 100644
index 000000000..30b92e8ca
--- /dev/null
+++ b/examples/opengl/sharedbox/sharedbox.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = sharedbox
+
+CONFIG += qt opengl warn_on release
+CONFIG -= dlopen_opengl
+DEPENDPATH = ../include
+
+REQUIRES = opengl
+
+HEADERS = glbox.h \
+ globjwin.h
+SOURCES = glbox.cpp \
+ globjwin.cpp \
+ main.cpp
diff --git a/examples/opengl/texture/README b/examples/opengl/texture/README
new file mode 100644
index 000000000..5b85cd719
--- /dev/null
+++ b/examples/opengl/texture/README
@@ -0,0 +1,4 @@
+
+The texture example
+
+This example program demonstrates how to use OpenGL 2D textures.
diff --git a/examples/opengl/texture/gllogo.bmp b/examples/opengl/texture/gllogo.bmp
new file mode 100644
index 000000000..ee64a1036
--- /dev/null
+++ b/examples/opengl/texture/gllogo.bmp
Binary files differ
diff --git a/examples/opengl/texture/globjwin.cpp b/examples/opengl/texture/globjwin.cpp
new file mode 100644
index 000000000..e46833faf
--- /dev/null
+++ b/examples/opengl/texture/globjwin.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <qframe.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+#include <qkeycode.h>
+#include "globjwin.h"
+#include "gltexobj.h"
+
+
+GLObjectWindow::GLObjectWindow( TQWidget* parent, const char* name )
+ : TQWidget( parent, name )
+{
+
+ // Create nice frames to put around the OpenGL widgets
+ TQFrame* f1 = new TQFrame( this, "frame1" );
+ f1->setFrameStyle( TQFrame::Sunken | TQFrame::Panel );
+ f1->setLineWidth( 2 );
+
+ // Create an OpenGL widget
+ GLTexobj* c = new GLTexobj( f1, "glbox1");
+
+ // Create a menu
+ TQPopupMenu *file = new TQPopupMenu( this );
+ file->insertItem( "Toggle Animation", c, SLOT(toggleAnimation()),
+ CTRL+Key_A );
+ file->insertSeparator();
+ file->insertItem( "Exit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ // Create a menu bar
+ TQMenuBar *m = new TQMenuBar( this );
+ m->setSeparator( TQMenuBar::InWindowsStyle );
+ m->insertItem("&File", file );
+
+ // Create the three sliders; one for each rotation axis
+ TQSlider* x = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "xsl" );
+ x->setTickmarks( TQSlider::Left );
+ connect( x, SIGNAL(valueChanged(int)), c, SLOT(setXRotation(int)) );
+
+ TQSlider* y = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "ysl" );
+ y->setTickmarks( TQSlider::Left );
+ connect( y, SIGNAL(valueChanged(int)), c, SLOT(setYRotation(int)) );
+
+ TQSlider* z = new TQSlider ( 0, 360, 60, 0, TQSlider::Vertical, this, "zsl" );
+ z->setTickmarks( TQSlider::Left );
+ connect( z, SIGNAL(valueChanged(int)), c, SLOT(setZRotation(int)) );
+
+
+ // Now that we have all the widgets, put them into a nice layout
+
+ // Put the sliders on top of each other
+ TQVBoxLayout* vlayout = new TQVBoxLayout( 20, "vlayout");
+ vlayout->addWidget( x );
+ vlayout->addWidget( y );
+ vlayout->addWidget( z );
+
+ // Put the GL widget inside the frame
+ TQHBoxLayout* flayout1 = new TQHBoxLayout( f1, 2, 2, "flayout1");
+ flayout1->addWidget( c, 1 );
+
+ // Top level layout, puts the sliders to the left of the frame/GL widget
+ TQHBoxLayout* hlayout = new TQHBoxLayout( this, 20, 20, "hlayout");
+ hlayout->setMenuBar( m );
+ hlayout->addLayout( vlayout );
+ hlayout->addWidget( f1, 1 );
+
+}
diff --git a/examples/opengl/texture/globjwin.h b/examples/opengl/texture/globjwin.h
new file mode 100644
index 000000000..98dad489e
--- /dev/null
+++ b/examples/opengl/texture/globjwin.h
@@ -0,0 +1,32 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** The GLObjectWindow contains a GLBox and three sliders connected to
+** the GLBox's rotation slots.
+**
+****************************************************************************/
+
+#ifndef GLOBJWIN_H
+#define GLOBJWIN_H
+
+#include <qwidget.h>
+
+
+class GLObjectWindow : public TQWidget
+{
+ Q_OBJECT
+public:
+ GLObjectWindow( TQWidget* parent = 0, const char* name = 0 );
+
+};
+
+
+#endif // GLOBJWIN_H
diff --git a/examples/opengl/texture/gltexobj.cpp b/examples/opengl/texture/gltexobj.cpp
new file mode 100644
index 000000000..483a18843
--- /dev/null
+++ b/examples/opengl/texture/gltexobj.cpp
@@ -0,0 +1,240 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget demonstrating the use of TQImages 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>
+#include <qtimer.h>
+
+
+const int redrawWait = 50;
+
+/*!
+ Create a GLTexobj widget
+*/
+
+GLTexobj::GLTexobj( TQWidget* parent, const char* name )
+ : TQGLWidget( parent, name )
+{
+ xRot = yRot = zRot = 0.0; // default object rotation
+ scale = 5.0; // default object scale
+ object = 0;
+ animation = TRUE;
+ timer = new TQTimer( this );
+ connect( timer, SIGNAL(timeout()), SLOT(update()) );
+ timer->start( redrawWait, TRUE );
+}
+
+
+/*!
+ 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()
+{
+ if ( animation ) {
+ xRot += 1.0;
+ yRot += 2.5;
+ zRot -= 5.0;
+ }
+ glClear( GL_COLOR_BUFFER_BIT );
+ glPushMatrix();
+ glRotatef( xRot, 1.0, 0.0, 0.0 );
+ glRotatef( yRot, 0.0, 1.0, 0.0 );
+ glRotatef( zRot, 0.0, 0.0, 1.0 );
+ glScalef( scale, scale, scale );
+ glCallList( object );
+ glPopMatrix();
+
+ if ( animation ) {
+ glFlush(); // Make sure everything is drawn before restarting timer
+ timer->start( redrawWait, TRUE ); // Wait this many msecs before redraw
+ }
+}
+
+
+/*!
+ 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);
+ 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
+
+ TQImage tex1, tex2, buf;
+
+ if ( !buf.load( "gllogo.bmp" ) ) { // Load first image from file
+ qWarning( "Could not read image file, using single-color instead." );
+ TQImage dummy( 128, 128, 32 );
+ dummy.fill( TQt::green.rgb() );
+ buf = dummy;
+ }
+ tex1 = TQGLWidget::convertToGLFormat( buf ); // flipped 32bit RGBA
+
+ if ( !buf.load( "qtlogo.bmp" ) ) { // Load first image from file
+ qWarning( "Could not read image file, using single-color instead." );
+ TQImage dummy( 128, 128, 32 );
+ dummy.fill( TQt::red.rgb() );
+ buf = dummy;
+ }
+ tex2 = TQGLWidget::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 TQImage& tex1, const TQImage& 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;
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the X axis.
+*/
+
+void GLTexobj::setXRotation( int degrees )
+{
+ xRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Y axis.
+*/
+
+void GLTexobj::setYRotation( int degrees )
+{
+ yRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Set the rotation angle of the object to \e degrees around the Z axis.
+*/
+
+void GLTexobj::setZRotation( int degrees )
+{
+ zRot = (GLfloat)(degrees % 360);
+ updateGL();
+}
+
+
+/*!
+ Turns animation on or off
+*/
+
+void GLTexobj::toggleAnimation()
+{
+ animation = !animation;
+ if ( animation )
+ updateGL();
+ else
+ timer->stop();
+}
diff --git a/examples/opengl/texture/gltexobj.h b/examples/opengl/texture/gltexobj.h
new file mode 100644
index 000000000..9fa368376
--- /dev/null
+++ b/examples/opengl/texture/gltexobj.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+/****************************************************************************
+**
+** This is a simple TQGLWidget displaying an openGL wireframe box
+**
+****************************************************************************/
+
+#ifndef GLTEXOBJ_H
+#define GLTEXOBJ_H
+
+#include <qgl.h>
+
+
+class GLTexobj : public TQGLWidget
+{
+ Q_OBJECT
+
+public:
+
+ GLTexobj( TQWidget* parent, const char* name );
+ ~GLTexobj();
+
+public slots:
+
+ void setXRotation( int degrees );
+ void setYRotation( int degrees );
+ void setZRotation( int degrees );
+ void toggleAnimation();
+
+protected:
+
+ void initializeGL();
+ void paintGL();
+ void resizeGL( int w, int h );
+
+ virtual GLuint makeObject( const TQImage& tex1, const TQImage& tex2 );
+
+private:
+ bool animation;
+ GLuint object;
+ GLfloat xRot, yRot, zRot, scale;
+ TQTimer* timer;
+};
+
+
+#endif // GLTEXOBJ_H
diff --git a/examples/opengl/texture/main.cpp b/examples/opengl/texture/main.cpp
new file mode 100644
index 000000000..4798bc16d
--- /dev/null
+++ b/examples/opengl/texture/main.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// TQt OpenGL example: Texture
+//
+// File: main.cpp
+//
+// The main() function
+//
+
+#include "globjwin.h"
+#include <qapplication.h>
+#include <qgl.h>
+
+/*
+ The main program is here.
+*/
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a(argc,argv);
+
+ if ( !TQGLFormat::hasOpenGL() ) {
+ qWarning( "This system has no OpenGL support. Exiting." );
+ return -1;
+ }
+
+ GLObjectWindow* w = new GLObjectWindow;
+ w->resize( 400, 350 );
+ a.setMainWidget( w );
+ w->show();
+ int result = a.exec();
+ delete w;
+ return result;
+}
diff --git a/examples/opengl/texture/qtlogo.bmp b/examples/opengl/texture/qtlogo.bmp
new file mode 100644
index 000000000..b7f9215d9
--- /dev/null
+++ b/examples/opengl/texture/qtlogo.bmp
Binary files differ
diff --git a/examples/opengl/texture/texture.doc b/examples/opengl/texture/texture.doc
new file mode 100644
index 000000000..28f1d3fbd
--- /dev/null
+++ b/examples/opengl/texture/texture.doc
@@ -0,0 +1,10 @@
+/*! \page opengl-texture-example.html
+
+ \ingroup opengl-examples
+ \title OpenGL Texture Example
+
+This example program demonstrates how to use OpenGL 2D textures.
+
+See \c{$QTDIR/examples/opengl/texture} for the source code.
+
+*/
diff --git a/examples/opengl/texture/texture.pro b/examples/opengl/texture/texture.pro
new file mode 100644
index 000000000..a9a31b8ee
--- /dev/null
+++ b/examples/opengl/texture/texture.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = texture
+
+CONFIG += qt opengl warn_on release
+CONFIG -= dlopen_opengl
+DEPENDPATH = ../include
+
+REQUIRES = opengl
+
+HEADERS = gltexobj.h \
+ globjwin.h
+SOURCES = gltexobj.cpp \
+ globjwin.cpp \
+ main.cpp
diff --git a/examples/picture/README b/examples/picture/README
new file mode 100644
index 000000000..84373a468
--- /dev/null
+++ b/examples/picture/README
@@ -0,0 +1,5 @@
+This program demonstrates how to record, save, load and replay a
+picture.
+
+Run picture to record car.pic, then run it again to replay it.
+
diff --git a/examples/picture/car_orig.pic b/examples/picture/car_orig.pic
new file mode 100644
index 000000000..a0141b753
--- /dev/null
+++ b/examples/picture/car_orig.pic
Binary files differ
diff --git a/examples/picture/flag.bmp b/examples/picture/flag.bmp
new file mode 100644
index 000000000..04fc3e46e
--- /dev/null
+++ b/examples/picture/flag.bmp
Binary files differ
diff --git a/examples/picture/picture.cpp b/examples/picture/picture.cpp
new file mode 100644
index 000000000..44420d084
--- /dev/null
+++ b/examples/picture/picture.cpp
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qpicture.h>
+#include <qpixmap.h>
+#include <qwidget.h>
+#include <qmessagebox.h>
+#include <qfile.h>
+#include <ctype.h>
+
+
+void paintCar( TQPainter *p ) // paint a car
+{
+ TQPointArray a;
+ TQBrush brush( TQt::yellow, TQt::SolidPattern );
+ p->setBrush( brush ); // use solid, yellow brush
+
+ a.setPoints( 5, 50,50, 350,50, 450,120, 450,250, 50,250 );
+ p->drawPolygon( a ); // draw car body
+
+ TQFont f( "courier", 12, TQFont::Bold );
+ p->setFont( f );
+
+ TQColor windowColor( 120, 120, 255 ); // a light blue color
+ brush.setColor( windowColor ); // set this brush color
+ p->setBrush( brush ); // set brush
+ p->drawRect( 80, 80, 250, 70 ); // car window
+ p->drawText( 180, 80, 150, 70, TQt::AlignCenter, "-- TQt --\nTrolltech AS" );
+
+ TQPixmap pixmap;
+ if ( pixmap.load("flag.bmp") ) // load and draw image
+ p->drawPixmap( 100, 85, pixmap );
+
+ p->setBackgroundMode( TQt::OpaqueMode ); // set opaque mode
+ p->setBrush( TQt::DiagCrossPattern ); // black diagonal cross pattern
+ p->drawEllipse( 90, 210, 80, 80 ); // back wheel
+ p->setBrush( TQt::CrossPattern ); // black cross fill pattern
+ p->drawEllipse( 310, 210, 80, 80 ); // front wheel
+}
+
+
+class PictureDisplay : public TQWidget // picture display widget
+{
+public:
+ PictureDisplay( const char *fileName );
+ ~PictureDisplay();
+protected:
+ void paintEvent( TQPaintEvent * );
+ void keyPressEvent( TQKeyEvent * );
+private:
+ TQPicture *pict;
+ TQString name;
+};
+
+PictureDisplay::PictureDisplay( const char *fileName )
+{
+ pict = new TQPicture;
+ name = fileName;
+ if ( !pict->load(fileName) ) { // cannot load picture
+ delete pict;
+ pict = 0;
+ name.sprintf( "Not able to load picture: %s", fileName );
+ }
+}
+
+PictureDisplay::~PictureDisplay()
+{
+ delete pict;
+}
+
+void PictureDisplay::paintEvent( TQPaintEvent * )
+{
+ TQPainter paint( this ); // paint widget
+ if ( pict )
+ paint.drawPicture( *pict ); // draw picture
+ else
+ paint.drawText( rect(), AlignCenter, name );
+}
+
+void PictureDisplay::keyPressEvent( TQKeyEvent *k )
+{
+ switch ( tolower(k->ascii()) ) {
+ case 'r': // reload
+ pict->load( name );
+ update();
+ break;
+ case 'q': // tquit
+ TQApplication::exit();
+ break;
+ }
+}
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv ); // TQApplication retquired!
+
+ const char *fileName = "car.pic"; // default picture file name
+
+ if ( argc == 2 ) // use argument as file name
+ fileName = argv[1];
+
+ if ( !TQFile::exists(fileName) ) {
+ TQPicture pict; // our picture
+ TQPainter paint; // our painter
+
+ paint.begin( &pict ); // begin painting onto picture
+ paintCar( &paint ); // paint!
+ paint.end(); // painting done
+
+ pict.save( fileName ); // save picture
+ TQMessageBox::information(0, "TQt Example - Picture", "Saved. Run me again!");
+ return 0;
+ } else {
+ PictureDisplay test( fileName ); // create picture display
+ a.setMainWidget( &test); // set main widget
+ test.setCaption("TQt Example - Picture");
+ test.show(); // show it
+
+ return a.exec(); // start event loop
+ }
+}
diff --git a/examples/picture/picture.doc b/examples/picture/picture.doc
new file mode 100644
index 000000000..fa4d25711
--- /dev/null
+++ b/examples/picture/picture.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page picture-example.html
+
+ \ingroup examples
+ \title Picture
+
+ This example shows how to make a picture, store it to a file, and read it as
+ a set of drawing commands.
+
+ <hr>
+
+ Implementation:
+
+ \include picture/picture.cpp
+*/
+
diff --git a/examples/picture/picture.pro b/examples/picture/picture.pro
new file mode 100644
index 000000000..39e64b750
--- /dev/null
+++ b/examples/picture/picture.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = picture
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = picture.cpp
diff --git a/examples/popup/README b/examples/popup/README
new file mode 100644
index 000000000..3be117bb2
--- /dev/null
+++ b/examples/popup/README
@@ -0,0 +1,3 @@
+The popup program demonstrates some easy techniques for creating custom
+popup widgets like a fancy color or line-width selection for the
+toolbar of a drawing program or a browsebox for various symbols or ...
diff --git a/examples/popup/popup.cpp b/examples/popup/popup.cpp
new file mode 100644
index 000000000..9a13fc8f9
--- /dev/null
+++ b/examples/popup/popup.cpp
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "popup.h"
+#include <qapplication.h>
+#include <qlayout.h>
+
+FancyPopup::FancyPopup( TQWidget* parent, const char* name ):
+ TQLabel( parent, name, WType_Popup ){
+ setFrameStyle( WinPanel|Raised );
+ setAlignment( AlignCenter );
+ resize(150,100);
+ moves = 0;
+ setMouseTracking( TRUE );
+}
+
+void FancyPopup::mouseMoveEvent( TQMouseEvent * e){
+ moves++;
+ TQString s;
+ s.sprintf("%d/%d", e->pos().x(), e->pos().y());
+ if (e->state() & TQMouseEvent::LeftButton)
+ s += " (down)";
+ setText(s);
+}
+
+void FancyPopup::mouseReleaseEvent( TQMouseEvent * e){
+ if (rect().contains( e->pos() ) || moves > 5)
+ close();
+}
+
+void FancyPopup::closeEvent( TQCloseEvent *e ){
+ e->accept();
+ moves = 0;
+ if (!popupParent)
+ return;
+
+ // remember that we (as a popup) might recieve the mouse release
+ // event instead of the popupParent. This is due to the fact that
+ // the popupParent popped us up in its mousePressEvent handler. To
+ // avoid the button remaining in pressed state we simply send a
+ // faked mouse button release event to it.
+ TQMouseEvent me( TQEvent::MouseButtonRelease, TQPoint(0,0), TQPoint(0,0), TQMouseEvent::LeftButton, TQMouseEvent::NoButton);
+ TQApplication::sendEvent( popupParent, &me );
+}
+
+void FancyPopup::popup( TQWidget* parent) {
+ popupParent = parent;
+ setText("Move the mouse!");
+ if (popupParent)
+ move( popupParent->mapToGlobal( popupParent->rect().bottomLeft() ) );
+ show();
+}
+
+
+
+
+
+
+Frame::Frame(TQWidget* parent, const char* name): TQFrame(parent, name){
+ button1 = new TQPushButton("Simple Popup", this);
+ connect ( button1, SIGNAL( clicked() ), SLOT( button1Clicked() ) );
+ button2 = new TQPushButton("Fancy Popup", this);
+ connect ( button2, SIGNAL( pressed() ), SLOT( button2Pressed() ) );
+
+ TQBoxLayout * l = new TQHBoxLayout( this );
+ button1->setMaximumSize(button1->sizeHint());
+ button2->setMaximumSize(button2->sizeHint());
+ l->addWidget( button1 );
+ l->addWidget( button2 );
+ l->activate();
+
+// button1->setGeometry(20,20,100,30);
+// button2->setGeometry(140,20,100,30);
+ resize(270, 70);
+
+ //create a very simple popup: it is just composed with other
+ //widget and will be shown after clicking on button1
+
+ popup1 = new TQFrame( this ,0, WType_Popup);
+ popup1->setFrameStyle( WinPanel|Raised );
+ popup1->resize(150,100);
+ TQLineEdit *tmpE = new TQLineEdit( popup1 );
+ connect( tmpE, SIGNAL( returnPressed() ), popup1, SLOT( hide() ) );
+ tmpE->setGeometry(10,10, 130, 30);
+ tmpE->setFocus();
+ TQPushButton *tmpB = new TQPushButton("Click me!", popup1);
+ connect( tmpB, SIGNAL( clicked() ), popup1, SLOT( close() ) );
+ tmpB->setGeometry(10, 50, 130, 30);
+
+ // the fancier version uses its own class. It will be shown when
+ // pressing button2, so they behavior is more like a modern menu
+ // or toolbar.
+
+ popup2 = new FancyPopup( this );
+
+ // you might also add new widgets to the popup, just like you do
+ // it with any other widget. The next four lines (if not
+ // commented out) will for instance add a line edit widget.
+
+// tmpE = new TQLineEdit( popup2 );
+// tmpE->setFocus();
+// connect( tmpE, SIGNAL( returnPressed() ), popup2, SLOT( close() ) );
+// tmpE->setGeometry(10, 10, 130, 30);
+}
+
+
+void Frame::button1Clicked(){
+ popup1->move( mapToGlobal( button1->geometry().bottomLeft() ) );
+ popup1->show();
+}
+
+void Frame::button2Pressed(){
+ popup2->popup(button2);
+}
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a(argc,argv);
+
+ Frame frame;
+ frame.setCaption("TQt Example - Custom Popups");
+ a.setMainWidget(&frame);
+ frame.show();
+ return a.exec();
+}
diff --git a/examples/popup/popup.doc b/examples/popup/popup.doc
new file mode 100644
index 000000000..1322fbd5a
--- /dev/null
+++ b/examples/popup/popup.doc
@@ -0,0 +1,23 @@
+/*
+*/
+/*! \page popup-example.html
+
+ \ingroup examples
+ \title Popup Widgets
+
+ This example shows how to implement widgets that should
+ pop up.
+
+ <hr>
+
+ Header file:
+
+ \include popup/popup.h
+
+ <hr>
+
+ Implementation:
+
+ \include popup/popup.cpp
+*/
+
diff --git a/examples/popup/popup.h b/examples/popup/popup.h
new file mode 100644
index 000000000..ef4e8b282
--- /dev/null
+++ b/examples/popup/popup.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Definition of something or other
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef POPUP_H
+#define POPUP_H
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+
+class FancyPopup : public TQLabel
+{
+ Q_OBJECT
+public:
+ FancyPopup( TQWidget* parent = 0, const char* name=0);
+
+ void popup( TQWidget* parent = 0);
+protected:
+ virtual void mouseMoveEvent( TQMouseEvent * );
+ virtual void mouseReleaseEvent( TQMouseEvent * );
+ virtual void closeEvent( TQCloseEvent * );
+
+private:
+ TQWidget* popupParent;
+ int moves;
+};
+
+
+ class Frame : public TQFrame
+ {
+ Q_OBJECT
+ public:
+ Frame( TQWidget *parent=0, const char* name=0);
+
+ protected:
+
+ private slots:
+ void button1Clicked();
+ void button2Pressed();
+
+ private:
+ TQPushButton *button1;
+ TQPushButton *button2;
+
+ TQFrame* popup1;
+ FancyPopup* popup2;
+ };
+
+#endif
diff --git a/examples/popup/popup.pro b/examples/popup/popup.pro
new file mode 100644
index 000000000..9a77d8e8c
--- /dev/null
+++ b/examples/popup/popup.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = popup
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = popup.h
+SOURCES = popup.cpp
diff --git a/examples/process/README b/examples/process/README
new file mode 100644
index 000000000..55a2d02f3
--- /dev/null
+++ b/examples/process/README
@@ -0,0 +1,8 @@
+The process example is not particularly useful, but it shows a typical
+use of the class QProcess.
+
+This example starts the uic command with some options and displays the
+output of the uic call. The uic is a command line tool that is used if you
+create dialogs with the Qt Designer. If you installed Qt correctly, it
+should be available on your system. It outputs the generated code to
+standard output by default.
diff --git a/examples/process/process.cpp b/examples/process/process.cpp
new file mode 100644
index 000000000..32368dc57
--- /dev/null
+++ b/examples/process/process.cpp
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qobject.h>
+#include <qprocess.h>
+#include <qvbox.h>
+#include <qtextview.h>
+#include <qpushbutton.h>
+#include <qapplication.h>
+#include <qmessagebox.h>
+
+#include <stdlib.h>
+
+class UicManager : public TQVBox
+{
+ Q_OBJECT
+
+public:
+ UicManager();
+ ~UicManager() {}
+
+public slots:
+ void readFromStdout();
+ void scrollToTop();
+
+private:
+ TQProcess *proc;
+ TQTextView *output;
+ TQPushButton *tquitButton;
+};
+
+UicManager::UicManager()
+{
+ // Layout
+ output = new TQTextView( this );
+ tquitButton = new TQPushButton( tr("Quit"), this );
+ connect( tquitButton, SIGNAL(clicked()),
+ qApp, SLOT(tquit()) );
+ resize( 500, 500 );
+
+ // TQProcess related code
+ proc = new TQProcess( this );
+
+ // Set up the command and arguments.
+ // On the command line you would do:
+ // uic -tr i18n "small_dialog.ui"
+ proc->addArgument( "uic" );
+ proc->addArgument( "-tr" );
+ proc->addArgument( "i18n" );
+ proc->addArgument( "small_dialog.ui" );
+
+ connect( proc, SIGNAL(readyReadStdout()),
+ this, SLOT(readFromStdout()) );
+ connect( proc, SIGNAL(processExited()),
+ this, SLOT(scrollToTop()) );
+
+ if ( !proc->start() ) {
+ // error handling
+ TQMessageBox::critical( 0,
+ tr("Fatal error"),
+ tr("Could not start the uic command."),
+ tr("Quit") );
+ exit( -1 );
+ }
+}
+
+void UicManager::readFromStdout()
+{
+ // Read and process the data.
+ // Bear in mind that the data might be output in chunks.
+ output->append( proc->readStdout() );
+}
+
+void UicManager::scrollToTop()
+{
+ output->setContentsPos( 0, 0 );
+}
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ UicManager manager;
+ a.setMainWidget( &manager );
+ manager.show();
+ return a.exec();
+}
+
+#include "process.moc"
diff --git a/examples/process/process.doc b/examples/process/process.doc
new file mode 100644
index 000000000..d02b855f3
--- /dev/null
+++ b/examples/process/process.doc
@@ -0,0 +1,20 @@
+/*
+*/
+
+/*! \page process-example.html
+
+ \ingroup qprocess-examples
+
+ \title Starting processes with IO redirection
+
+ This example shows you how to start other processes with Qt and how
+ IO redirection is done. The example tries to start the uic (a tool
+ that comes with the Qt Designer) on a certain ui file and displays the
+ output of the command.
+
+ <hr>
+
+ Implementation (process.cpp):
+
+ \include process/process.cpp
+*/
diff --git a/examples/process/process.pro b/examples/process/process.pro
new file mode 100644
index 000000000..ba5fb24b0
--- /dev/null
+++ b/examples/process/process.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = process
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS =
+SOURCES = process.cpp
+INTERFACES =
diff --git a/examples/process/small_dialog.ui b/examples/process/small_dialog.ui
new file mode 100644
index 000000000..47d9109dc
--- /dev/null
+++ b/examples/process/small_dialog.ui
@@ -0,0 +1,197 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SmallDialog</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>SmallDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>361</width>
+ <height>283</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Small Dialog</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="TQLayoutWidget" row="2" column="0">
+ <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="TQPushButton">
+ <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" stdset="0">
+ <cstring>Horizontal Spacing2</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="TQPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ <property name="accel">
+ <number>0</number>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>This is just a useless dialog.</string>
+ </property>
+ </widget>
+ <widget class="TQFrame" row="1" column="0">
+ <property name="name">
+ <cstring>Frame4</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </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="TQDial" row="0" column="1">
+ <property name="name">
+ <cstring>Dial1</cstring>
+ </property>
+ </widget>
+ <widget class="TQLCDNumber" row="1" column="1">
+ <property name="name">
+ <cstring>LCDNumber1</cstring>
+ </property>
+ <property name="numDigits">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="TQSlider" row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>Slider1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>SmallDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>SmallDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>Slider1</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>LCDNumber1</receiver>
+ <slot>display(int)</slot>
+ </connection>
+ <connection>
+ <sender>Slider1</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>Dial1</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+ <connection>
+ <sender>Dial1</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>Slider1</receiver>
+ <slot>setValue(int)</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/examples/progress/README b/examples/progress/README
new file mode 100644
index 000000000..97ba32365
--- /dev/null
+++ b/examples/progress/README
@@ -0,0 +1,6 @@
+This example demonstrates the use of QProgressBar when performing
+operations which may take a long time to complete.
+
+The progress dialog only appears if the estimated completion time
+is 3-4 seconds.
+
diff --git a/examples/progress/progress.cpp b/examples/progress/progress.cpp
new file mode 100644
index 000000000..fa8ff1d60
--- /dev/null
+++ b/examples/progress/progress.cpp
@@ -0,0 +1,337 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qprogressdialog.h>
+#include <qapplication.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qpainter.h>
+#include <stdlib.h>
+
+class AnimatedThingy : public TQLabel {
+public:
+ AnimatedThingy( TQWidget* parent, const TQString& s ) :
+ TQLabel(parent),
+ label(s),
+ step(0)
+ {
+ setBackgroundColor(white);
+ label+="\n... and wasting CPU\nwith this animation!\n";
+
+ for (int i=0; i<nqix; i++)
+ ox[0][i] = oy[0][i] = ox[1][i] = oy[1][i] = 0;
+ x0 = y0 = x1 = y1 = 0;
+ dx0 = rand()%8+2;
+ dy0 = rand()%8+2;
+ dx1 = rand()%8+2;
+ dy1 = rand()%8+2;
+ }
+
+ void show()
+ {
+ if (!isVisible()) startTimer(100);
+ TQWidget::show();
+ }
+
+ void hide()
+ {
+ TQWidget::hide();
+ killTimers();
+ }
+
+ TQSize sizeHint() const
+ {
+ return TQSize(120,100);
+ }
+
+protected:
+ void timerEvent(TQTimerEvent*)
+ {
+ TQPainter p(this);
+ TQPen pn=p.pen();
+ pn.setWidth(2);
+ pn.setColor(backgroundColor());
+ p.setPen(pn);
+
+ step = (step + 1) % nqix;
+
+ p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]);
+
+ inc(x0, dx0, width());
+ inc(y0, dy0, height());
+ inc(x1, dx1, width());
+ inc(y1, dy1, height());
+ ox[0][step] = x0;
+ oy[0][step] = y0;
+ ox[1][step] = x1;
+ oy[1][step] = y1;
+
+ TQColor c;
+ c.setHsv( (step*255)/nqix, 255, 255 ); // rainbow effect
+ pn.setColor(c);
+ p.setPen(pn);
+ p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]);
+ p.setPen(colorGroup().text());
+ p.drawText(rect(), AlignCenter, label);
+ }
+
+ void paintEvent(TQPaintEvent* event)
+ {
+ TQPainter p(this);
+ TQPen pn=p.pen();
+ pn.setWidth(2);
+ p.setPen(pn);
+ p.setClipRect(event->rect());
+ for (int i=0; i<nqix; i++) {
+ TQColor c;
+ c.setHsv( (i*255)/nqix, 255, 255 ); // rainbow effect
+ pn.setColor(c);
+ p.setPen(pn);
+ p.drawLine(ox[0][i], oy[0][i], ox[1][i], oy[1][i]);
+ }
+ p.setPen(colorGroup().text());
+ p.drawText(rect(), AlignCenter, label);
+ }
+
+private:
+ void inc(int& x, int& dx, int b)
+ {
+ x+=dx;
+ if (x<0) { x=0; dx=rand()%8+2; }
+ else if (x>=b) { x=b-1; dx=-(rand()%8+2); }
+ }
+
+ enum {nqix=10};
+ int ox[2][nqix];
+ int oy[2][nqix];
+ int x0,y0,x1,y1;
+ int dx0,dy0,dx1,dy1;
+ TQString label;
+ int step;
+};
+
+
+class CPUWaster : public TQWidget
+{
+ Q_OBJECT
+
+ enum { first_draw_item = 1000, last_draw_item = 1006 };
+
+ int drawItemRects(int id)
+ {
+ int n = id - first_draw_item;
+ int r = 100;
+ while (n--) r*=(n%3 ? 5 : 4);
+ return r;
+ }
+ TQString drawItemText(int id)
+ {
+ TQString str;
+ str.sprintf("%d Rectangles", drawItemRects(id));
+ return str;
+ }
+
+public:
+ CPUWaster() :
+ pb(0)
+ {
+ menubar = new TQMenuBar( this, "menu" );
+ Q_CHECK_PTR( menubar );
+
+ TQPopupMenu* file = new TQPopupMenu();
+ Q_CHECK_PTR( file );
+ menubar->insertItem( "&File", file );
+ for (int i=first_draw_item; i<=last_draw_item; i++)
+ file->insertItem( drawItemText(i), i );
+ connect( menubar, SIGNAL(activated(int)), this, SLOT(doMenuItem(int)) );
+ file->insertSeparator();
+ file->insertItem( "Quit", qApp, SLOT(tquit()) );
+
+ options = new TQPopupMenu();
+ Q_CHECK_PTR( options );
+ menubar->insertItem( "&Options", options );
+ td_id = options->insertItem( "Timer driven", this, SLOT(timerDriven()) );
+ ld_id = options->insertItem( "Loop driven", this, SLOT(loopDriven()) );
+ options->insertSeparator();
+ dl_id = options->insertItem( "Default label", this, SLOT(defaultLabel()) );
+ cl_id = options->insertItem( "Custom label", this, SLOT(customLabel()) );
+ options->insertSeparator();
+ md_id = options->insertItem( "No minimum duration", this, SLOT(toggleMinimumDuration()) );
+ options->setCheckable( TRUE );
+ loopDriven();
+ defaultLabel();
+
+ setFixedSize( 400, 300 );
+
+ setBackgroundColor( black );
+ }
+
+public slots:
+ void doMenuItem(int id)
+ {
+ if (id >= first_draw_item && id <= last_draw_item)
+ draw(drawItemRects(id));
+ }
+
+ void stopDrawing() { got_stop = TRUE; }
+
+ void timerDriven()
+ {
+ timer_driven = TRUE;
+ options->setItemChecked( td_id, TRUE );
+ options->setItemChecked( ld_id, FALSE );
+ }
+
+ void loopDriven()
+ {
+ timer_driven = FALSE;
+ options->setItemChecked( ld_id, TRUE );
+ options->setItemChecked( td_id, FALSE );
+ }
+
+ void defaultLabel()
+ {
+ default_label = TRUE;
+ options->setItemChecked( dl_id, TRUE );
+ options->setItemChecked( cl_id, FALSE );
+ }
+
+ void customLabel()
+ {
+ default_label = FALSE;
+ options->setItemChecked( dl_id, FALSE );
+ options->setItemChecked( cl_id, TRUE );
+ }
+
+ void toggleMinimumDuration()
+ {
+ options->setItemChecked( md_id,
+ !options->isItemChecked( md_id ) );
+ }
+
+private:
+ void timerEvent( TQTimerEvent* )
+ {
+ if (!got_stop)
+ pb->setProgress( pb->totalSteps() - rects );
+ rects--;
+
+ {
+ TQPainter p(this);
+
+ int ww = width();
+ int wh = height();
+
+ if ( ww > 8 && wh > 8 ) {
+ TQColor c(rand()%255, rand()%255, rand()%255);
+ int x = rand() % (ww-8);
+ int y = rand() % (wh-8);
+ int w = rand() % (ww-x);
+ int h = rand() % (wh-y);
+ p.fillRect( x, y, w, h, c );
+ }
+ }
+
+ if (!rects || got_stop) {
+ if (!got_stop)
+ pb->setProgress( pb->totalSteps() );
+ TQPainter p(this);
+ p.fillRect(0, 0, width(), height(), backgroundColor());
+ enableDrawingItems(TRUE);
+ killTimers();
+ delete pb;
+ pb = 0;
+ }
+ }
+
+ TQProgressDialog* newProgressDialog( const char* label, int steps, bool modal )
+ {
+ TQProgressDialog *d = new TQProgressDialog(label, "Cancel", steps, this,
+ "progress", modal);
+ if ( options->isItemChecked( md_id ) )
+ d->setMinimumDuration(0);
+ if ( !default_label )
+ d->setLabel( new AnimatedThingy(d,label) );
+ return d;
+ }
+
+ void enableDrawingItems(bool yes)
+ {
+ for (int i=first_draw_item; i<=last_draw_item; i++) {
+ menubar->setItemEnabled(i, yes);
+ }
+ }
+
+ void draw(int n)
+ {
+ if ( timer_driven ) {
+ if ( pb ) {
+ qWarning("This cannot happen!");
+ return;
+ }
+ rects = n;
+ pb = newProgressDialog("Drawing rectangles.\n"
+ "Using timer event.", n, FALSE);
+ pb->setCaption("Please Wait");
+ connect(pb, SIGNAL(cancelled()), this, SLOT(stopDrawing()));
+ enableDrawingItems(FALSE);
+ startTimer(0);
+ got_stop = FALSE;
+ } else {
+ TQProgressDialog* lpb = newProgressDialog(
+ "Drawing rectangles.\nUsing loop.", n, TRUE);
+ lpb->setCaption("Please Wait");
+
+ TQPainter p(this);
+ for (int i=0; i<n; i++) {
+ lpb->setProgress(i);
+ if ( lpb->wasCancelled() )
+ break;
+
+ TQColor c(rand()%255, rand()%255, rand()%255);
+ int x = rand()%(width()-8);
+ int y = rand()%(height()-8);
+ int w = rand()%(width()-x);
+ int h = rand()%(height()-y);
+ p.fillRect(x,y,w,h,c);
+ }
+
+ p.fillRect(0, 0, width(), height(), backgroundColor());
+
+ delete lpb;
+ }
+ }
+
+ TQMenuBar* menubar;
+ TQProgressDialog* pb;
+ TQPopupMenu* options;
+ int td_id, ld_id;
+ int dl_id, cl_id;
+ int md_id;
+ int rects;
+ bool timer_driven;
+ bool default_label;
+ bool got_stop;
+};
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ int wincount = argc > 1 ? atoi(argv[1]) : 1;
+
+ for ( int i=0; i<wincount; i++ ) {
+ CPUWaster* cpuw = new CPUWaster;
+ if ( i == 0 ) a.setMainWidget(cpuw);
+ cpuw->show();
+ }
+ return a.exec();
+}
+
+#include "progress.moc"
diff --git a/examples/progress/progress.doc b/examples/progress/progress.doc
new file mode 100644
index 000000000..478013a16
--- /dev/null
+++ b/examples/progress/progress.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page progress-example.html
+
+ \ingroup examples
+ \title Progress Bar and Dialog Example
+
+ This example displays either a simple (text-only) or a
+ custom-labelled (user-supplied widget) progress dialog. It also
+ demonstrates simple use of menus.
+ <hr>
+
+ Implementation:
+
+ \include progress/progress.cpp
+*/
+
diff --git a/examples/progress/progress.pro b/examples/progress/progress.pro
new file mode 100644
index 000000000..d9217e2b8
--- /dev/null
+++ b/examples/progress/progress.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = progress
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = progress.cpp
diff --git a/examples/progressbar/main.cpp b/examples/progressbar/main.cpp
new file mode 100644
index 000000000..73a5fbc8e
--- /dev/null
+++ b/examples/progressbar/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "progressbar.h"
+#include <qapplication.h>
+
+int main(int argc,char **argv)
+{
+ TQApplication a(argc,argv);
+
+ ProgressBar progressbar;
+ progressbar.setCaption("TQt Example - ProgressBar");
+ a.setMainWidget(&progressbar);
+ progressbar.show();
+
+ return a.exec();
+}
diff --git a/examples/progressbar/progressbar.cpp b/examples/progressbar/progressbar.cpp
new file mode 100644
index 000000000..9befa6e80
--- /dev/null
+++ b/examples/progressbar/progressbar.cpp
@@ -0,0 +1,165 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "progressbar.h"
+
+#include <qradiobutton.h>
+#include <qpushbutton.h>
+#include <qprogressbar.h>
+#include <qlayout.h>
+
+#include <qmotifstyle.h>
+
+/*
+ * Constructor
+ *
+ * Creates child widgets of the ProgressBar widget
+ */
+
+ProgressBar::ProgressBar( TQWidget *parent, const char *name )
+ : TQButtonGroup( 0, Horizontal, "Progress Bar", parent, name ), timer()
+{
+ setMargin( 10 );
+
+ TQGridLayout* toplayout = new TQGridLayout( layout(), 2, 2, 5);
+
+ setRadioButtonExclusive( TRUE );
+
+ // insert three radiobuttons which the user can use
+ // to set the speed of the progress and two pushbuttons
+ // to start/pause/continue and reset the progress
+ slow = new TQRadioButton( "S&low", this );
+ normal = new TQRadioButton( "&Normal", this );
+ fast = new TQRadioButton( "&Fast", this );
+ TQVBoxLayout* vb1 = new TQVBoxLayout;
+ toplayout->addLayout( vb1, 0, 0 );
+ vb1->addWidget( slow );
+ vb1->addWidget( normal );
+ vb1->addWidget( fast );
+
+ // two push buttons, one for start, for for reset.
+ start = new TQPushButton( "&Start", this );
+ reset = new TQPushButton( "&Reset", this );
+ TQVBoxLayout* vb2 = new TQVBoxLayout;
+ toplayout->addLayout( vb2, 0, 1 );
+ vb2->addWidget( start );
+ vb2->addWidget( reset );
+
+ // Create the progressbar
+ progress = new TQProgressBar( 100, this );
+ // progress->setStyle( new TQMotifStyle() );
+ toplayout->addMultiCellWidget( progress, 1, 1, 0, 1 );
+
+ // connect the clicked() SIGNALs of the pushbuttons to SLOTs
+ connect( start, SIGNAL( clicked() ), this, SLOT( slotStart() ) );
+ connect( reset, SIGNAL( clicked() ), this, SLOT( slotReset() ) );
+
+ // connect the timeout() SIGNAL of the progress-timer to a SLOT
+ connect( &timer, SIGNAL( timeout() ), this, SLOT( slotTimeout() ) );
+
+ // Let's start with normal speed...
+ normal->setChecked( TRUE );
+
+
+ // some contraints
+ start->setFixedWidth( 80 );
+ setMinimumWidth( 300 );
+}
+
+/*
+ * SLOT slotStart
+ *
+ * This SLOT is called if the user clicks start/pause/continue
+ * button
+ */
+
+void ProgressBar::slotStart()
+{
+ // If the progress bar is at the beginning...
+ if ( progress->progress() == -1 ) {
+ // ...set according to the checked speed-radiobutton
+ // the number of steps which are needed to complete the process
+ if ( slow->isChecked() )
+ progress->setTotalSteps( 10000 );
+ else if ( normal->isChecked() )
+ progress->setTotalSteps( 1000 );
+ else
+ progress->setTotalSteps( 50 );
+
+ // disable the speed-radiobuttons
+ slow->setEnabled( FALSE );
+ normal->setEnabled( FALSE );
+ fast->setEnabled( FALSE );
+ }
+
+ // If the progress is not running...
+ if ( !timer.isActive() ) {
+ // ...start the timer (and so the progress) with a interval of 1 ms...
+ timer.start( 1 );
+ // ...and rename the start/pause/continue button to Pause
+ start->setText( "&Pause" );
+ } else { // if the prgress is running...
+ // ...stop the timer (and so the prgress)...
+ timer.stop();
+ // ...and rename the start/pause/continue button to Continue
+ start->setText( "&Continue" );
+ }
+}
+
+/*
+ * SLOT slotReset
+ *
+ * This SLOT is called when the user clicks the reset button
+ */
+
+void ProgressBar::slotReset()
+{
+ // stop the timer and progress
+ timer.stop();
+
+ // rename the start/pause/continue button to Start...
+ start->setText( "&Start" );
+ // ...and enable this button
+ start->setEnabled( TRUE );
+
+ // enable the speed-radiobuttons
+ slow->setEnabled( TRUE );
+ normal->setEnabled( TRUE );
+ fast->setEnabled( TRUE );
+
+ // reset the progressbar
+ progress->reset();
+}
+
+/*
+ * SLOT slotTimeout
+ *
+ * This SLOT is called each ms when the timer is
+ * active (== progress is running)
+ */
+
+void ProgressBar::slotTimeout()
+{
+ int p = progress->progress();
+
+#if 1
+ // If the progress is complete...
+ if ( p == progress->totalSteps() ) {
+ // ...rename the start/pause/continue button to Start...
+ start->setText( "&Start" );
+ // ...and disable it...
+ start->setEnabled( FALSE );
+ // ...and return
+ return;
+ }
+#endif
+
+ // If the process is not complete increase it
+ progress->setProgress( ++p );
+}
diff --git a/examples/progressbar/progressbar.doc b/examples/progressbar/progressbar.doc
new file mode 100644
index 000000000..6950c7295
--- /dev/null
+++ b/examples/progressbar/progressbar.doc
@@ -0,0 +1,29 @@
+
+/*
+*/
+/*! \page progressbar-example.html
+
+ \ingroup examples
+ \title Progress Bar
+
+ This example shows how to use a progress bar.
+
+ <hr>
+
+ Header file:
+
+ \include progressbar/progressbar.h
+
+ <hr>
+
+ Implementation:
+
+ \include progressbar/progressbar.cpp
+
+ <hr>
+
+ Main:
+
+ \include progressbar/main.cpp
+*/
+
diff --git a/examples/progressbar/progressbar.h b/examples/progressbar/progressbar.h
new file mode 100644
index 000000000..0fe4bc4a1
--- /dev/null
+++ b/examples/progressbar/progressbar.h
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef PROGRESSBAR_H
+#define PROGRESSBAR_H
+
+#include <qbuttongroup.h>
+#include <qtimer.h>
+
+class TQRadioButton;
+class TQPushButton;
+class TQProgressBar;
+
+class ProgressBar : public TQButtonGroup
+{
+ Q_OBJECT
+
+public:
+ ProgressBar( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ TQRadioButton *slow, *normal, *fast;
+ TQPushButton *start, *pause, *reset;
+ TQProgressBar *progress;
+ TQTimer timer;
+
+protected slots:
+ void slotStart();
+ void slotReset();
+ void slotTimeout();
+
+};
+
+#endif
diff --git a/examples/progressbar/progressbar.pro b/examples/progressbar/progressbar.pro
new file mode 100644
index 000000000..9b25197cd
--- /dev/null
+++ b/examples/progressbar/progressbar.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = progressbar
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = progressbar.h
+SOURCES = main.cpp \
+ progressbar.cpp
diff --git a/examples/qdir/qdir.cpp b/examples/qdir/qdir.cpp
new file mode 100644
index 000000000..f936a31f0
--- /dev/null
+++ b/examples/qdir/qdir.cpp
@@ -0,0 +1,359 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "../dirview/dirview.h"
+#include "qdir.h"
+
+#include <qapplication.h>
+#include <qtextview.h>
+#include <qfileinfo.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qhbox.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qmultilineedit.h>
+#include <qheader.h>
+#include <qevent.h>
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qtoolbutton.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qtooltip.h>
+
+#include <stdlib.h>
+
+/* XPM */
+static const char *bookmarks[]={
+ "22 14 8 1",
+ "# c #000080",
+ "a c #585858",
+ "b c #000000",
+ "c c #ffffff",
+ "d c #ffffff",
+ "e c #ffffff",
+ "f c #000000",
+ ". c None",
+ "...bb.................",
+ "..bacb....bbb.........",
+ "..badcb.bbccbab.......",
+ "..bacccbadccbab.......",
+ "..baecdbcccdbab.......",
+ "..bacccbacccbab.......",
+ "..badcdbcecdfab.......",
+ "..bacecbacccbab.......",
+ "..baccdbcccdbab.......",
+ "...badcbacdbbab.......",
+ "....bacbcbbccab.......",
+ ".....babbaaaaab.......",
+ ".....bbabbbbbbb.......",
+ "......bb.............."
+};
+
+/* XPM */
+static const char *home[]={
+ "16 15 4 1",
+ "# c #000000",
+ "a c #ffffff",
+ "b c #c0c0c0",
+ ". c None",
+ ".......##.......",
+ "..#...####......",
+ "..#..#aabb#.....",
+ "..#.#aaaabb#....",
+ "..##aaaaaabb#...",
+ "..#aaaaaaaabb#..",
+ ".#aaaaaaaaabbb#.",
+ "###aaaaaaaabb###",
+ "..#aaaaaaaabb#..",
+ "..#aaa###aabb#..",
+ "..#aaa#.#aabb#..",
+ "..#aaa#.#aabb#..",
+ "..#aaa#.#aabb#..",
+ "..#aaa#.#aabb#..",
+ "..#####.######.."
+};
+
+// ****************************************************************************************************
+
+PixmapView::PixmapView( TQWidget *parent )
+ : TQScrollView( parent )
+{
+ viewport()->setBackgroundMode( PaletteBase );
+}
+
+void PixmapView::setPixmap( const TQPixmap &pix )
+{
+ pixmap = pix;
+ resizeContents( pixmap.size().width(), pixmap.size().height() );
+ viewport()->repaint( FALSE );
+}
+
+void PixmapView::drawContents( TQPainter *p, int cx, int cy, int cw, int ch )
+{
+ p->fillRect( cx, cy, cw, ch, colorGroup().brush( TQColorGroup::Base ) );
+ p->drawPixmap( 0, 0, pixmap );
+}
+
+// ****************************************************************************************************
+
+Preview::Preview( TQWidget *parent )
+ : TQWidgetStack( parent )
+{
+ normalText = new TQMultiLineEdit( this );
+ normalText->setReadOnly( TRUE );
+ html = new TQTextView( this );
+ pixmap = new PixmapView( this );
+ raiseWidget( normalText );
+}
+
+void Preview::showPreview( const TQUrl &u, int size )
+{
+ if ( u.isLocalFile() ) {
+ TQString path = u.path();
+ TQFileInfo fi( path );
+ if ( fi.isFile() && (int)fi.size() > size * 1000 ) {
+ normalText->setText( tr( "The File\n%1\nis too large, so I don't show it!" ).arg( path ) );
+ raiseWidget( normalText );
+ return;
+ }
+
+ TQPixmap pix( path );
+ if ( pix.isNull() ) {
+ if ( fi.isFile() ) {
+ TQFile f( path );
+ if ( f.open( IO_ReadOnly ) ) {
+ TQTextStream ts( &f );
+ TQString text = ts.read();
+ f.close();
+ if ( fi.extension().lower().contains( "htm" ) ) {
+ TQString url = html->mimeSourceFactory()->makeAbsolute( path, html->context() );
+ html->setText( text, url );
+ raiseWidget( html );
+ return;
+ } else {
+ normalText->setText( text );
+ raiseWidget( normalText );
+ return;
+ }
+ }
+ }
+ normalText->setText( TQString::null );
+ raiseWidget( normalText );
+ } else {
+ pixmap->setPixmap( pix );
+ raiseWidget( pixmap );
+ }
+ } else {
+ normalText->setText( "I only show local files!" );
+ raiseWidget( normalText );
+ }
+}
+
+// ****************************************************************************************************
+
+PreviewWidget::PreviewWidget( TQWidget *parent )
+ : TQVBox( parent ), TQFilePreview()
+{
+ setSpacing( 5 );
+ setMargin( 5 );
+ TQHBox *row = new TQHBox( this );
+ row->setSpacing( 5 );
+ (void)new TQLabel( tr( "Only show files smaller than: " ), row );
+ sizeSpinBox = new TQSpinBox( 1, 10000, 1, row );
+ sizeSpinBox->setSuffix( " KB" );
+ sizeSpinBox->setValue( 64 );
+ row->setFixedHeight( 10 + sizeSpinBox->sizeHint().height() );
+ preview = new Preview( this );
+}
+
+void PreviewWidget::previewUrl( const TQUrl &u )
+{
+ preview->showPreview( u, sizeSpinBox->value() );
+}
+
+// ****************************************************************************************************
+
+CustomFileDialog::CustomFileDialog()
+ : TQFileDialog( 0, 0, TRUE )
+{
+ setDir( "/" );
+
+ dirView = new DirectoryView( this, 0, TRUE );
+ dirView->addColumn( "" );
+ dirView->header()->hide();
+ ::Directory *root = new ::Directory( dirView, "/" );
+ root->setOpen( TRUE );
+ dirView->setFixedWidth( 150 );
+
+ addLeftWidget( dirView );
+
+ TQPushButton *p = new TQPushButton( this );
+ p->setPixmap( TQPixmap( bookmarks ) );
+ TQToolTip::add( p, tr( "Bookmarks" ) );
+
+ bookmarkMenu = new TQPopupMenu( this );
+ connect( bookmarkMenu, SIGNAL( activated( int ) ),
+ this, SLOT( bookmarkChosen( int ) ) );
+ addId = bookmarkMenu->insertItem( tr( "Add bookmark" ) );
+ bookmarkMenu->insertSeparator();
+
+ TQFile f( ".bookmarks" );
+ if ( f.open( IO_ReadOnly ) ) {
+ TQDataStream ds( &f );
+ ds >> bookmarkList;
+ f.close();
+
+ TQStringList::Iterator it = bookmarkList.begin();
+ for ( ; it != bookmarkList.end(); ++it ) {
+ bookmarkMenu->insertItem( *it );
+ }
+ }
+
+ p->setPopup( bookmarkMenu );
+
+ addToolButton( p, TRUE );
+
+ connect( dirView, SIGNAL( folderSelected( const TQString & ) ),
+ this, SLOT( setDir2( const TQString & ) ) );
+ connect( this, SIGNAL( dirEntered( const TQString & ) ),
+ dirView, SLOT( setDir( const TQString & ) ) );
+
+ TQToolButton *b = new TQToolButton( this );
+ TQToolTip::add( b, tr( "Go Home!" ) );
+ b->setPixmap( TQPixmap( home ) );
+ connect( b, SIGNAL( clicked() ),
+ this, SLOT( goHome() ) );
+
+ addToolButton( b );
+
+ resize( width() + width() / 3, height() );
+}
+
+CustomFileDialog::~CustomFileDialog()
+{
+ if ( !bookmarkList.isEmpty() ) {
+ TQFile f( ".bookmarks" );
+ if ( f.open( IO_WriteOnly ) ) {
+ TQDataStream ds( &f );
+ ds << bookmarkList;
+ f.close();
+ }
+ }
+}
+
+void CustomFileDialog::setDir2( const TQString &s )
+{
+ blockSignals( TRUE );
+ setDir( s );
+ blockSignals( FALSE );
+}
+
+void CustomFileDialog::showEvent( TQShowEvent *e )
+{
+ TQFileDialog::showEvent( e );
+ dirView->setDir( dirPath() );
+}
+
+void CustomFileDialog::bookmarkChosen( int i )
+{
+ if ( i == addId ) {
+ bookmarkList << dirPath();
+ bookmarkMenu->insertItem( dirPath() );
+ } else {
+ setDir( bookmarkMenu->text( i ) );
+ }
+}
+
+void CustomFileDialog::goHome()
+{
+ if ( getenv( "HOME" ) )
+ setDir( getenv( "HOME" ) );
+ else
+ setDir( "/" );
+}
+
+// ****************************************************************************************************
+
+int main( int argc, char ** argv )
+{
+ TQFileDialog::Mode mode = TQFileDialog::ExistingFile;
+ TQString start;
+ TQString filter;
+ TQString caption;
+ bool preview = FALSE;
+ bool custom = FALSE;
+ TQApplication a( argc, argv );
+ for (int i=1; i<argc; i++) {
+ TQString arg = argv[i];
+ if ( arg == "-any" )
+ mode = TQFileDialog::AnyFile;
+ else if ( arg == "-dir" )
+ mode = TQFileDialog::Directory;
+ else if ( arg == "-default" )
+ start = argv[++i];
+ else if ( arg == "-filter" )
+ filter = argv[++i];
+ else if ( arg == "-preview" )
+ preview = TRUE;
+ else if ( arg == "-custom" )
+ custom = TRUE;
+ else if ( arg[0] == '-' ) {
+ qDebug("Usage: qdir [-any | -dir | -custom] [-preview] [-default f] {-filter f} [caption ...]\n"
+ " -any Get any filename, need not exist.\n"
+ " -dir Return a directory rather than a file.\n"
+ " -custom Opens a customized TQFileDialog with \n"
+ " dir browser, bookmark menu, etc.\n"
+ " -preview Show a preview widget.\n"
+ " -default f Start from directory/file f.\n"
+ " -filter f eg. '*.gif' '*.bmp'\n"
+ " caption ... Caption for dialog.\n"
+ );
+ return 1;
+ } else {
+ if ( !caption.isNull() )
+ caption += ' ';
+ caption += arg;
+ }
+ }
+
+ if ( !start )
+ start = TQDir::currentDirPath();
+
+ if ( !caption )
+ caption = mode == TQFileDialog::Directory
+ ? "Choose directory..." : "Choose file...";
+
+ if ( !custom ) {
+ TQFileDialog fd( TQString::null, filter, 0, 0, TRUE );
+ fd.setMode( mode );
+ if ( preview ) {
+ fd.setContentsPreviewEnabled( TRUE );
+ PreviewWidget *pw = new PreviewWidget( &fd );
+ fd.setContentsPreview( pw, pw );
+ fd.setViewMode( TQFileDialog::List );
+ fd.setPreviewMode( TQFileDialog::Contents );
+ }
+ fd.setCaption( caption );
+ fd.setSelection( start );
+ if ( fd.exec() == TQDialog::Accepted ) {
+ TQString result = fd.selectedFile();
+ printf("%s\n", (const char*)result);
+ return 0;
+ } else {
+ return 1;
+ }
+ } else {
+ CustomFileDialog fd;
+ fd.exec();
+ return 1;
+ }
+}
diff --git a/examples/qdir/qdir.doc b/examples/qdir/qdir.doc
new file mode 100644
index 000000000..624cbd583
--- /dev/null
+++ b/examples/qdir/qdir.doc
@@ -0,0 +1,15 @@
+/*
+*/
+/*! \page qdir-example.html
+
+ \ingroup examples
+ \title QDir
+
+
+ <hr>
+
+ Main:
+
+ \include qdir/qdir.cpp
+*/
+
diff --git a/examples/qdir/qdir.h b/examples/qdir/qdir.h
new file mode 100644
index 000000000..86dde7072
--- /dev/null
+++ b/examples/qdir/qdir.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TQDIREXAMPLE_H
+#define TQDIREXAMPLE_H
+
+#include <qscrollview.h>
+#include <qfiledialog.h>
+#include <qwidgetstack.h>
+#include <qvbox.h>
+#include <qurl.h>
+#include <qpixmap.h>
+#include <qstringlist.h>
+
+class TQMultiLineEdit;
+class TQTextView;
+class DirectoryView;
+class TQSpinBox;
+class TQShowEvent;
+class TQPopupMenu;
+
+class PixmapView : public TQScrollView
+{
+ Q_OBJECT
+
+public:
+ PixmapView( TQWidget *parent );
+ void setPixmap( const TQPixmap &pix );
+ void drawContents( TQPainter *p, int, int, int, int );
+
+private:
+ TQPixmap pixmap;
+
+};
+
+class Preview : public TQWidgetStack
+{
+ Q_OBJECT
+
+public:
+ Preview( TQWidget *parent );
+ void showPreview( const TQUrl &u, int size );
+
+private:
+ TQMultiLineEdit *normalText;
+ TQTextView *html;
+ PixmapView *pixmap;
+
+};
+
+class PreviewWidget : public TQVBox,
+ public TQFilePreview
+{
+ Q_OBJECT
+
+public:
+ PreviewWidget( TQWidget *parent );
+ void previewUrl( const TQUrl &u );
+
+private:
+ TQSpinBox *sizeSpinBox;
+ Preview *preview;
+
+};
+
+class CustomFileDialog : public TQFileDialog
+{
+ Q_OBJECT
+
+public:
+ CustomFileDialog();
+ ~CustomFileDialog();
+
+protected:
+ void showEvent( TQShowEvent *e );
+
+public slots:
+ void setDir2( const TQString & );
+
+private slots:
+ void bookmarkChosen( int i );
+ void goHome();
+
+private:
+ DirectoryView *dirView;
+ TQPopupMenu *bookmarkMenu;
+ TQStringList bookmarkList;
+ int addId;
+
+};
+
+#endif
diff --git a/examples/qdir/qdir.pro b/examples/qdir/qdir.pro
new file mode 100644
index 000000000..fa7a0f685
--- /dev/null
+++ b/examples/qdir/qdir.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = qdir
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = qdir.h ../dirview/dirview.h
+SOURCES = qdir.cpp ../dirview/dirview.cpp
diff --git a/examples/qfd/fontdisplayer.cpp b/examples/qfd/fontdisplayer.cpp
new file mode 100644
index 000000000..eecb16143
--- /dev/null
+++ b/examples/qfd/fontdisplayer.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "fontdisplayer.h"
+#include <qapplication.h>
+#include <qslider.h>
+#include <qspinbox.h>
+#include <qpainter.h>
+#include <qtoolbar.h>
+#include <qstatusbar.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qfontdialog.h>
+#include <stdlib.h>
+
+
+FontRowTable::FontRowTable( TQWidget* parent, const char* name ) :
+ TQFrame(parent,name)
+{
+ setBackgroundMode(PaletteBase);
+ setFrameStyle(Panel|Sunken);
+ setMargin(8);
+ setRow(0);
+ tablefont = TQApplication::font();
+}
+
+TQSize FontRowTable::sizeHint() const
+{
+ return 24*cellSize()+TQSize(2,2)*(margin()+frameWidth());
+}
+
+TQSize FontRowTable::cellSize() const
+{
+ TQFontMetrics fm = fontMetrics();
+ return TQSize( fm.maxWidth(), fm.lineSpacing()+1 );
+}
+
+void FontRowTable::paintEvent( TQPaintEvent* e )
+{
+ TQFrame::paintEvent(e);
+ TQPainter p(this);
+ p.setClipRegion(e->region());
+ TQRect r = e->rect();
+ TQFontMetrics fm = fontMetrics();
+ int ml = frameWidth()+margin() + 1 + TQMAX(0,-fm.minLeftBearing());
+ int mt = frameWidth()+margin();
+ TQSize cell((width()-15-ml)/16,(height()-15-mt)/16);
+
+ if ( !cell.width() || !cell.height() )
+ return;
+
+ int mini = r.left() / cell.width();
+ int maxi = (r.right()+cell.width()-1) / cell.width();
+ int minj = r.top() / cell.height();
+ int maxj = (r.bottom()+cell.height()-1) / cell.height();
+
+ int h = fm.height();
+
+ TQColor body(255,255,192);
+ TQColor negative(255,192,192);
+ TQColor positive(192,192,255);
+ TQColor rnegative(255,128,128);
+ TQColor rpositive(128,128,255);
+
+ for (int j = minj; j<=maxj; j++) {
+ for (int i = mini; i<=maxi; i++) {
+ if ( i < 16 && j < 16 ) {
+ int x = i*cell.width();
+ int y = j*cell.height();
+
+ TQChar ch = TQChar(j*16+i,row);
+
+ if ( fm.inFont(ch) ) {
+ int w = fm.width(ch);
+ int l = fm.leftBearing(ch);
+ int r = fm.rightBearing(ch);
+
+ x += ml;
+ y += mt+h;
+
+ p.fillRect(x,y,w,-h,body);
+ if ( w ) {
+ if ( l ) {
+ p.fillRect(x+(l>0?0:l), y-h/2, abs(l),-h/2,
+ l < 0 ? negative : positive);
+ }
+ if ( r ) {
+ p.fillRect(x+w-(r>0?r:0),y+2, abs(r),-h/2,
+ r < 0 ? rnegative : rpositive);
+ }
+ }
+ TQString s;
+ s += ch;
+ p.setPen(TQPen(TQt::black));
+ p.drawText(x,y,s);
+ }
+ }
+ }
+ }
+}
+
+void FontRowTable::setRow(int r)
+{
+ row = r;
+
+ TQFontMetrics fm = fontMetrics();
+ TQFontInfo fi = fontInfo();
+ TQString str = TQString("%1 %2pt%3%4 mLB=%5 mRB=%6 mW=%7")
+ .arg(fi.family())
+ .arg(fi.pointSize())
+ .arg(fi.bold() ? " bold" : "")
+ .arg(fi.italic() ? " italic" : "")
+ .arg(fm.minLeftBearing())
+ .arg(fm.minRightBearing())
+ .arg(fm.maxWidth());
+
+ emit fontInformation(str);
+ update();
+}
+
+void FontRowTable::chooseFont()
+{
+ bool ok;
+ TQFont oldfont = tablefont;
+ tablefont = TQFontDialog::getFont(&ok, oldfont, this);
+
+ if (ok)
+ setFont(tablefont);
+ else
+ tablefont = oldfont;
+}
+
+FontDisplayer::FontDisplayer( TQWidget* parent, const char* name ) :
+ TQMainWindow(parent,name)
+{
+ FontRowTable* table = new FontRowTable(this);
+ TQToolBar* controls = new TQToolBar(this);
+ (void) new TQLabel(tr("Row:"), controls);
+ TQSpinBox *row = new TQSpinBox(0,255,1,controls);
+ controls->addSeparator();
+ TQPushButton *fontbutton = new TQPushButton(tr("Font..."), controls);
+
+ connect(row,SIGNAL(valueChanged(int)),table,SLOT(setRow(int)));
+ connect(fontbutton, SIGNAL(clicked()), table, SLOT(chooseFont()));
+ connect(table,SIGNAL(fontInformation(const TQString&)),
+ statusBar(),SLOT(message(const TQString&)));
+ table->setRow(0);
+ setCentralWidget(table);
+}
diff --git a/examples/qfd/fontdisplayer.h b/examples/qfd/fontdisplayer.h
new file mode 100644
index 000000000..6d42aa52e
--- /dev/null
+++ b/examples/qfd/fontdisplayer.h
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef FontDisplayer_H
+#define FontDisplayer_H
+
+#include <qframe.h>
+#include <qmainwindow.h>
+
+class TQSlider;
+
+class FontRowTable : public TQFrame {
+ Q_OBJECT
+public:
+ FontRowTable( TQWidget* parent=0, const char* name=0 );
+
+ TQSize sizeHint() const;
+
+signals:
+ void fontInformation(const TQString&);
+
+public slots:
+ void setRow(int);
+ void chooseFont();
+
+
+protected:
+ TQSize cellSize() const;
+ void paintEvent( TQPaintEvent* );
+private:
+ TQFont tablefont;
+ int row;
+};
+
+class FontDisplayer : public TQMainWindow {
+ Q_OBJECT
+public:
+ FontDisplayer( TQWidget* parent=0, const char* name=0 );
+};
+
+#endif
diff --git a/examples/qfd/qfd.cpp b/examples/qfd/qfd.cpp
new file mode 100644
index 000000000..b52362543
--- /dev/null
+++ b/examples/qfd/qfd.cpp
@@ -0,0 +1,32 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "fontdisplayer.h"
+
+#include <qapplication.h>
+#include <qslider.h>
+#include <qpainter.h>
+#include <qstatusbar.h>
+
+
+
+int main(int argc, char** argv)
+{
+ TQApplication app(argc,argv);
+
+ FontDisplayer m;
+ TQSize sh = m.centralWidget()->sizeHint();
+ m.resize(sh.width(),
+ sh.height()+3*m.statusBar()->height());
+ app.setMainWidget(&m);
+ m.setCaption("TQt Example - TQFD");
+ m.show();
+
+ return app.exec();
+}
diff --git a/examples/qfd/qfd.doc b/examples/qfd/qfd.doc
new file mode 100644
index 000000000..dc9360c21
--- /dev/null
+++ b/examples/qfd/qfd.doc
@@ -0,0 +1,28 @@
+/*
+*/
+/*! \page qfd-example.html
+
+ \ingroup examples
+ \title Font Displayer
+
+ This example program displays all characters of a font.
+
+ <hr>
+
+ Header file:
+
+ \include qfd/fontdisplayer.h
+
+ <hr>
+
+ Implementation:
+
+ \include qfd/fontdisplayer.cpp
+
+ <hr>
+
+ Main:
+
+ \include qfd/qfd.cpp
+*/
+
diff --git a/examples/qfd/qfd.pro b/examples/qfd/qfd.pro
new file mode 100644
index 000000000..6f1ae2487
--- /dev/null
+++ b/examples/qfd/qfd.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = qfd
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+REQUIRES = full-config
+
+HEADERS = fontdisplayer.h
+SOURCES = fontdisplayer.cpp \
+ qfd.cpp
diff --git a/examples/qmag/README b/examples/qmag/README
new file mode 100644
index 000000000..df10244e1
--- /dev/null
+++ b/examples/qmag/README
@@ -0,0 +1,6 @@
+The qmag program can magnify portions of the screen to let you see
+things at a pixel level.
+
+Run it, resize it appropriately, click inside, then click where you want
+to grab. Set magnification factor and auto-refresh as desired.
+
diff --git a/examples/qmag/qmag.cpp b/examples/qmag/qmag.cpp
new file mode 100644
index 000000000..e747bab40
--- /dev/null
+++ b/examples/qmag/qmag.cpp
@@ -0,0 +1,389 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qfiledialog.h>
+#include <qregexp.h>
+
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qwmatrix.h>
+
+
+class MagWidget : public TQWidget
+{
+ Q_OBJECT
+public:
+ MagWidget( TQWidget *parent=0, const char *name=0 );
+
+public slots:
+ void setZoom( int );
+ void setRefresh( int );
+ void save();
+ void multiSave();
+
+protected:
+ void paintEvent( TQPaintEvent * );
+ void mousePressEvent( TQMouseEvent * );
+ void mouseReleaseEvent( TQMouseEvent * );
+ void mouseMoveEvent( TQMouseEvent * );
+ void focusOutEvent( TQFocusEvent * );
+ void timerEvent( TQTimerEvent * );
+ void resizeEvent( TQResizeEvent * );
+
+private:
+ void grabAround(TQPoint pos);
+ void grab();
+
+ TQComboBox *zoom;
+ TQComboBox *refresh;
+ TQPushButton *saveButton;
+ TQPushButton *multiSaveButton;
+ TQPushButton *tquitButton;
+ TQPixmap pm; // pixmap, magnified
+ TQPixmap p; // pixmap
+ TQImage image; // image of pixmap (for RGB)
+ TQLabel *rgb;
+ int yoffset; // pixels in addition to the actual picture
+ int z; // magnification factor
+ int r; // autorefresh rate (index into refreshrates)
+ bool grabbing; // TRUE if qmag is currently grabbing
+ int grabx, graby;
+ TQString multifn; // filename for multisave
+};
+
+
+#ifdef COMPLEX_GUI
+static const char *zoomfactors[] = {
+ "100%", "200%", "300%", "400%", "500%",
+ "600%", "700%", "800%", "1600%", 0 };
+
+static const char *refreshrates[] = {
+ "No autorefresh", "50 per second", "4 per second", "3 per second", "2 per second",
+ "Every second", "Every two seconds", "Every three seconds",
+ "Every five seconds", "Every ten seconds", 0 };
+#endif
+
+static const int timer[] = {
+ 0, 20, 250, 333, 500, 1000, 2000, 3000, 5000, 10000 };
+
+
+MagWidget::MagWidget( TQWidget *parent, const char *name )
+ : TQWidget( parent, name)
+{
+ z = 1; // default zoom (100%)
+ r = 0; // default refresh (none)
+
+#ifdef COMPLEX_GUI
+ int w=0, x=0, n;
+
+ zoom = new TQComboBox( FALSE, this );
+ Q_CHECK_PTR(zoom);
+ zoom->insertStrList( zoomfactors, 9 );
+ connect( zoom, SIGNAL(activated(int)), SLOT(setZoom(int)) );
+
+ refresh = new TQComboBox( FALSE, this );
+ Q_CHECK_PTR(refresh);
+ refresh->insertStrList( refreshrates, 9 );
+ connect( refresh, SIGNAL(activated(int)), SLOT(setRefresh(int)) );
+
+ for( n=0; n<9; n++) {
+ int w2 = zoom->fontMetrics().width( zoomfactors[n] );
+ w = TQMAX(w2, w);
+ }
+ zoom->setGeometry( 2, 2, w+30, 20 );
+
+ x = w+34;
+ w = 0;
+ for( n=0; n<9; n++) {
+ int w2 = refresh->fontMetrics().width( refreshrates[n] );
+ w = TQMAX(w2, w);
+ }
+ refresh->setGeometry( x, 2, w+30, 20 );
+
+ saveButton = new TQPushButton( this );
+ Q_CHECK_PTR(saveButton);
+ connect( saveButton, SIGNAL(clicked()), this, SLOT(save()) );
+ saveButton->setText( "Save" );
+ saveButton->setGeometry( x+w+30+2, 2,
+ 10+saveButton->fontMetrics().width("Save"), 20 );
+
+ multiSaveButton = new TQPushButton( this );
+ multiSaveButton->setToggleButton(TRUE);
+ Q_CHECK_PTR(multiSaveButton);
+ connect( multiSaveButton, SIGNAL(clicked()), this, SLOT(multiSave()) );
+ multiSaveButton->setText( "MultiSave" );
+ multiSaveButton->setGeometry( saveButton->geometry().right() + 2, 2,
+ 10+multiSaveButton->fontMetrics().width("MultiSave"), 20 );
+
+ tquitButton = new TQPushButton( this );
+ Q_CHECK_PTR(tquitButton);
+ connect( tquitButton, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+ tquitButton->setText( "Quit" );
+ tquitButton->setGeometry( multiSaveButton->geometry().right() + 2, 2,
+ 10+tquitButton->fontMetrics().width("Quit"), 20 );
+#else
+ zoom = 0;
+ multiSaveButton = 0;
+#endif
+
+ setRefresh(1);
+ setZoom(5);
+
+ rgb = new TQLabel( this );
+ Q_CHECK_PTR( rgb );
+ rgb->setText( "" );
+ rgb->setAlignment( AlignVCenter );
+ rgb->resize( width(), rgb->fontMetrics().height() + 4 );
+
+#ifdef COMPLEX_GUI
+ yoffset = zoom->height() // top buttons
+ + 4 // space around top buttons
+ + rgb->height(); // color-value text height
+ setMinimumSize( tquitButton->pos().x(), yoffset+20 );
+ resize( tquitButton->geometry().topRight().x() + 2, yoffset+60 );
+#else
+ yoffset = 0;
+ resize(350,350);
+#endif
+
+ grabx = graby = -1;
+ grabbing = FALSE;
+
+ setMouseTracking( TRUE ); // and do let me know what pixel I'm at, eh?
+
+ grabAround( TQPoint(grabx=qApp->desktop()->width()/2, graby=qApp->desktop()->height()/2) );
+}
+
+
+void MagWidget::setZoom( int index )
+{
+ if (index == 8)
+ z = 16;
+ else
+ z = index+1;
+ grab();
+}
+
+
+void MagWidget::setRefresh( int index )
+{
+ r = index;
+ killTimers();
+ if (index && !grabbing)
+ startTimer( timer[r] );
+}
+
+
+void MagWidget::save()
+{
+ if ( !p.isNull() ) {
+ killTimers();
+ TQString fn = TQFileDialog::getSaveFileName();
+ if ( !fn.isEmpty() )
+ p.save( fn, "BMP" );
+ if ( r )
+ startTimer( timer[r] );
+ }
+}
+
+void MagWidget::multiSave()
+{
+ if ( !p.isNull() ) {
+ multifn = ""; // stops saving
+ multifn = TQFileDialog::getSaveFileName();
+ if ( multifn.isEmpty() )
+ multiSaveButton->setOn(FALSE);
+ if ( !r )
+ p.save( multifn, "BMP" );
+ } else {
+ multiSaveButton->setOn(FALSE);
+ }
+}
+
+
+void MagWidget::grab()
+{
+ if ( !isVisible() )
+ return; // don't eat resources when iconified
+
+ if ( grabx < 0 || graby < 0 )
+ return; // don't grab until the user has said to
+
+ int x,y, w,h;
+
+ w = (width()+z-1)/z;
+ h = (height()+z-1-yoffset)/z;
+ if ( w<1 || h<1 )
+ return; // don't ask too much from the window system :)
+
+ x = grabx-w/2; // find a suitable position to grab from
+ y = graby-h/2;
+ if ( x + w > TQApplication::desktop()->width() )
+ x = TQApplication::desktop()->width()-w;
+ else if ( x < 0 )
+ x = 0;
+ if ( y + h > TQApplication::desktop()->height() )
+ y = TQApplication::desktop()->height()-h;
+ else if ( y < 0 )
+ y = 0;
+
+ p = TQPixmap::grabWindow( TQApplication::desktop()->winId(), x, y, w, h );
+ image = p.convertToImage();
+ TQWMatrix m; // after getting it, scale it
+ m.scale( (double)z, (double)z );
+ pm = p.xForm( m );
+
+ if ( !multiSaveButton || !multiSaveButton->isOn() )
+ repaint( FALSE ); // and finally repaint, flicker-free
+}
+
+
+void MagWidget::paintEvent( TQPaintEvent * )
+{
+ if ( !pm.isNull() ) {
+ TQPainter paint( this );
+ paint.drawPixmap( 0, zoom ? zoom->height()+4 : 0, pm,
+ 0,0, width(), height()-yoffset );
+ }
+}
+
+
+void MagWidget::mousePressEvent( TQMouseEvent *e )
+{
+ if ( !grabbing ) { // prepare to grab...
+ grabbing = TRUE;
+ killTimers();
+ grabMouse( crossCursor );
+ grabx = -1;
+ graby = -1;
+ } else { // REALLY prepare to grab
+ grabx = mapToGlobal(e->pos()).x();
+ graby = mapToGlobal(e->pos()).y();
+ }
+}
+
+
+
+void MagWidget::mouseReleaseEvent( TQMouseEvent * e )
+{
+ if ( grabbing && grabx >= 0 && graby >= 0 ) {
+ grabbing = FALSE;
+ grabAround(e->pos());
+ releaseMouse();
+ }
+}
+
+void MagWidget::grabAround(TQPoint pos)
+{
+ int rx, ry;
+ rx = mapToGlobal(pos).x();
+ ry = mapToGlobal(pos).y();
+ int w = TQABS(rx-grabx);
+ int h = TQABS(ry-graby);
+ if ( w > 10 && h > 10 ) {
+ int pz;
+ pz = 1;
+ while ( w*pz*h*pz < width()*(height()-yoffset) &&
+ w*pz < TQApplication::desktop()->width() &&
+ h*pz < TQApplication::desktop()->height() )
+ pz++;
+ if ( (w*pz*h*pz - width()*(height()-yoffset)) >
+ (width()*(height()-yoffset) - w*(pz-1)*h*(pz-1)) )
+ pz--;
+ if ( pz < 1 )
+ pz = 1;
+ if ( pz > 8 )
+ pz = 8;
+ if ( zoom )
+ zoom->setCurrentItem( pz-1 );
+
+ z = pz;
+ grabx = TQMIN(rx, grabx) + w/2;
+ graby = TQMIN(ry, graby) + h/2;
+ resize( w*z, h*z+yoffset );
+ }
+ grab();
+ if ( r )
+ startTimer( timer[r] );
+}
+
+
+void MagWidget::mouseMoveEvent( TQMouseEvent *e )
+{
+ if ( grabbing || pm.isNull() ||
+ e->pos().y() > height() - (zoom ? zoom->fontMetrics().height() - 4 : 0) ||
+ e->pos().y() < (zoom ? zoom->height()+4 : 4) ) {
+ rgb->setText( "" );
+ } else {
+ int x,y;
+ x = e->pos().x() / z;
+ y = (e->pos().y() - ( zoom ? zoom->height() : 0 ) - 4) / z;
+ TQString pixelinfo;
+ if ( image.valid(x,y) )
+ {
+ TQRgb px = image.pixel(x,y);
+ pixelinfo.sprintf(" %3d,%3d,%3d #%02x%02x%02x",
+ qRed(px), qGreen(px), qBlue(px),
+ qRed(px), qGreen(px), qBlue(px));
+ }
+ TQString label;
+ label.sprintf( "x=%d, y=%d %s",
+ x+grabx, y+graby, (const char*)pixelinfo );
+ rgb->setText( label );
+ }
+}
+
+
+void MagWidget::focusOutEvent( TQFocusEvent * )
+{
+ rgb->setText( "" );
+}
+
+
+void MagWidget::timerEvent( TQTimerEvent * )
+{
+ grab();
+/*
+ if ( multiSaveButton->isOn() && !multifn.isEmpty() ) {
+ TQRegExp num("[0-9][0-9]*");
+ int start;
+ int len;
+ if ((start=num.match(multifn,0,&len))>=0)
+ multifn.replace(num,
+ TQString().setNum(multifn.mid(start,len).toInt()+1)
+ );
+ p.save( multifn, "BMP" );
+ }
+*/
+}
+
+
+void MagWidget::resizeEvent( TQResizeEvent * )
+{
+ rgb->setGeometry( 0, height() - rgb->height(), width(), rgb->height() );
+ grab();
+}
+
+
+#include "qmag.moc"
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ MagWidget m;
+ a.setMainWidget( &m );
+ m.show();
+ return a.exec();
+}
diff --git a/examples/qmag/qmag.doc b/examples/qmag/qmag.doc
new file mode 100644
index 000000000..5084f395e
--- /dev/null
+++ b/examples/qmag/qmag.doc
@@ -0,0 +1,23 @@
+/*
+*/
+/*! \page qmag-example.html
+
+ \ingroup examples
+ \title QMag
+
+ This is a simple magnifier-type program. It shows how one can do
+ some tquite low-level operations in a portable way using Qt.
+
+ Run it, click in the magnifier window, then click where you want to
+ magnify or drag out a rectangle. Two combo boxes let you select
+ amplification and refresh frequency, a text label tells you the color
+ of the pixel the cursor is on, and a button lets you save the
+ magnified area as a .bmp file.
+
+ <hr>
+
+ Implementation:
+
+ \include qmag/qmag.cpp
+*/
+
diff --git a/examples/qmag/qmag.pro b/examples/qmag/qmag.pro
new file mode 100644
index 000000000..a19025fce
--- /dev/null
+++ b/examples/qmag/qmag.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = qmag
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = qmag.cpp
diff --git a/examples/qtl/qtl-qvaluelist.doc b/examples/qtl/qtl-qvaluelist.doc
new file mode 100644
index 000000000..e87908a83
--- /dev/null
+++ b/examples/qtl/qtl-qvaluelist.doc
@@ -0,0 +1,19 @@
+/*! \page qtl-qvaluelist-example.html
+
+ \ingroup examples
+ \title A Tiny QTL Example
+
+This tiny example shows a \l{QValueListIterator}.
+
+<hr>
+
+ Implementation:
+
+ \include qtl/qvaluelistiterator.cpp
+
+
+*/
+
+
+
+
diff --git a/examples/qtl/qtl.pro b/examples/qtl/qtl.pro
new file mode 100644
index 000000000..7601f1796
--- /dev/null
+++ b/examples/qtl/qtl.pro
@@ -0,0 +1,7 @@
+TEMPLATE = app
+TARGET = qtl
+
+CONFIG += qt console warn_on release
+
+SOURCES = qvaluelistiterator.cpp
+INTERFACES =
diff --git a/examples/qtl/qvaluelistiterator.cpp b/examples/qtl/qvaluelistiterator.cpp
new file mode 100644
index 000000000..a9c65afa7
--- /dev/null
+++ b/examples/qtl/qvaluelistiterator.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qvaluelist.h>
+#include <qstring.h>
+#include <qwindowdefs.h>
+#include <stdio.h>
+
+
+class Employee
+{
+public:
+ Employee(): s(0) {}
+ Employee( const TQString& name, int salary )
+ : n(name), s(salary) {}
+
+ TQString name() const { return n; }
+
+ int salary() const { return s; }
+ void setSalary( int salary ) { s = salary; }
+
+ // this is here to support very old compilers
+ Q_DUMMY_COMPARISON_OPERATOR( Employee )
+
+private:
+ TQString n;
+ int s;
+};
+
+
+int main( int, char** )
+{
+ typedef TQValueList<Employee> EmployeeList;
+ EmployeeList list;
+
+ list.append( Employee("Bill", 50000) );
+ list.append( Employee("Steve",80000) );
+ list.append( Employee("Ron", 60000) );
+
+ Employee joe( "Joe", 50000 );
+ list.append( joe );
+ joe.setSalary( 4000 );
+
+ EmployeeList::ConstIterator it = list.begin();
+ while( it != list.end() ) {
+ printf( "%s earns %d\n", (*it).name().latin1(), (*it).salary() );
+ ++it;
+ }
+
+ return 0;
+}
diff --git a/examples/qwerty/ANSI_X3.110-1983.map b/examples/qwerty/ANSI_X3.110-1983.map
new file mode 100644
index 000000000..1b7058ecb
--- /dev/null
+++ b/examples/qwerty/ANSI_X3.110-1983.map
@@ -0,0 +1,511 @@
+<code_set_name> ANSI_X3.110-1983
+<comment_char> %
+<escape_char> /
+% version: 1.0
+% repertoiremap: mnemonic,ds
+% source: ECMA registry
+
+% alias ISO-IR-99
+% alias CSA_T500-1983
+% alias NAPLPS
+CHARMAP
+<NU> /x00 <U0000> NULL (NUL)
+<SH> /x01 <U0001> START OF HEADING (SOH)
+<SX> /x02 <U0002> START OF TEXT (STX)
+<EX> /x03 <U0003> END OF TEXT (ETX)
+<ET> /x04 <U0004> END OF TRANSMISSION (EOT)
+<EQ> /x05 <U0005> ENQUIRY (ENQ)
+<AK> /x06 <U0006> ACKNOWLEDGE (ACK)
+<BL> /x07 <U0007> BELL (BEL)
+<BS> /x08 <U0008> BACKSPACE (BS)
+<HT> /x09 <U0009> CHARACTER TABULATION (HT)
+<LF> /x0A <U000A> LINE FEED (LF)
+<VT> /x0B <U000B> LINE TABULATION (VT)
+<FF> /x0C <U000C> FORM FEED (FF)
+<CR> /x0D <U000D> CARRIAGE RETURN (CR)
+<SO> /x0E <U000E> SHIFT OUT (SO)
+<SI> /x0F <U000F> SHIFT IN (SI)
+<DL> /x10 <U0010> DATALINK ESCAPE (DLE)
+<D1> /x11 <U0011> DEVICE CONTROL ONE (DC1)
+<D2> /x12 <U0012> DEVICE CONTROL TWO (DC2)
+<D3> /x13 <U0013> DEVICE CONTROL THREE (DC3)
+<D4> /x14 <U0014> DEVICE CONTROL FOUR (DC4)
+<NK> /x15 <U0015> NEGATIVE ACKNOWLEDGE (NAK)
+<SY> /x16 <U0016> SYNCHRONOUS IDLE (SYN)
+<EB> /x17 <U0017> END OF TRANSMISSION BLOCK (ETB)
+<CN> /x18 <U0018> CANCEL (CAN)
+<EM> /x19 <U0019> END OF MEDIUM (EM)
+<SB> /x1A <U001A> SUBSTITUTE (SUB)
+<EC> /x1B <U001B> ESCAPE (ESC)
+<FS> /x1C <U001C> FILE SEPARATOR (IS4)
+<GS> /x1D <U001D> GROUP SEPARATOR (IS3)
+<RS> /x1E <U001E> RECORD SEPARATOR (IS2)
+<US> /x1F <U001F> UNIT SEPARATOR (IS1)
+<SP> /x20 <U0020> SPACE
+<!> /x21 <U0021> EXCLAMATION MARK
+<"> /x22 <U0022> QUOTATION MARK
+<%> /x25 <U0025> PERCENT SIGN
+<&> /x26 <U0026> AMPERSAND
+<'> /x27 <U0027> APOSTROPHE
+<(> /x28 <U0028> LEFT PARENTHESIS
+<)> /x29 <U0029> RIGHT PARENTHESIS
+<*> /x2A <U002A> ASTERISK
+<+> /x2B <U002B> PLUS SIGN
+<,> /x2C <U002C> COMMA
+<-> /x2D <U002D> HYPHEN-MINUS
+<.> /x2E <U002E> FULL STOP
+<//> /x2F <U002F> SOLIDUS
+<0> /x30 <U0030> DIGIT ZERO
+<1> /x31 <U0031> DIGIT ONE
+<2> /x32 <U0032> DIGIT TWO
+<3> /x33 <U0033> DIGIT THREE
+<4> /x34 <U0034> DIGIT FOUR
+<5> /x35 <U0035> DIGIT FIVE
+<6> /x36 <U0036> DIGIT SIX
+<7> /x37 <U0037> DIGIT SEVEN
+<8> /x38 <U0038> DIGIT EIGHT
+<9> /x39 <U0039> DIGIT NINE
+<:> /x3A <U003A> COLON
+<;> /x3B <U003B> SEMICOLON
+<<> /x3C <U003C> LESS-THAN SIGN
+<=> /x3D <U003D> EQUALS SIGN
+</>> /x3E <U003E> GREATER-THAN SIGN
+<?> /x3F <U003F> QUESTION MARK
+<At> /x40 <U0040> COMMERCIAL AT
+<A> /x41 <U0041> LATIN CAPITAL LETTER A
+<B> /x42 <U0042> LATIN CAPITAL LETTER B
+<C> /x43 <U0043> LATIN CAPITAL LETTER C
+<D> /x44 <U0044> LATIN CAPITAL LETTER D
+<E> /x45 <U0045> LATIN CAPITAL LETTER E
+<F> /x46 <U0046> LATIN CAPITAL LETTER F
+<G> /x47 <U0047> LATIN CAPITAL LETTER G
+<H> /x48 <U0048> LATIN CAPITAL LETTER H
+<I> /x49 <U0049> LATIN CAPITAL LETTER I
+<J> /x4A <U004A> LATIN CAPITAL LETTER J
+<K> /x4B <U004B> LATIN CAPITAL LETTER K
+<L> /x4C <U004C> LATIN CAPITAL LETTER L
+<M> /x4D <U004D> LATIN CAPITAL LETTER M
+<N> /x4E <U004E> LATIN CAPITAL LETTER N
+<O> /x4F <U004F> LATIN CAPITAL LETTER O
+<P> /x50 <U0050> LATIN CAPITAL LETTER P
+<Q> /x51 <U0051> LATIN CAPITAL LETTER Q
+<R> /x52 <U0052> LATIN CAPITAL LETTER R
+<S> /x53 <U0053> LATIN CAPITAL LETTER S
+<T> /x54 <U0054> LATIN CAPITAL LETTER T
+<U> /x55 <U0055> LATIN CAPITAL LETTER U
+<V> /x56 <U0056> LATIN CAPITAL LETTER V
+<W> /x57 <U0057> LATIN CAPITAL LETTER W
+<X> /x58 <U0058> LATIN CAPITAL LETTER X
+<Y> /x59 <U0059> LATIN CAPITAL LETTER Y
+<Z> /x5A <U005A> LATIN CAPITAL LETTER Z
+<<(> /x5B <U005B> LEFT SQUARE BRACKET
+<////> /x5C <U005C> REVERSE SOLIDUS
+<)/>> /x5D <U005D> RIGHT SQUARE BRACKET
+<'/>> /x5E <U005E> CIRCUMFLEX ACCENT
+<_> /x5F <U005F> LOW LINE
+<'!> /x60 <U0060> GRAVE ACCENT
+<a> /x61 <U0061> LATIN SMALL LETTER A
+<b> /x62 <U0062> LATIN SMALL LETTER B
+<c> /x63 <U0063> LATIN SMALL LETTER C
+<d> /x64 <U0064> LATIN SMALL LETTER D
+<e> /x65 <U0065> LATIN SMALL LETTER E
+<f> /x66 <U0066> LATIN SMALL LETTER F
+<g> /x67 <U0067> LATIN SMALL LETTER G
+<h> /x68 <U0068> LATIN SMALL LETTER H
+<i> /x69 <U0069> LATIN SMALL LETTER I
+<j> /x6A <U006A> LATIN SMALL LETTER J
+<k> /x6B <U006B> LATIN SMALL LETTER K
+<l> /x6C <U006C> LATIN SMALL LETTER L
+<m> /x6D <U006D> LATIN SMALL LETTER M
+<n> /x6E <U006E> LATIN SMALL LETTER N
+<o> /x6F <U006F> LATIN SMALL LETTER O
+<p> /x70 <U0070> LATIN SMALL LETTER P
+<q> /x71 <U0071> LATIN SMALL LETTER Q
+<r> /x72 <U0072> LATIN SMALL LETTER R
+<s> /x73 <U0073> LATIN SMALL LETTER S
+<t> /x74 <U0074> LATIN SMALL LETTER T
+<u> /x75 <U0075> LATIN SMALL LETTER U
+<v> /x76 <U0076> LATIN SMALL LETTER V
+<w> /x77 <U0077> LATIN SMALL LETTER W
+<x> /x78 <U0078> LATIN SMALL LETTER X
+<y> /x79 <U0079> LATIN SMALL LETTER Y
+<z> /x7A <U007A> LATIN SMALL LETTER Z
+<(!> /x7B <U007B> LEFT CURLY BRACKET
+<!!> /x7C <U007C> VERTICAL LINE
+<!)> /x7D <U007D> RIGHT CURLY BRACKET
+<'?> /x7E <U007E> TILDE
+<DT> /x7F <U007F> DELETE (DEL)
+<PA> /x80 <U0080> PADDING CHARACTER (PAD)
+<HO> /x81 <U0081> HIGH OCTET PRESET (HOP)
+<BH> /x82 <U0082> BREAK PERMITTED HERE (BPH)
+<NH> /x83 <U0083> NO BREAK HERE (NBH)
+<IN> /x84 <U0084> INDEX (IND)
+<NL> /x85 <U0085> NEXT LINE (NEL)
+<SA> /x86 <U0086> START OF SELECTED AREA (SSA)
+<ES> /x87 <U0087> END OF SELECTED AREA (ESA)
+<HS> /x88 <U0088> CHARACTER TABULATION SET (HTS)
+<HJ> /x89 <U0089> CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
+<VS> /x8A <U008A> LINE TABULATION SET (VTS)
+<PD> /x8B <U008B> PARTIAL LINE FORWARD (PLD)
+<PU> /x8C <U008C> PARTIAL LINE BACKWARD (PLU)
+<RI> /x8D <U008D> REVERSE LINE FEED (RI)
+<S2> /x8E <U008E> SINGLE-SHIFT TWO (SS2)
+<S3> /x8F <U008F> SINGLE-SHIFT THREE (SS3)
+<DC> /x90 <U0090> DEVICE CONTROL STRING (DCS)
+<P1> /x91 <U0091> PRIVATE USE ONE (PU1)
+<P2> /x92 <U0092> PRIVATE USE TWO (PU2)
+<TS> /x93 <U0093> SET TRANSMIT STATE (STS)
+<CC> /x94 <U0094> CANCEL CHARACTER (CCH)
+<MW> /x95 <U0095> MESSAGE WAITING (MW)
+<SG> /x96 <U0096> START OF GUARDED AREA (SPA)
+<EG> /x97 <U0097> END OF GUARDED AREA (EPA)
+<SS> /x98 <U0098> START OF STRING (SOS)
+<GC> /x99 <U0099> SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
+<SC> /x9A <U009A> SINGLE CHARACTER INTRODUCER (SCI)
+<CI> /x9B <U009B> CONTROL SEQUENCE INTRODUCER (CSI)
+<ST> /x9C <U009C> STRING TERMINATOR (ST)
+<OC> /x9D <U009D> OPERATING SYSTEM COMMAND (OSC)
+<PM> /x9E <U009E> PRIVACY MESSAGE (PM)
+<AC> /x9F <U009F> APPLICATION PROGRAM COMMAND (APC)
+<!I> /xA1 <U00A1> INVERTED EXCLAMATION MARK
+<Ct> /xA2 <U00A2> CENT SIGN
+<Pd> /xA3 <U00A3> POUND SIGN
+<DO> /xA4 <U0024> DOLLAR SIGN
+<Ye> /xA5 <U00A5> YEN SIGN
+<Nb> /xA6 <U0023> NUMBER SIGN
+<SE> /xA7 <U00A7> SECTION SIGN
+<Cu> /xA8 <U00A4> CURRENCY SIGN
+<'6> /xA9 <U2018> LEFT SINGLE QUOTATION MARK
+<"6> /xAA <U201C> LEFT DOUBLE QUOTATION MARK
+<<<> /xAB <U00AB> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+<<-> /xAC <U2190> LEFTWARDS ARROW
+<-!> /xAD <U2191> UPWARDS ARROW
+<-/>> /xAE <U2192> RIGHTWARDS ARROW
+<-v> /xAF <U2193> DOWNWARDS ARROW
+<DG> /xB0 <U00B0> DEGREE SIGN
+<+-> /xB1 <U00B1> PLUS-MINUS SIGN
+<2S> /xB2 <U00B2> SUPERSCRIPT TWO
+<3S> /xB3 <U00B3> SUPERSCRIPT THREE
+<*X> /xB4 <U00D7> MULTIPLICATION SIGN
+<My> /xB5 <U00B5> MICRO SIGN
+<PI> /xB6 <U00B6> PILCROW SIGN
+<.M> /xB7 <U00B7> MIDDLE DOT
+<-:> /xB8 <U00F7> DIVISION SIGN
+<'9> /xB9 <U2019> RIGHT SINGLE QUOTATION MARK
+<"9> /xBA <U201D> RIGHT DOUBLE QUOTATION MARK
+</>/>> /xBB <U00BB> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+<14> /xBC <U00BC> VULGAR FRACTION ONE QUARTER
+<12> /xBD <U00BD> VULGAR FRACTION ONE HALF
+<34> /xBE <U00BE> VULGAR FRACTION THREE QUARTERS
+<?I> /xBF <U00BF> INVERTED QUESTION MARK
+<"!> /xC1 <UE002> NON-SPACING GRAVE ACCENT <ISO-IR-103_C1> (not a real character)
+<"'> /xC2 <UE003> NON-SPACING ACUTE ACCENT <ISO-IR-103_C2> (not a real character)
+<"/>> /xC3 <UE004> NON-SPACING CIRCUMFLEX ACCENT <ISO-IR-103_C3> (not a real character)
+<"?> /xC4 <UE005> NON-SPACING TILDE <ISO-IR-103_C4> (not a real character)
+<"-> /xC5 <UE006> NON-SPACING MACRON <ISO-IR-103_C5> (not a real character)
+<"(> /xC6 <UE007> NON-SPACING BREVE <ISO-IR-103_C6> (not a real character)
+<".> /xC7 <UE008> NON-SPACING DOT ABOVE <ISO-IR-103_C7> (not a real character)
+<":> /xC8 <UE009> NON-SPACING DIAERESIS <ISO-IR-103_C8> (not a real character)
+<"//> /xC9 <UE011> NON-SPACING LONG SOLIDUS OVERLAY <ISO-IR-128_C9> (not a real character)
+<"0> /xCA <UE00A> NON-SPACING RING ABOVE <ISO-IR-103_CA> (not a real character)
+<",> /xCB <UE00B> NON-SPACING CEDILLA <ISO-IR-103_CB> (not a real character)
+<"_> /xCC <UE00C> NON-SPACING LOW LINE <ISO-IR-103_CC> (not a real character)
+<""> /xCD <UE00D> NON-SPACING DOUBLE ACCUTE ACCENT <ISO-IR-103_CD> (not a real character)
+<";> /xCE <UE00E> NON-SPACING OGONEK <ISO-IR-103_CE> (not a real character)
+<"<> /xCF <UE00F> NON-SPACING CARON <ISO-IR-103_CF> (not a real character)
+<-M> /xD0 <U2014> EM DASH
+<1S> /xD1 <U00B9> SUPERSCRIPT ONE
+<Rg> /xD2 <U00AE> REGISTERED SIGN
+<Co> /xD3 <U00A9> COPYRIGHT SIGN
+<TM> /xD4 <U2122> TRADE MARK SIGN
+<M8> /xD5 <U266A> EIGHTH NOTE
+<hh> /xD6 <U2500> BOX DRAWINGS LIGHT HORIZONTAL
+<vv> /xD7 <U2502> BOX DRAWINGS LIGHT VERTICAL
+<FD> /xD8 <U2571> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+<BD> /xD9 <U2572> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+<Fd> /xDA <U25E2> BLACK LOWER RIGHT TRIANGLE
+<Bd> /xDB <U25E3> BLACK LOWER LEFT TRIANGLE
+<18> /xDC <U215B> VULGAR FRACTION ONE EIGHTH
+<38> /xDD <U215C> VULGAR FRACTION THREE EIGHTHS
+<58> /xDE <U215D> VULGAR FRACTION FIVE EIGHTHS
+<78> /xDF <U215E> VULGAR FRACTION SEVEN EIGHTHS
+<Om> /xE0 <U2126> OHM SIGN
+<AE> /xE1 <U00C6> LATIN CAPITAL LETTER AE
+<D-> /xE2 <U00D0> LATIN CAPITAL LETTER ETH (Icelandic)
+<-a> /xE3 <U00AA> FEMININE ORDINAL INDICATOR
+<H//> /xE4 <U0126> LATIN CAPITAL LETTER H WITH STROKE
+<vh> /xE5 <U253C> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+<IJ> /xE6 <U0132> LATIN CAPITAL LIGATURE IJ
+<L.> /xE7 <U013F> LATIN CAPITAL LETTER L WITH MIDDLE DOT
+<L//> /xE8 <U0141> LATIN CAPITAL LETTER L WITH STROKE
+<O//> /xE9 <U00D8> LATIN CAPITAL LETTER O WITH STROKE
+<OE> /xEA <U0152> LATIN CAPITAL LIGATURE OE
+<-o> /xEB <U00BA> MASCULINE ORDINAL INDICATOR
+<TH> /xEC <U00DE> LATIN CAPITAL LETTER THORN (Icelandic)
+<T//> /xED <U0166> LATIN CAPITAL LETTER T WITH STROKE
+<NG> /xEE <U014A> LATIN CAPITAL LETTER ENG (Sami)
+<'n> /xEF <U0149> LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+<kk> /xF0 <U0138> LATIN SMALL LETTER KRA (Greenlandic)
+<ae> /xF1 <U00E6> LATIN SMALL LETTER AE
+<d//> /xF2 <U0111> LATIN SMALL LETTER D WITH STROKE
+<d-> /xF3 <U00F0> LATIN SMALL LETTER ETH (Icelandic)
+<h//> /xF4 <U0127> LATIN SMALL LETTER H WITH STROKE
+<i.> /xF5 <U0131> LATIN SMALL LETTER DOTLESS I
+<ij> /xF6 <U0133> LATIN SMALL LIGATURE IJ
+<l.> /xF7 <U0140> LATIN SMALL LETTER L WITH MIDDLE DOT
+<l//> /xF8 <U0142> LATIN SMALL LETTER L WITH STROKE
+<o//> /xF9 <U00F8> LATIN SMALL LETTER O WITH STROKE
+<oe> /xFA <U0153> LATIN SMALL LIGATURE OE
+<ss> /xFB <U00DF> LATIN SMALL LETTER SHARP S (German)
+<th> /xFC <U00FE> LATIN SMALL LETTER THORN (Icelandic)
+<t//> /xFD <U0167> LATIN SMALL LETTER T WITH STROKE
+<ng> /xFE <U014B> LATIN SMALL LETTER ENG (Sami)
+<''> /xC2/x20 <U00B4> ACUTE ACCENT
+<a'> /xC2/x61 <U00E1> LATIN SMALL LETTER A WITH ACUTE
+<A'> /xC2/x41 <U00C1> LATIN CAPITAL LETTER A WITH ACUTE
+<e'> /xC2/x65 <U00E9> LATIN SMALL LETTER E WITH ACUTE
+<E'> /xC2/x45 <U00C9> LATIN CAPITAL LETTER E WITH ACUTE
+<i'> /xC2/x69 <U00ED> LATIN SMALL LETTER I WITH ACUTE
+<I'> /xC2/x49 <U00CD> LATIN CAPITAL LETTER I WITH ACUTE
+<o'> /xC2/x6F <U00F3> LATIN SMALL LETTER O WITH ACUTE
+<O'> /xC2/x4F <U00D3> LATIN CAPITAL LETTER O WITH ACUTE
+<u'> /xC2/x75 <U00FA> LATIN SMALL LETTER U WITH ACUTE
+<U'> /xC2/x55 <U00DA> LATIN CAPITAL LETTER U WITH ACUTE
+<y'> /xC2/x79 <U00FD> LATIN SMALL LETTER Y WITH ACUTE
+<Y'> /xC2/x59 <U00DD> LATIN CAPITAL LETTER Y WITH ACUTE
+<c'> /xC2/x63 <U0107> LATIN SMALL LETTER C WITH ACUTE
+<C'> /xC2/x43 <U0106> LATIN CAPITAL LETTER C WITH ACUTE
+<l'> /xC2/x6C <U013A> LATIN SMALL LETTER L WITH ACUTE
+<L'> /xC2/x4C <U0139> LATIN CAPITAL LETTER L WITH ACUTE
+<n'> /xC2/x6E <U0144> LATIN SMALL LETTER N WITH ACUTE
+<N'> /xC2/x4E <U0143> LATIN CAPITAL LETTER N WITH ACUTE
+<r'> /xC2/x72 <U0155> LATIN SMALL LETTER R WITH ACUTE
+<R'> /xC2/x52 <U0154> LATIN CAPITAL LETTER R WITH ACUTE
+<s'> /xC2/x73 <U015B> LATIN SMALL LETTER S WITH ACUTE
+<S'> /xC2/x53 <U015A> LATIN CAPITAL LETTER S WITH ACUTE
+<z'> /xC2/x7A <U017A> LATIN SMALL LETTER Z WITH ACUTE
+<Z'> /xC2/x5A <U0179> LATIN CAPITAL LETTER Z WITH ACUTE
+<'(> /xC6/x20 <U02D8> BREVE
+<a(> /xC6/x61 <U0103> LATIN SMALL LETTER A WITH BREVE
+<A(> /xC6/x41 <U0102> LATIN CAPITAL LETTER A WITH BREVE
+<g(> /xC6/x67 <U011F> LATIN SMALL LETTER G WITH BREVE
+<G(> /xC6/x47 <U011E> LATIN CAPITAL LETTER G WITH BREVE
+<u(> /xC6/x75 <U016D> LATIN SMALL LETTER U WITH BREVE
+<U(> /xC6/x55 <U016C> LATIN CAPITAL LETTER U WITH BREVE
+<'<> /xCF/x20 <U02C7> CARON (Mandarin Chinese third tone)
+<c<> /xCF/x63 <U010D> LATIN SMALL LETTER C WITH CARON
+<C<> /xCF/x43 <U010C> LATIN CAPITAL LETTER C WITH CARON
+<d<> /xCF/x64 <U010F> LATIN SMALL LETTER D WITH CARON
+<D<> /xCF/x44 <U010E> LATIN CAPITAL LETTER D WITH CARON
+<e<> /xCF/x65 <U011B> LATIN SMALL LETTER E WITH CARON
+<E<> /xCF/x45 <U011A> LATIN CAPITAL LETTER E WITH CARON
+<l<> /xCF/x6C <U013E> LATIN SMALL LETTER L WITH CARON
+<L<> /xCF/x4C <U013D> LATIN CAPITAL LETTER L WITH CARON
+<n<> /xCF/x6E <U0148> LATIN SMALL LETTER N WITH CARON
+<N<> /xCF/x4E <U0147> LATIN CAPITAL LETTER N WITH CARON
+<r<> /xCF/x72 <U0159> LATIN SMALL LETTER R WITH CARON
+<R<> /xCF/x52 <U0158> LATIN CAPITAL LETTER R WITH CARON
+<s<> /xCF/x73 <U0161> LATIN SMALL LETTER S WITH CARON
+<S<> /xCF/x53 <U0160> LATIN CAPITAL LETTER S WITH CARON
+<t<> /xCF/x74 <U0165> LATIN SMALL LETTER T WITH CARON
+<T<> /xCF/x54 <U0164> LATIN CAPITAL LETTER T WITH CARON
+<z<> /xCF/x7A <U017E> LATIN SMALL LETTER Z WITH CARON
+<Z<> /xCF/x5A <U017D> LATIN CAPITAL LETTER Z WITH CARON
+<',> /xCB/x20 <U00B8> CEDILLA
+<c,> /xCB/x63 <U00E7> LATIN SMALL LETTER C WITH CEDILLA
+<C,> /xCB/x43 <U00C7> LATIN CAPITAL LETTER C WITH CEDILLA
+<g,> /xCB/x67 <U0123> LATIN SMALL LETTER G WITH CEDILLA
+<G,> /xCB/x47 <U0122> LATIN CAPITAL LETTER G WITH CEDILLA
+<k,> /xCB/x6B <U0137> LATIN SMALL LETTER K WITH CEDILLA
+<K,> /xCB/x4B <U0136> LATIN CAPITAL LETTER K WITH CEDILLA
+<l,> /xCB/x6C <U013C> LATIN SMALL LETTER L WITH CEDILLA
+<L,> /xCB/x4C <U013B> LATIN CAPITAL LETTER L WITH CEDILLA
+<n,> /xCB/x6E <U0146> LATIN SMALL LETTER N WITH CEDILLA
+<N,> /xCB/x4E <U0145> LATIN CAPITAL LETTER N WITH CEDILLA
+<r,> /xCB/x72 <U0157> LATIN SMALL LETTER R WITH CEDILLA
+<R,> /xCB/x52 <U0156> LATIN CAPITAL LETTER R WITH CEDILLA
+<s,> /xCB/x73 <U015F> LATIN SMALL LETTER S WITH CEDILLA
+<S,> /xCB/x53 <U015E> LATIN CAPITAL LETTER S WITH CEDILLA
+<t,> /xCB/x74 <U0163> LATIN SMALL LETTER T WITH CEDILLA
+<T,> /xCB/x54 <U0162> LATIN CAPITAL LETTER T WITH CEDILLA
+<a/>> /xC3/x61 <U00E2> LATIN SMALL LETTER A WITH CIRCUMFLEX
+<A/>> /xC3/x41 <U00C2> LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<e/>> /xC3/x65 <U00EA> LATIN SMALL LETTER E WITH CIRCUMFLEX
+<E/>> /xC3/x45 <U00CA> LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<i/>> /xC3/x69 <U00EE> LATIN SMALL LETTER I WITH CIRCUMFLEX
+<I/>> /xC3/x49 <U00CE> LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<o/>> /xC3/x6F <U00F4> LATIN SMALL LETTER O WITH CIRCUMFLEX
+<O/>> /xC3/x4F <U00D4> LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<u/>> /xC3/x75 <U00FB> LATIN SMALL LETTER U WITH CIRCUMFLEX
+<U/>> /xC3/x55 <U00DB> LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<y/>> /xC3/x79 <U0177> LATIN SMALL LETTER Y WITH CIRCUMFLEX
+<Y/>> /xC3/x59 <U0176> LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+<c/>> /xC3/x63 <U0109> LATIN SMALL LETTER C WITH CIRCUMFLEX
+<C/>> /xC3/x43 <U0108> LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+<g/>> /xC3/x67 <U011D> LATIN SMALL LETTER G WITH CIRCUMFLEX
+<G/>> /xC3/x47 <U011C> LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+<h/>> /xC3/x68 <U0125> LATIN SMALL LETTER H WITH CIRCUMFLEX
+<H/>> /xC3/x48 <U0124> LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+<j/>> /xC3/x6A <U0135> LATIN SMALL LETTER J WITH CIRCUMFLEX
+<J/>> /xC3/x4A <U0134> LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+<s/>> /xC3/x73 <U015D> LATIN SMALL LETTER S WITH CIRCUMFLEX
+<S/>> /xC3/x53 <U015C> LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+<w/>> /xC3/x77 <U0175> LATIN SMALL LETTER W WITH CIRCUMFLEX
+<W/>> /xC3/x57 <U0174> LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+<':> /xC8/x20 <U00A8> DIAERESIS
+<a:> /xC8/x61 <U00E4> LATIN SMALL LETTER A WITH DIAERESIS
+<A:> /xC8/x41 <U00C4> LATIN CAPITAL LETTER A WITH DIAERESIS
+<e:> /xC8/x65 <U00EB> LATIN SMALL LETTER E WITH DIAERESIS
+<E:> /xC8/x45 <U00CB> LATIN CAPITAL LETTER E WITH DIAERESIS
+<i:> /xC8/x69 <U00EF> LATIN SMALL LETTER I WITH DIAERESIS
+<I:> /xC8/x49 <U00CF> LATIN CAPITAL LETTER I WITH DIAERESIS
+<o:> /xC8/x6F <U00F6> LATIN SMALL LETTER O WITH DIAERESIS
+<O:> /xC8/x4F <U00D6> LATIN CAPITAL LETTER O WITH DIAERESIS
+<u:> /xC8/x75 <U00FC> LATIN SMALL LETTER U WITH DIAERESIS
+<U:> /xC8/x55 <U00DC> LATIN CAPITAL LETTER U WITH DIAERESIS
+<y:> /xC8/x79 <U00FF> LATIN SMALL LETTER Y WITH DIAERESIS
+<Y:> /xC8/x59 <U0178> LATIN CAPITAL LETTER Y WITH DIAERESIS
+<'.> /xC7/x20 <U02D9> DOT ABOVE (Mandarin Chinese light tone)
+<c.> /xC7/x63 <U010B> LATIN SMALL LETTER C WITH DOT ABOVE
+<C.> /xC7/x43 <U010A> LATIN CAPITAL LETTER C WITH DOT ABOVE
+<e.> /xC7/x65 <U0117> LATIN SMALL LETTER E WITH DOT ABOVE
+<E.> /xC7/x45 <U0116> LATIN CAPITAL LETTER E WITH DOT ABOVE
+<g.> /xC7/x67 <U0121> LATIN SMALL LETTER G WITH DOT ABOVE
+<G.> /xC7/x47 <U0120> LATIN CAPITAL LETTER G WITH DOT ABOVE
+<I.> /xC7/x49 <U0130> LATIN CAPITAL LETTER I WITH DOT ABOVE
+<z.> /xC7/x7A <U017C> LATIN SMALL LETTER Z WITH DOT ABOVE
+<Z.> /xC7/x5A <U017B> LATIN CAPITAL LETTER Z WITH DOT ABOVE
+<'"> /xCD/x20 <U02DD> DOUBLE ACUTE ACCENT
+<o"> /xCD/x6F <U0151> LATIN SMALL LETTER O WITH DOUBLE ACUTE
+<O"> /xCD/x4F <U0150> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+<u"> /xCD/x75 <U0171> LATIN SMALL LETTER U WITH DOUBLE ACUTE
+<U"> /xCD/x55 <U0170> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+<a!> /xC1/x61 <U00E0> LATIN SMALL LETTER A WITH GRAVE
+<A!> /xC1/x41 <U00C0> LATIN CAPITAL LETTER A WITH GRAVE
+<e!> /xC1/x65 <U00E8> LATIN SMALL LETTER E WITH GRAVE
+<E!> /xC1/x45 <U00C8> LATIN CAPITAL LETTER E WITH GRAVE
+<i!> /xC1/x69 <U00EC> LATIN SMALL LETTER I WITH GRAVE
+<I!> /xC1/x49 <U00CC> LATIN CAPITAL LETTER I WITH GRAVE
+<o!> /xC1/x6F <U00F2> LATIN SMALL LETTER O WITH GRAVE
+<O!> /xC1/x4F <U00D2> LATIN CAPITAL LETTER O WITH GRAVE
+<u!> /xC1/x75 <U00F9> LATIN SMALL LETTER U WITH GRAVE
+<U!> /xC1/x55 <U00D9> LATIN CAPITAL LETTER U WITH GRAVE
+<'m> /xC5/x20 <U00AF> MACRON
+<a-> /xC5/x61 <U0101> LATIN SMALL LETTER A WITH MACRON
+<A-> /xC5/x41 <U0100> LATIN CAPITAL LETTER A WITH MACRON
+<e-> /xC5/x65 <U0113> LATIN SMALL LETTER E WITH MACRON
+<E-> /xC5/x45 <U0112> LATIN CAPITAL LETTER E WITH MACRON
+<i-> /xC5/x69 <U012B> LATIN SMALL LETTER I WITH MACRON
+<I-> /xC5/x49 <U012A> LATIN CAPITAL LETTER I WITH MACRON
+<o-> /xC5/x6F <U014D> LATIN SMALL LETTER O WITH MACRON
+<O-> /xC5/x4F <U014C> LATIN CAPITAL LETTER O WITH MACRON
+<u-> /xC5/x75 <U016B> LATIN SMALL LETTER U WITH MACRON
+<U-> /xC5/x55 <U016A> LATIN CAPITAL LETTER U WITH MACRON
+<';> /xCE/x20 <U02DB> OGONEK
+<a;> /xCE/x61 <U0105> LATIN SMALL LETTER A WITH OGONEK
+<A;> /xCE/x41 <U0104> LATIN CAPITAL LETTER A WITH OGONEK
+<e;> /xCE/x65 <U0119> LATIN SMALL LETTER E WITH OGONEK
+<E;> /xCE/x45 <U0118> LATIN CAPITAL LETTER E WITH OGONEK
+<i;> /xCE/x69 <U012F> LATIN SMALL LETTER I WITH OGONEK
+<I;> /xCE/x49 <U012E> LATIN CAPITAL LETTER I WITH OGONEK
+<u;> /xCE/x75 <U0173> LATIN SMALL LETTER U WITH OGONEK
+<U;> /xCE/x55 <U0172> LATIN CAPITAL LETTER U WITH OGONEK
+<'0> /xCA/x20 <U02DA> RING ABOVE
+<aa> /xCA/x61 <U00E5> LATIN SMALL LETTER A WITH RING ABOVE
+<AA> /xCA/x41 <U00C5> LATIN CAPITAL LETTER A WITH RING ABOVE
+<u0> /xCA/x75 <U016F> LATIN SMALL LETTER U WITH RING ABOVE
+<U0> /xCA/x55 <U016E> LATIN CAPITAL LETTER U WITH RING ABOVE
+<a?> /xC4/x61 <U00E3> LATIN SMALL LETTER A WITH TILDE
+<A?> /xC4/x41 <U00C3> LATIN CAPITAL LETTER A WITH TILDE
+<n?> /xC4/x6E <U00F1> LATIN SMALL LETTER N WITH TILDE
+<N?> /xC4/x4E <U00D1> LATIN CAPITAL LETTER N WITH TILDE
+<i?> /xC4/x69 <U0129> LATIN SMALL LETTER I WITH TILDE
+<I?> /xC4/x49 <U0128> LATIN CAPITAL LETTER I WITH TILDE
+<o?> /xC4/x6F <U00F5> LATIN SMALL LETTER O WITH TILDE
+<O?> /xC4/x4F <U00D5> LATIN CAPITAL LETTER O WITH TILDE
+<u?> /xC4/x75 <U0169> LATIN SMALL LETTER U WITH TILDE
+<U?> /xC4/x55 <U0168> LATIN CAPITAL LETTER U WITH TILDE
+<NUL> /x00 <U0000> NUL
+<SOH> /x01 <U0001> START OF HEADING (SOH)
+<STX> /x02 <U0002> START OF TEXT (STX)
+<ETX> /x03 <U0003> END OF TEXT (ETX)
+<EOT> /x04 <U0004> END OF TRANSMISSION (EOT)
+<ENQ> /x05 <U0005> ENQUIRY (ENQ)
+<ACK> /x06 <U0006> ACKNOWLEDGE (ACK)
+<alert> /x07 <U0007> BELL (BEL)
+<BEL> /x07 <U0007> BELL (BEL)
+<backspace> /x08 <U0008> BACKSPACE (BS)
+<tab> /x09 <U0009> CHARACTER TABULATION (HT)
+<newline> /x0A <U000A> LINE FEED (LF)
+<vertical-tab> /x0B <U000B> LINE TABULATION (VT)
+<form-feed> /x0C <U000C> FORM FEED (FF)
+<carriage-return> /x0D <U000D> CARRIAGE RETURN (CR)
+<DLE> /x10 <U0010> DATALINK ESCAPE (DLE)
+<DC1> /x11 <U0011> DEVICE CONTROL ONE (DC1)
+<DC2> /x12 <U0012> DEVICE CONTROL TWO (DC2)
+<DC3> /x13 <U0013> DEVICE CONTROL THREE (DC3)
+<DC4> /x14 <U0014> DEVICE CONTROL FOUR (DC4)
+<NAK> /x15 <U0015> NEGATIVE ACKNOWLEDGE (NAK)
+<SYN> /x16 <U0016> SYNCHRONOUS IDLE (SYN)
+<ETB> /x17 <U0017> END OF TRANSMISSION BLOCK (ETB)
+<CAN> /x18 <U0018> CANCEL (CAN)
+<SUB> /x1A <U001A> SUBSTITUTE (SUB)
+<ESC> /x1B <U001B> ESCAPE (ESC)
+<IS4> /x1C <U001C> FILE SEPARATOR (IS4)
+<IS3> /x1D <U001D> GROUP SEPARATOR (IS3)
+<intro> /x1D <U001D> GROUP SEPARATOR (IS3)
+<IS2> /x1E <U001E> RECORD SEPARATOR (IS2)
+<IS1> /x1F <U001F> UNIT SEPARATOR (IS1)
+<DEL> /x7F <U007F> DELETE (DEL)
+<space> /x20 <U0020> SPACE
+<exclamation-mark> /x21 <U0021> EXCLAMATION MARK
+<quotation-mark> /x22 <U0022> QUOTATION MARK
+<number-sign> /xA6 <U0023> NUMBER SIGN
+<dollar-sign> /xA4 <U0024> DOLLAR SIGN
+<percent-sign> /x25 <U0025> PERCENT SIGN
+<ampersand> /x26 <U0026> AMPERSAND
+<apostrophe> /x27 <U0027> APOSTROPHE
+<left-parenthesis> /x28 <U0028> LEFT PARENTHESIS
+<right-parenthesis> /x29 <U0029> RIGHT PARENTHESIS
+<asterisk> /x2A <U002A> ASTERISK
+<plus-sign> /x2B <U002B> PLUS SIGN
+<comma> /x2C <U002C> COMMA
+<hyphen> /x2D <U002D> HYPHEN-MINUS
+<hyphen-minus> /x2D <U002D> HYPHEN-MINUS
+<period> /x2E <U002E> FULL STOP
+<full-stop> /x2E <U002E> FULL STOP
+<slash> /x2F <U002F> SOLIDUS
+<solidus> /x2F <U002F> SOLIDUS
+<zero> /x30 <U0030> DIGIT ZERO
+<one> /x31 <U0031> DIGIT ONE
+<two> /x32 <U0032> DIGIT TWO
+<three> /x33 <U0033> DIGIT THREE
+<four> /x34 <U0034> DIGIT FOUR
+<five> /x35 <U0035> DIGIT FIVE
+<six> /x36 <U0036> DIGIT SIX
+<seven> /x37 <U0037> DIGIT SEVEN
+<eight> /x38 <U0038> DIGIT EIGHT
+<nine> /x39 <U0039> DIGIT NINE
+<colon> /x3A <U003A> COLON
+<semicolon> /x3B <U003B> SEMICOLON
+<less-than-sign> /x3C <U003C> LESS-THAN SIGN
+<equals-sign> /x3D <U003D> EQUALS SIGN
+<greater-than-sign> /x3E <U003E> GREATER-THAN SIGN
+<question-mark> /x3F <U003F> QUESTION MARK
+<commercial-at> /x40 <U0040> COMMERCIAL AT
+<left-square-bracket> /x5B <U005B> LEFT SQUARE BRACKET
+<backslash> /x5C <U005C> REVERSE SOLIDUS
+<reverse-solidus> /x5C <U005C> REVERSE SOLIDUS
+<right-square-bracket> /x5D <U005D> RIGHT SQUARE BRACKET
+<circumflex> /x5E <U005E> CIRCUMFLEX ACCENT
+<circumflex-accent> /x5E <U005E> CIRCUMFLEX ACCENT
+<underscore> /x5F <U005F> LOW LINE
+<low-line> /x5F <U005F> LOW LINE
+<grave-accent> /x60 <U0060> GRAVE ACCENT
+<left-brace> /x7B <U007B> LEFT CURLY BRACKET
+<left-curly-bracket> /x7B <U007B> LEFT CURLY BRACKET
+<vertical-line> /x7C <U007C> VERTICAL LINE
+<right-brace> /x7D <U007D> RIGHT CURLY BRACKET
+<right-curly-bracket> /x7D <U007D> RIGHT CURLY BRACKET
+<tilde> /x7E <U007E> TILDE
+END CHARMAP
diff --git a/examples/qwerty/ANSI_X3.110-1983.txt b/examples/qwerty/ANSI_X3.110-1983.txt
new file mode 100644
index 000000000..eab630853
--- /dev/null
+++ b/examples/qwerty/ANSI_X3.110-1983.txt
@@ -0,0 +1,7 @@
+ABCDE
+ÂaÃaÄaÈaÊañËcÁeÂeÃeÈeÁiÂiÃiÈióÄnÁoÂoÃoÄoÈoùÁuÂa
+?????
+?????
+?????
+??????
+?????? \ No newline at end of file
diff --git a/examples/qwerty/IBM277.map b/examples/qwerty/IBM277.map
new file mode 100644
index 000000000..51a2472d9
--- /dev/null
+++ b/examples/qwerty/IBM277.map
@@ -0,0 +1,350 @@
+<code_set_name> IBM277
+<comment_char> %
+<escape_char> /
+% version: 1.0
+% repertoiremap: mnemonic,ds
+% source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+% alias EBCDIC-CP-DK
+% alias EBCDIC-CP-NO
+CHARMAP
+<NU> /x00 <U0000> NULL (NUL)
+<SH> /x01 <U0001> START OF HEADING (SOH)
+<SX> /x02 <U0002> START OF TEXT (STX)
+<EX> /x03 <U0003> END OF TEXT (ETX)
+<ST> /x04 <U009C> STRING TERMINATOR (ST)
+<HT> /x05 <U0009> CHARACTER TABULATION (HT)
+<SA> /x06 <U0086> START OF SELECTED AREA (SSA)
+<DT> /x07 <U007F> DELETE (DEL)
+<EG> /x08 <U0097> END OF GUARDED AREA (EPA)
+<RI> /x09 <U008D> REVERSE LINE FEED (RI)
+<S2> /x0A <U008E> SINGLE-SHIFT TWO (SS2)
+<VT> /x0B <U000B> LINE TABULATION (VT)
+<FF> /x0C <U000C> FORM FEED (FF)
+<CR> /x0D <U000D> CARRIAGE RETURN (CR)
+<SO> /x0E <U000E> SHIFT OUT (SO)
+<SI> /x0F <U000F> SHIFT IN (SI)
+<DL> /x10 <U0010> DATALINK ESCAPE (DLE)
+<D1> /x11 <U0011> DEVICE CONTROL ONE (DC1)
+<D2> /x12 <U0012> DEVICE CONTROL TWO (DC2)
+<D3> /x13 <U0013> DEVICE CONTROL THREE (DC3)
+<OC> /x14 <U009D> OPERATING SYSTEM COMMAND (OSC)
+<NL> /x15 <U0085> NEXT LINE (NEL)
+<BS> /x16 <U0008> BACKSPACE (BS)
+<ES> /x17 <U0087> END OF SELECTED AREA (ESA)
+<CN> /x18 <U0018> CANCEL (CAN)
+<EM> /x19 <U0019> END OF MEDIUM (EM)
+<P2> /x1A <U0092> PRIVATE USE TWO (PU2)
+<S3> /x1B <U008F> SINGLE-SHIFT THREE (SS3)
+<FS> /x1C <U001C> FILE SEPARATOR (IS4)
+<GS> /x1D <U001D> GROUP SEPARATOR (IS3)
+<RS> /x1E <U001E> RECORD SEPARATOR (IS2)
+<US> /x1F <U001F> UNIT SEPARATOR (IS1)
+<PA> /x20 <U0080> PADDING CHARACTER (PAD)
+<HO> /x21 <U0081> HIGH OCTET PRESET (HOP)
+<BH> /x22 <U0082> BREAK PERMITTED HERE (BPH)
+<NH> /x23 <U0083> NO BREAK HERE (NBH)
+<IN> /x24 <U0084> INDEX (IND)
+<LF> /x25 <U000A> LINE FEED (LF)
+<EB> /x26 <U0017> END OF TRANSMISSION BLOCK (ETB)
+<EC> /x27 <U001B> ESCAPE (ESC)
+<HS> /x28 <U0088> CHARACTER TABULATION SET (HTS)
+<HJ> /x29 <U0089> CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
+<VS> /x2A <U008A> LINE TABULATION SET (VTS)
+<PD> /x2B <U008B> PARTIAL LINE FORWARD (PLD)
+<PU> /x2C <U008C> PARTIAL LINE BACKWARD (PLU)
+<EQ> /x2D <U0005> ENQUIRY (ENQ)
+<AK> /x2E <U0006> ACKNOWLEDGE (ACK)
+<BL> /x2F <U0007> BELL (BEL)
+<DC> /x30 <U0090> DEVICE CONTROL STRING (DCS)
+<P1> /x31 <U0091> PRIVATE USE ONE (PU1)
+<SY> /x32 <U0016> SYNCHRONOUS IDLE (SYN)
+<TS> /x33 <U0093> SET TRANSMIT STATE (STS)
+<CC> /x34 <U0094> CANCEL CHARACTER (CCH)
+<MW> /x35 <U0095> MESSAGE WAITING (MW)
+<SG> /x36 <U0096> START OF GUARDED AREA (SPA)
+<ET> /x37 <U0004> END OF TRANSMISSION (EOT)
+<SS> /x38 <U0098> START OF STRING (SOS)
+<GC> /x39 <U0099> SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
+<SC> /x3A <U009A> SINGLE CHARACTER INTRODUCER (SCI)
+<CI> /x3B <U009B> CONTROL SEQUENCE INTRODUCER (CSI)
+<D4> /x3C <U0014> DEVICE CONTROL FOUR (DC4)
+<NK> /x3D <U0015> NEGATIVE ACKNOWLEDGE (NAK)
+<PM> /x3E <U009E> PRIVACY MESSAGE (PM)
+<SB> /x3F <U001A> SUBSTITUTE (SUB)
+<SP> /x40 <U0020> SPACE
+<NS> /x41 <U00A0> NO-BREAK SPACE
+<a/>> /x42 <U00E2> LATIN SMALL LETTER A WITH CIRCUMFLEX
+<a:> /x43 <U00E4> LATIN SMALL LETTER A WITH DIAERESIS
+<a!> /x44 <U00E0> LATIN SMALL LETTER A WITH GRAVE
+<a'> /x45 <U00E1> LATIN SMALL LETTER A WITH ACUTE
+<a?> /x46 <U00E3> LATIN SMALL LETTER A WITH TILDE
+<!)> /x47 <U007D> RIGHT CURLY BRACKET
+<c,> /x48 <U00E7> LATIN SMALL LETTER C WITH CEDILLA
+<n?> /x49 <U00F1> LATIN SMALL LETTER N WITH TILDE
+<Nb> /x4A <U0023> NUMBER SIGN
+<.> /x4B <U002E> FULL STOP
+<<> /x4C <U003C> LESS-THAN SIGN
+<(> /x4D <U0028> LEFT PARENTHESIS
+<+> /x4E <U002B> PLUS SIGN
+<!> /x4F <U0021> EXCLAMATION MARK
+<&> /x50 <U0026> AMPERSAND
+<e'> /x51 <U00E9> LATIN SMALL LETTER E WITH ACUTE
+<e/>> /x52 <U00EA> LATIN SMALL LETTER E WITH CIRCUMFLEX
+<e:> /x53 <U00EB> LATIN SMALL LETTER E WITH DIAERESIS
+<e!> /x54 <U00E8> LATIN SMALL LETTER E WITH GRAVE
+<i'> /x55 <U00ED> LATIN SMALL LETTER I WITH ACUTE
+<i/>> /x56 <U00EE> LATIN SMALL LETTER I WITH CIRCUMFLEX
+<i:> /x57 <U00EF> LATIN SMALL LETTER I WITH DIAERESIS
+<i!> /x58 <U00EC> LATIN SMALL LETTER I WITH GRAVE
+<ss> /x59 <U00DF> LATIN SMALL LETTER SHARP S (German)
+<Cu> /x5A <U00A4> CURRENCY SIGN
+<AA> /x5B <U00C5> LATIN CAPITAL LETTER A WITH RING ABOVE
+<*> /x5C <U002A> ASTERISK
+<)> /x5D <U0029> RIGHT PARENTHESIS
+<;> /x5E <U003B> SEMICOLON
+<'/>> /x5F <U005E> CIRCUMFLEX ACCENT
+<-> /x60 <U002D> HYPHEN-MINUS
+<//> /x61 <U002F> SOLIDUS
+<A/>> /x62 <U00C2> LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<A:> /x63 <U00C4> LATIN CAPITAL LETTER A WITH DIAERESIS
+<A!> /x64 <U00C0> LATIN CAPITAL LETTER A WITH GRAVE
+<A'> /x65 <U00C1> LATIN CAPITAL LETTER A WITH ACUTE
+<A?> /x66 <U00C3> LATIN CAPITAL LETTER A WITH TILDE
+<DO> /x67 <U0024> DOLLAR SIGN
+<C,> /x68 <U00C7> LATIN CAPITAL LETTER C WITH CEDILLA
+<N?> /x69 <U00D1> LATIN CAPITAL LETTER N WITH TILDE
+<o//> /x6A <U00F8> LATIN SMALL LETTER O WITH STROKE
+<,> /x6B <U002C> COMMA
+<%> /x6C <U0025> PERCENT SIGN
+<_> /x6D <U005F> LOW LINE
+</>> /x6E <U003E> GREATER-THAN SIGN
+<?> /x6F <U003F> QUESTION MARK
+<BB> /x70 <U00A6> BROKEN BAR
+<E'> /x71 <U00C9> LATIN CAPITAL LETTER E WITH ACUTE
+<E/>> /x72 <U00CA> LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<E:> /x73 <U00CB> LATIN CAPITAL LETTER E WITH DIAERESIS
+<E!> /x74 <U00C8> LATIN CAPITAL LETTER E WITH GRAVE
+<I'> /x75 <U00CD> LATIN CAPITAL LETTER I WITH ACUTE
+<I/>> /x76 <U00CE> LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<I:> /x77 <U00CF> LATIN CAPITAL LETTER I WITH DIAERESIS
+<I!> /x78 <U00CC> LATIN CAPITAL LETTER I WITH GRAVE
+<'!> /x79 <U0060> GRAVE ACCENT
+<:> /x7A <U003A> COLON
+<AE> /x7B <U00C6> LATIN CAPITAL LETTER AE
+<O//> /x7C <U00D8> LATIN CAPITAL LETTER O WITH STROKE
+<'> /x7D <U0027> APOSTROPHE
+<=> /x7E <U003D> EQUALS SIGN
+<"> /x7F <U0022> QUOTATION MARK
+<At> /x80 <U0040> COMMERCIAL AT
+<a> /x81 <U0061> LATIN SMALL LETTER A
+<b> /x82 <U0062> LATIN SMALL LETTER B
+<c> /x83 <U0063> LATIN SMALL LETTER C
+<d> /x84 <U0064> LATIN SMALL LETTER D
+<e> /x85 <U0065> LATIN SMALL LETTER E
+<f> /x86 <U0066> LATIN SMALL LETTER F
+<g> /x87 <U0067> LATIN SMALL LETTER G
+<h> /x88 <U0068> LATIN SMALL LETTER H
+<i> /x89 <U0069> LATIN SMALL LETTER I
+<<<> /x8A <U00AB> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+</>/>> /x8B <U00BB> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+<d-> /x8C <U00F0> LATIN SMALL LETTER ETH (Icelandic)
+<y'> /x8D <U00FD> LATIN SMALL LETTER Y WITH ACUTE
+<th> /x8E <U00FE> LATIN SMALL LETTER THORN (Icelandic)
+<+-> /x8F <U00B1> PLUS-MINUS SIGN
+<DG> /x90 <U00B0> DEGREE SIGN
+<j> /x91 <U006A> LATIN SMALL LETTER J
+<k> /x92 <U006B> LATIN SMALL LETTER K
+<l> /x93 <U006C> LATIN SMALL LETTER L
+<m> /x94 <U006D> LATIN SMALL LETTER M
+<n> /x95 <U006E> LATIN SMALL LETTER N
+<o> /x96 <U006F> LATIN SMALL LETTER O
+<p> /x97 <U0070> LATIN SMALL LETTER P
+<q> /x98 <U0071> LATIN SMALL LETTER Q
+<r> /x99 <U0072> LATIN SMALL LETTER R
+<-a> /x9A <U00AA> FEMININE ORDINAL INDICATOR
+<-o> /x9B <U00BA> MASCULINE ORDINAL INDICATOR
+<(!> /x9C <U007B> LEFT CURLY BRACKET
+<',> /x9D <U00B8> CEDILLA
+<<(> /x9E <U005B> LEFT SQUARE BRACKET
+<)/>> /x9F <U005D> RIGHT SQUARE BRACKET
+<My> /xA0 <U00B5> MICRO SIGN
+<u:> /xA1 <U00FC> LATIN SMALL LETTER U WITH DIAERESIS
+<s> /xA2 <U0073> LATIN SMALL LETTER S
+<t> /xA3 <U0074> LATIN SMALL LETTER T
+<u> /xA4 <U0075> LATIN SMALL LETTER U
+<v> /xA5 <U0076> LATIN SMALL LETTER V
+<w> /xA6 <U0077> LATIN SMALL LETTER W
+<x> /xA7 <U0078> LATIN SMALL LETTER X
+<y> /xA8 <U0079> LATIN SMALL LETTER Y
+<z> /xA9 <U007A> LATIN SMALL LETTER Z
+<!I> /xAA <U00A1> INVERTED EXCLAMATION MARK
+<?I> /xAB <U00BF> INVERTED QUESTION MARK
+<D-> /xAC <U00D0> LATIN CAPITAL LETTER ETH (Icelandic)
+<Y'> /xAD <U00DD> LATIN CAPITAL LETTER Y WITH ACUTE
+<TH> /xAE <U00DE> LATIN CAPITAL LETTER THORN (Icelandic)
+<Rg> /xAF <U00AE> REGISTERED SIGN
+<Ct> /xB0 <U00A2> CENT SIGN
+<Pd> /xB1 <U00A3> POUND SIGN
+<Ye> /xB2 <U00A5> YEN SIGN
+<.M> /xB3 <U00B7> MIDDLE DOT
+<Co> /xB4 <U00A9> COPYRIGHT SIGN
+<SE> /xB5 <U00A7> SECTION SIGN
+<PI> /xB6 <U00B6> PILCROW SIGN
+<14> /xB7 <U00BC> VULGAR FRACTION ONE QUARTER
+<12> /xB8 <U00BD> VULGAR FRACTION ONE HALF
+<34> /xB9 <U00BE> VULGAR FRACTION THREE QUARTERS
+<NO> /xBA <U00AC> NOT SIGN
+<!!> /xBB <U007C> VERTICAL LINE
+<'-> /xBC <U203E> OVERLINE
+<':> /xBD <U00A8> DIAERESIS
+<''> /xBE <U00B4> ACUTE ACCENT
+<*X> /xBF <U00D7> MULTIPLICATION SIGN
+<ae> /xC0 <U00E6> LATIN SMALL LETTER AE
+<A> /xC1 <U0041> LATIN CAPITAL LETTER A
+<B> /xC2 <U0042> LATIN CAPITAL LETTER B
+<C> /xC3 <U0043> LATIN CAPITAL LETTER C
+<D> /xC4 <U0044> LATIN CAPITAL LETTER D
+<E> /xC5 <U0045> LATIN CAPITAL LETTER E
+<F> /xC6 <U0046> LATIN CAPITAL LETTER F
+<G> /xC7 <U0047> LATIN CAPITAL LETTER G
+<H> /xC8 <U0048> LATIN CAPITAL LETTER H
+<I> /xC9 <U0049> LATIN CAPITAL LETTER I
+<--> /xCA <U00AD> SOFT HYPHEN
+<o/>> /xCB <U00F4> LATIN SMALL LETTER O WITH CIRCUMFLEX
+<o:> /xCC <U00F6> LATIN SMALL LETTER O WITH DIAERESIS
+<o!> /xCD <U00F2> LATIN SMALL LETTER O WITH GRAVE
+<o'> /xCE <U00F3> LATIN SMALL LETTER O WITH ACUTE
+<o?> /xCF <U00F5> LATIN SMALL LETTER O WITH TILDE
+<aa> /xD0 <U00E5> LATIN SMALL LETTER A WITH RING ABOVE
+<J> /xD1 <U004A> LATIN CAPITAL LETTER J
+<K> /xD2 <U004B> LATIN CAPITAL LETTER K
+<L> /xD3 <U004C> LATIN CAPITAL LETTER L
+<M> /xD4 <U004D> LATIN CAPITAL LETTER M
+<N> /xD5 <U004E> LATIN CAPITAL LETTER N
+<O> /xD6 <U004F> LATIN CAPITAL LETTER O
+<P> /xD7 <U0050> LATIN CAPITAL LETTER P
+<Q> /xD8 <U0051> LATIN CAPITAL LETTER Q
+<R> /xD9 <U0052> LATIN CAPITAL LETTER R
+<1S> /xDA <U00B9> SUPERSCRIPT ONE
+<u/>> /xDB <U00FB> LATIN SMALL LETTER U WITH CIRCUMFLEX
+<'?> /xDC <U007E> TILDE
+<u!> /xDD <U00F9> LATIN SMALL LETTER U WITH GRAVE
+<u'> /xDE <U00FA> LATIN SMALL LETTER U WITH ACUTE
+<y:> /xDF <U00FF> LATIN SMALL LETTER Y WITH DIAERESIS
+<////> /xE0 <U005C> REVERSE SOLIDUS
+<-:> /xE1 <U00F7> DIVISION SIGN
+<S> /xE2 <U0053> LATIN CAPITAL LETTER S
+<T> /xE3 <U0054> LATIN CAPITAL LETTER T
+<U> /xE4 <U0055> LATIN CAPITAL LETTER U
+<V> /xE5 <U0056> LATIN CAPITAL LETTER V
+<W> /xE6 <U0057> LATIN CAPITAL LETTER W
+<X> /xE7 <U0058> LATIN CAPITAL LETTER X
+<Y> /xE8 <U0059> LATIN CAPITAL LETTER Y
+<Z> /xE9 <U005A> LATIN CAPITAL LETTER Z
+<2S> /xEA <U00B2> SUPERSCRIPT TWO
+<O/>> /xEB <U00D4> LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<O:> /xEC <U00D6> LATIN CAPITAL LETTER O WITH DIAERESIS
+<O!> /xED <U00D2> LATIN CAPITAL LETTER O WITH GRAVE
+<O'> /xEE <U00D3> LATIN CAPITAL LETTER O WITH ACUTE
+<O?> /xEF <U00D5> LATIN CAPITAL LETTER O WITH TILDE
+<0> /xF0 <U0030> DIGIT ZERO
+<1> /xF1 <U0031> DIGIT ONE
+<2> /xF2 <U0032> DIGIT TWO
+<3> /xF3 <U0033> DIGIT THREE
+<4> /xF4 <U0034> DIGIT FOUR
+<5> /xF5 <U0035> DIGIT FIVE
+<6> /xF6 <U0036> DIGIT SIX
+<7> /xF7 <U0037> DIGIT SEVEN
+<8> /xF8 <U0038> DIGIT EIGHT
+<9> /xF9 <U0039> DIGIT NINE
+<3S> /xFA <U00B3> SUPERSCRIPT THREE
+<U/>> /xFB <U00DB> LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<U:> /xFC <U00DC> LATIN CAPITAL LETTER U WITH DIAERESIS
+<U!> /xFD <U00D9> LATIN CAPITAL LETTER U WITH GRAVE
+<U'> /xFE <U00DA> LATIN CAPITAL LETTER U WITH ACUTE
+<AC> /xFF <U009F> APPLICATION PROGRAM COMMAND (APC)
+<NUL> /x00 <U0000> NUL
+<SOH> /x01 <U0001> START OF HEADING (SOH)
+<STX> /x02 <U0002> START OF TEXT (STX)
+<ETX> /x03 <U0003> END OF TEXT (ETX)
+<EOT> /x37 <U0004> END OF TRANSMISSION (EOT)
+<ENQ> /x2D <U0005> ENQUIRY (ENQ)
+<ACK> /x2E <U0006> ACKNOWLEDGE (ACK)
+<alert> /x2F <U0007> BELL (BEL)
+<BEL> /x2F <U0007> BELL (BEL)
+<backspace> /x16 <U0008> BACKSPACE (BS)
+<tab> /x05 <U0009> CHARACTER TABULATION (HT)
+<newline> /x25 <U000A> LINE FEED (LF)
+<vertical-tab> /x0B <U000B> LINE TABULATION (VT)
+<form-feed> /x0C <U000C> FORM FEED (FF)
+<carriage-return> /x0D <U000D> CARRIAGE RETURN (CR)
+<DLE> /x10 <U0010> DATALINK ESCAPE (DLE)
+<DC1> /x11 <U0011> DEVICE CONTROL ONE (DC1)
+<DC2> /x12 <U0012> DEVICE CONTROL TWO (DC2)
+<DC3> /x13 <U0013> DEVICE CONTROL THREE (DC3)
+<DC4> /x3C <U0014> DEVICE CONTROL FOUR (DC4)
+<NAK> /x3D <U0015> NEGATIVE ACKNOWLEDGE (NAK)
+<SYN> /x32 <U0016> SYNCHRONOUS IDLE (SYN)
+<ETB> /x26 <U0017> END OF TRANSMISSION BLOCK (ETB)
+<CAN> /x18 <U0018> CANCEL (CAN)
+<SUB> /x3F <U001A> SUBSTITUTE (SUB)
+<ESC> /x27 <U001B> ESCAPE (ESC)
+<IS4> /x1C <U001C> FILE SEPARATOR (IS4)
+<IS3> /x1D <U001D> GROUP SEPARATOR (IS3)
+<intro> /x1D <U001D> GROUP SEPARATOR (IS3)
+<IS2> /x1E <U001E> RECORD SEPARATOR (IS2)
+<IS1> /x1F <U001F> UNIT SEPARATOR (IS1)
+<DEL> /x07 <U007F> DELETE (DEL)
+<space> /x40 <U0020> SPACE
+<exclamation-mark> /x4F <U0021> EXCLAMATION MARK
+<quotation-mark> /x7F <U0022> QUOTATION MARK
+<number-sign> /x4A <U0023> NUMBER SIGN
+<dollar-sign> /x67 <U0024> DOLLAR SIGN
+<percent-sign> /x6C <U0025> PERCENT SIGN
+<ampersand> /x50 <U0026> AMPERSAND
+<apostrophe> /x7D <U0027> APOSTROPHE
+<left-parenthesis> /x4D <U0028> LEFT PARENTHESIS
+<right-parenthesis> /x5D <U0029> RIGHT PARENTHESIS
+<asterisk> /x5C <U002A> ASTERISK
+<plus-sign> /x4E <U002B> PLUS SIGN
+<comma> /x6B <U002C> COMMA
+<hyphen> /x60 <U002D> HYPHEN-MINUS
+<hyphen-minus> /x60 <U002D> HYPHEN-MINUS
+<period> /x4B <U002E> FULL STOP
+<full-stop> /x4B <U002E> FULL STOP
+<slash> /x61 <U002F> SOLIDUS
+<solidus> /x61 <U002F> SOLIDUS
+<zero> /xF0 <U0030> DIGIT ZERO
+<one> /xF1 <U0031> DIGIT ONE
+<two> /xF2 <U0032> DIGIT TWO
+<three> /xF3 <U0033> DIGIT THREE
+<four> /xF4 <U0034> DIGIT FOUR
+<five> /xF5 <U0035> DIGIT FIVE
+<six> /xF6 <U0036> DIGIT SIX
+<seven> /xF7 <U0037> DIGIT SEVEN
+<eight> /xF8 <U0038> DIGIT EIGHT
+<nine> /xF9 <U0039> DIGIT NINE
+<colon> /x7A <U003A> COLON
+<semicolon> /x5E <U003B> SEMICOLON
+<less-than-sign> /x4C <U003C> LESS-THAN SIGN
+<equals-sign> /x7E <U003D> EQUALS SIGN
+<greater-than-sign> /x6E <U003E> GREATER-THAN SIGN
+<question-mark> /x6F <U003F> QUESTION MARK
+<commercial-at> /x80 <U0040> COMMERCIAL AT
+<left-square-bracket> /x9E <U005B> LEFT SQUARE BRACKET
+<backslash> /xE0 <U005C> REVERSE SOLIDUS
+<reverse-solidus> /xE0 <U005C> REVERSE SOLIDUS
+<right-square-bracket> /x9F <U005D> RIGHT SQUARE BRACKET
+<circumflex> /x5F <U005E> CIRCUMFLEX ACCENT
+<circumflex-accent> /x5F <U005E> CIRCUMFLEX ACCENT
+<underscore> /x6D <U005F> LOW LINE
+<low-line> /x6D <U005F> LOW LINE
+<grave-accent> /x79 <U0060> GRAVE ACCENT
+<left-brace> /x9C <U007B> LEFT CURLY BRACKET
+<left-curly-bracket> /x9C <U007B> LEFT CURLY BRACKET
+<vertical-line> /xBB <U007C> VERTICAL LINE
+<right-brace> /x47 <U007D> RIGHT CURLY BRACKET
+<right-curly-bracket> /x47 <U007D> RIGHT CURLY BRACKET
+<tilde> /xDC <U007E> TILDE
+END CHARMAP
diff --git a/examples/qwerty/IBM277.txt b/examples/qwerty/IBM277.txt
new file mode 100644
index 000000000..e0d659c87
--- /dev/null
+++ b/examples/qwerty/IBM277.txt
@@ -0,0 +1 @@
+ÁÂÃÄÅ %EBFCÐÀHTQRSXUVWŒIÍÎËÏÌjÝE %????? %????? %????? %?????? %?????? \ No newline at end of file
diff --git a/examples/qwerty/eucJP.txt b/examples/qwerty/eucJP.txt
new file mode 100644
index 000000000..f7a867275
--- /dev/null
+++ b/examples/qwerty/eucJP.txt
@@ -0,0 +1,7 @@
+ABCDE
+¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢
+¤¢¤¤¤¦¤¨¤ª
+¤«¤­¤¯¤±¤³
+¤µ¤·¤¹¤»¤½
+§«§¸§µ§¬§¦§¯
+§Û§è§å§Ü§Ö§ß \ No newline at end of file
diff --git a/examples/qwerty/koi8.txt b/examples/qwerty/koi8.txt
new file mode 100644
index 000000000..8d08046ac
--- /dev/null
+++ b/examples/qwerty/koi8.txt
@@ -0,0 +1,7 @@
+ABCDE
+¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
+¤¤¤¤¤
+¤¤¤¤¤
+¤¤¤¤¤
+êãõëåî
+ÊÃÕËÅÎ \ No newline at end of file
diff --git a/examples/qwerty/latin1.txt b/examples/qwerty/latin1.txt
new file mode 100644
index 000000000..14ddc2522
--- /dev/null
+++ b/examples/qwerty/latin1.txt
@@ -0,0 +1,7 @@
+ABCDE
+áâãäåæçèéêëìíîïðñòóôõöøùá
+?????
+?????
+?????
+??????
+?????? \ No newline at end of file
diff --git a/examples/qwerty/main.cpp b/examples/qwerty/main.cpp
new file mode 100644
index 000000000..b514126ec
--- /dev/null
+++ b/examples/qwerty/main.cpp
@@ -0,0 +1,37 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "qwerty.h"
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+
+ bool isSmall = qApp->desktop()->size().width() < 450
+ || qApp->desktop()->size().height() < 450;
+
+ int i;
+ for ( i= argc <= 1 ? 0 : 1; i<argc; i++ ) {
+ Editor *e = new Editor;
+ e->setCaption("TQt Example - TQWERTY");
+ if ( i > 0 )
+ e->load( argv[i] );
+ if ( isSmall ) {
+ e->showMaximized();
+ } else {
+ e->resize( 400, 400 );
+ e->show();
+ }
+ }
+ a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(tquit()) );
+ return a.exec();
+}
diff --git a/examples/qwerty/msunicode.txt b/examples/qwerty/msunicode.txt
new file mode 100644
index 000000000..a707a7604
--- /dev/null
+++ b/examples/qwerty/msunicode.txt
Binary files differ
diff --git a/examples/qwerty/qwerty.cpp b/examples/qwerty/qwerty.cpp
new file mode 100644
index 000000000..ceb2f92b7
--- /dev/null
+++ b/examples/qwerty/qwerty.cpp
@@ -0,0 +1,354 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qwerty.h"
+#include <qapplication.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qpopupmenu.h>
+#include <qtextstream.h>
+#include <qpainter.h>
+#include <qmessagebox.h>
+#include <qpaintdevicemetrics.h>
+#include <qptrlist.h>
+#include <qfontdialog.h>
+
+#include <qtextcodec.h>
+
+const bool no_writing = FALSE;
+
+static TQPtrList<TQTextCodec> *codecList = 0;
+
+enum { Uni = 0, MBug = 1, Lat1 = 2, Local = 3, Guess = 4, Codec = 5 };
+
+
+Editor::Editor( TQWidget * parent , const char * name )
+ : TQWidget( parent, name, WDestructiveClose )
+{
+ m = new TQMenuBar( this, "menu" );
+
+ TQPopupMenu * file = new TQPopupMenu();
+ Q_CHECK_PTR( file );
+ m->insertItem( "&File", file );
+
+ file->insertItem( "&New", this, SLOT(newDoc()), ALT+Key_N );
+ file->insertItem( "&Open...", this, SLOT(load()), ALT+Key_O );
+ file->insertItem( "&Save...", this, SLOT(save()), ALT+Key_S );
+ file->insertSeparator();
+ open_as = new TQPopupMenu();
+ file->insertItem( "Open &As", open_as );
+ save_as = new TQPopupMenu();
+ file->insertItem( "Sa&ve As", save_as );
+ file->insertItem( "Add &Encoding", this, SLOT(addEncoding()) );
+#ifndef QT_NO_PRINTER
+ file->insertSeparator();
+ file->insertItem( "&Print...", this, SLOT(print()), ALT+Key_P );
+#endif
+ file->insertSeparator();
+ file->insertItem( "&Close", this, SLOT(close()),ALT+Key_W );
+ file->insertItem( "&Quit", qApp, SLOT(closeAllWindows()), ALT+Key_Q );
+
+ connect( save_as, SIGNAL(activated(int)), this, SLOT(saveAsEncoding(int)) );
+ connect( open_as, SIGNAL(activated(int)), this, SLOT(openAsEncoding(int)) );
+ rebuildCodecList();
+
+ TQPopupMenu * edit = new TQPopupMenu();
+ Q_CHECK_PTR( edit );
+ m->insertItem( "&Edit", edit );
+
+ edit->insertItem( "To &Uppercase", this, SLOT(toUpper()), ALT+Key_U );
+ edit->insertItem( "To &Lowercase", this, SLOT(toLower()), ALT+Key_L );
+#ifndef QT_NO_FONTDIALOG
+ edit->insertSeparator();
+ edit->insertItem( "&Select Font" , this, SLOT(font()), ALT+Key_T );
+#endif
+ changed = FALSE;
+ e = new TQMultiLineEdit( this, "editor" );
+ connect( e, SIGNAL( textChanged() ), this, SLOT( textChanged() ) );
+
+ // We use Unifont - if you have it installed you'll see all
+ // Unicode character glyphs.
+ //
+ // Unifont only comes in one pixel size, so we cannot let
+ // it change pixel size as the display DPI changes.
+ //
+ TQFont unifont("unifont",16,50); unifont.setPixelSize(16);
+ e->setFont( unifont );
+
+ e->setFocus();
+}
+
+Editor::~Editor()
+{
+}
+
+void Editor::font()
+{
+#ifndef QT_NO_FONTDIALOG
+ bool ok;
+ TQFont f = TQFontDialog::getFont( &ok, e->font() );
+ if ( ok ) {
+ e->setFont( f );
+ }
+#endif
+}
+
+
+
+void Editor::rebuildCodecList()
+{
+ delete codecList;
+ codecList = new TQPtrList<TQTextCodec>;
+ TQTextCodec *codec;
+ int i;
+ for (i = 0; (codec = TQTextCodec::codecForIndex(i)); i++)
+ codecList->append( codec );
+ int n = codecList->count();
+ for (int pm=0; pm<2; pm++) {
+ TQPopupMenu* menu = pm ? open_as : save_as;
+ menu->clear();
+ TQString local = "Local (";
+ local += TQTextCodec::codecForLocale()->name();
+ local += ")";
+ menu->insertItem( local, Local );
+ menu->insertItem( "Unicode", Uni );
+ menu->insertItem( "Latin1", Lat1 );
+ menu->insertItem( "Microsoft Unicode", MBug );
+ if ( pm )
+ menu->insertItem( "[guess]", Guess );
+ for ( i = 0; i < n; i++ )
+ menu->insertItem( codecList->at(i)->name(), Codec + i );
+ }
+}
+
+void Editor::newDoc()
+{
+ Editor *ed = new Editor;
+ if ( qApp->desktop()->size().width() < 450
+ || qApp->desktop()->size().height() < 450 ) {
+ ed->showMaximized();
+ } else {
+ ed->resize( 400, 400 );
+ ed->show();
+ }
+}
+
+
+void Editor::load()
+{
+#ifndef QT_NO_FILEDIALOG
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
+ if ( !fn.isEmpty() )
+ load( fn, -1 );
+#endif
+}
+
+void Editor::load( const TQString& fileName, int code )
+{
+ TQFile f( fileName );
+ if ( !f.open( IO_ReadOnly ) )
+ return;
+
+ e->setAutoUpdate( FALSE );
+
+ TQTextStream t(&f);
+ if ( code >= Codec )
+ t.setCodec( codecList->at(code-Codec) );
+ else if ( code == Uni )
+ t.setEncoding( TQTextStream::Unicode );
+ else if ( code == MBug )
+ t.setEncoding( TQTextStream::UnicodeReverse );
+ else if ( code == Lat1 )
+ t.setEncoding( TQTextStream::Latin1 );
+ else if ( code == Guess ) {
+ TQFile f(fileName);
+ f.open(IO_ReadOnly);
+ char buffer[256];
+ int l = 256;
+ l=f.readBlock(buffer,l);
+ TQTextCodec* codec = TQTextCodec::codecForContent(buffer, l);
+ if ( codec ) {
+ TQMessageBox::information(this,"Encoding",TQString("Codec: ")+codec->name());
+ t.setCodec( codec );
+ }
+ }
+ e->setText( t.read() );
+ f.close();
+
+ e->setAutoUpdate( TRUE );
+ e->repaint();
+ setCaption( fileName );
+
+ changed = FALSE;
+}
+
+void Editor::openAsEncoding( int code )
+{
+#ifndef QT_NO_FILEDIALOG
+ //storing filename (proper save) is left as an exercise...
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
+ if ( !fn.isEmpty() )
+ (void) load( fn, code );
+#endif
+}
+
+bool Editor::save()
+{
+#ifndef QT_NO_FILEDIALOG
+ //storing filename (proper save) is left as an exercise...
+ TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, this );
+ if ( !fn.isEmpty() )
+ return saveAs( fn );
+ return FALSE;
+#endif
+}
+
+void Editor::saveAsEncoding( int code )
+{
+#ifndef QT_NO_FILEDIALOG
+ //storing filename (proper save) is left as an exercise...
+ TQString fn = TQFileDialog::getSaveFileName( TQString::null, TQString::null, this );
+ if ( !fn.isEmpty() )
+ (void) saveAs( fn, code );
+#endif
+}
+
+void Editor::addEncoding()
+{
+#ifndef QT_NO_FILEDIALOG
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, "*.map", this );
+ if ( !fn.isEmpty() ) {
+ TQFile f(fn);
+ if (f.open(IO_ReadOnly)) {
+ if (TQTextCodec::loadCharmap(&f)) {
+ rebuildCodecList();
+ } else {
+ TQMessageBox::warning(0,"Charmap error",
+ "The file did not contain a valid charmap.\n\n"
+ "A charmap file should look like this:\n"
+ " <code_set_name> thename\n"
+ " <escape_char> /\n"
+ " % alias thealias\n"
+ " CHARMAP\n"
+ " <tokenname> /x12 <U3456>\n"
+ " <tokenname> /xAB/x12 <U0023>\n"
+ " ...\n"
+ " END CHARMAP\n"
+ );
+ }
+ }
+ }
+#endif
+}
+
+
+bool Editor::saveAs( const TQString& fileName, int code )
+{
+ TQFile f( fileName );
+ if ( no_writing || !f.open( IO_WriteOnly ) ) {
+ TQMessageBox::warning(this,"I/O Error",
+ TQString("The file could not be opened.\n\n")
+ +fileName);
+ return FALSE;
+ }
+ TQTextStream t(&f);
+ if ( code >= Codec )
+ t.setCodec( codecList->at(code-Codec) );
+ else if ( code == Uni )
+ t.setEncoding( TQTextStream::Unicode );
+ else if ( code == MBug )
+ t.setEncoding( TQTextStream::UnicodeReverse );
+ else if ( code == Lat1 )
+ t.setEncoding( TQTextStream::Latin1 );
+ t << e->text();
+ f.close();
+ setCaption( fileName );
+ changed = FALSE;
+ return TRUE;
+}
+
+void Editor::print()
+{
+#ifndef QT_NO_PRINTER
+ if ( printer.setup(this) ) { // opens printer dialog
+ printer.setFullPage(TRUE); // we'll set our own margins
+ TQPainter p;
+ p.begin( &printer ); // paint on printer
+ p.setFont( e->font() );
+ TQFontMetrics fm = p.fontMetrics();
+ TQPaintDeviceMetrics metrics( &printer ); // need width/height
+ // of printer surface
+ const int MARGIN = metrics.logicalDpiX() / 2; // half-inch margin
+ int yPos = MARGIN; // y position for each line
+
+ for( int i = 0 ; i < e->numLines() ; i++ ) {
+ if ( printer.aborted() )
+ break;
+ if ( yPos + fm.lineSpacing() > metrics.height() - MARGIN ) {
+ // no more room on this page
+ if ( !printer.newPage() ) // start new page
+ break; // some error
+ yPos = MARGIN; // back to top of page
+ }
+ p.drawText( MARGIN, yPos, metrics.width() - 2*MARGIN,
+ fm.lineSpacing(), ExpandTabs, e->textLine( i ) );
+ yPos += fm.lineSpacing();
+ }
+ p.end(); // send job to printer
+ }
+#endif
+}
+
+void Editor::resizeEvent( TQResizeEvent * )
+{
+ if ( e && m )
+ e->setGeometry( 0, m->height(), width(), height() - m->height() );
+}
+
+void Editor::closeEvent( TQCloseEvent *event )
+{
+ event->accept();
+
+ if ( changed ) { // the text has been changed
+ switch ( TQMessageBox::warning( this, "Qwerty",
+ "Save changes to Document?",
+ tr("&Yes"),
+ tr("&No"),
+ tr("Cancel"),
+ 0, 2) ) {
+ case 0: // yes
+ if ( save() )
+ event->accept();
+ else
+ event->ignore();
+ break;
+ case 1: // no
+ event->accept();
+ break;
+ default: // cancel
+ event->ignore();
+ break;
+ }
+ }
+}
+
+void Editor::toUpper()
+{
+ e->setText(e->text().upper());
+}
+
+void Editor::toLower()
+{
+ e->setText(e->text().lower());
+}
+
+void Editor::textChanged()
+{
+ changed = TRUE;
+}
diff --git a/examples/qwerty/qwerty.doc b/examples/qwerty/qwerty.doc
new file mode 100644
index 000000000..51a1febb1
--- /dev/null
+++ b/examples/qwerty/qwerty.doc
@@ -0,0 +1,27 @@
+/*
+*/
+/*! \page qwerty-example.html
+
+ \ingroup examples
+ \title Simple editor that can load encodings
+
+
+ <hr>
+
+ Header file:
+
+ \include qwerty/qwerty.h
+
+ <hr>
+
+ Implementation:
+
+ \include qwerty/qwerty.cpp
+
+ <hr>
+
+ Main:
+
+ \include qwerty/main.cpp
+*/
+
diff --git a/examples/qwerty/qwerty.h b/examples/qwerty/qwerty.h
new file mode 100644
index 000000000..5509d5bd1
--- /dev/null
+++ b/examples/qwerty/qwerty.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TQWERTY_H
+#define TQWERTY_H
+
+#include <qwidget.h>
+#include <qmenubar.h>
+#include <qmultilineedit.h>
+#include <qprinter.h>
+
+class Editor : public TQWidget
+{
+ Q_OBJECT
+public:
+ Editor( TQWidget *parent=0, const char *name="qwerty" );
+ ~Editor();
+
+ void load( const TQString& fileName, int code=-1 );
+
+public slots:
+ void newDoc();
+ void load();
+ bool save();
+ void print();
+ void addEncoding();
+ void toUpper();
+ void toLower();
+ void font();
+protected:
+ void resizeEvent( TQResizeEvent * );
+ void closeEvent( TQCloseEvent * );
+
+private slots:
+ void saveAsEncoding( int );
+ void openAsEncoding( int );
+ void textChanged();
+
+private:
+ bool saveAs( const TQString& fileName, int code=-1 );
+ void rebuildCodecList();
+ TQMenuBar *m;
+ TQMultiLineEdit *e;
+#ifndef QT_NO_PRINTER
+ TQPrinter printer;
+#endif
+ TQPopupMenu *save_as;
+ TQPopupMenu *open_as;
+ bool changed;
+};
+
+#endif // TQWERTY_H
diff --git a/examples/qwerty/qwerty.pro b/examples/qwerty/qwerty.pro
new file mode 100644
index 000000000..474333a55
--- /dev/null
+++ b/examples/qwerty/qwerty.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = qwerty
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = qwerty.h
+SOURCES = main.cpp \
+ qwerty.cpp
diff --git a/examples/qwerty/unicode.txt b/examples/qwerty/unicode.txt
new file mode 100644
index 000000000..1d08d414f
--- /dev/null
+++ b/examples/qwerty/unicode.txt
Binary files differ
diff --git a/examples/rangecontrols/main.cpp b/examples/rangecontrols/main.cpp
new file mode 100644
index 000000000..bc2fa2896
--- /dev/null
+++ b/examples/rangecontrols/main.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "rangecontrols.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ RangeControls rangecontrols;
+ rangecontrols.resize( 500, 300 );
+ rangecontrols.setCaption( "TQt Example - Range Control Widgets" );
+ a.setMainWidget( &rangecontrols );
+ rangecontrols.show();
+
+ return a.exec();
+}
diff --git a/examples/rangecontrols/rangecontrols.cpp b/examples/rangecontrols/rangecontrols.cpp
new file mode 100644
index 000000000..82d61673c
--- /dev/null
+++ b/examples/rangecontrols/rangecontrols.cpp
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "rangecontrols.h"
+
+#include <qhbox.h>
+#include <qlcdnumber.h>
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qslider.h>
+#include <qcheckbox.h>
+
+#include <limits.h>
+
+RangeControls::RangeControls( TQWidget *parent, const char *name )
+ : TQVBox( parent, name )
+{
+ TQHBox *row1 = new TQHBox( this );
+
+ TQVBox *cell2 = new TQVBox( row1 );
+ cell2->setMargin( 10 );
+ cell2->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken );
+
+ (void)new TQWidget( cell2 );
+
+ TQLabel *label1 = new TQLabel( TQString( "Enter a value between\n%1 and %2:" ).arg( -INT_MAX ).arg( INT_MAX ), cell2 );
+ label1->setMaximumHeight( label1->sizeHint().height() );
+ TQSpinBox *sb1 = new TQSpinBox( -INT_MAX, INT_MAX, 1, cell2 );
+ sb1->setValue( 0 );
+
+ TQLabel *label2 = new TQLabel( "Enter a zoom value:", cell2 );
+ label2->setMaximumHeight( label2->sizeHint().height() );
+ TQSpinBox *sb2 = new TQSpinBox( 0, 1000, 10, cell2 );
+ sb2->setSuffix( " %" );
+ sb2->setSpecialValueText( "Automatic" );
+
+ TQLabel *label3 = new TQLabel( "Enter a price:", cell2 );
+ label3->setMaximumHeight( label3->sizeHint().height() );
+ TQSpinBox *sb3 = new TQSpinBox( 0, INT_MAX, 1, cell2 );
+ sb3->setPrefix( "$" );
+ sb3->setValue( 355 );
+
+ (void)new TQWidget( cell2 );
+
+ TQHBox *row2 = new TQHBox( this );
+
+ TQVBox *cell3 = new TQVBox( row2 );
+ cell3->setMargin( 10 );
+ cell3->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken );
+ TQSlider *hslider = new TQSlider( 0, 64, 1, 33, TQt::Horizontal, cell3, "horizontal_s" );
+ TQLCDNumber *lcd2 = new TQLCDNumber( 2, cell3 );
+ lcd2->display( 33 );
+ lcd2->setSegmentStyle( TQLCDNumber::Filled );
+ connect( hslider, SIGNAL( valueChanged( int ) ), lcd2, SLOT( display( int ) ) );
+
+ TQHBox *cell4 = new TQHBox( row2 );
+ cell4->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken );
+ cell4->setMargin( 10 );
+ TQSlider *vslider = new TQSlider( 0, 64, 1, 8, TQt::Vertical, cell4 );
+ TQLCDNumber *lcd3 = new TQLCDNumber( 3, cell4 );
+ lcd3->display( 8 );
+ connect( vslider, SIGNAL( valueChanged( int ) ), lcd3, SLOT( display( int ) ) );
+}
diff --git a/examples/rangecontrols/rangecontrols.doc b/examples/rangecontrols/rangecontrols.doc
new file mode 100644
index 000000000..3fc3323c3
--- /dev/null
+++ b/examples/rangecontrols/rangecontrols.doc
@@ -0,0 +1,28 @@
+/*
+*/
+/*! \page rangecontrols-example.html
+
+ \ingroup examples
+ \title Range controls
+
+ This examples shows various types of range controls that
+ are supported by Qt: dials, spin boxes and sliders.
+
+ <hr>
+
+ Header file:
+
+ \include rangecontrols/rangecontrols.h
+
+ <hr>
+
+ Implementation:
+
+ \include rangecontrols/rangecontrols.cpp
+
+ <hr>
+
+ Main:
+
+ \include rangecontrols/main.cpp
+*/
diff --git a/examples/rangecontrols/rangecontrols.h b/examples/rangecontrols/rangecontrols.h
new file mode 100644
index 000000000..549815c0d
--- /dev/null
+++ b/examples/rangecontrols/rangecontrols.h
@@ -0,0 +1,28 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef RANGECONTROLS_H
+#define RANGECONTROLS_H
+
+#include <qvbox.h>
+
+class TQCheckBox;
+
+class RangeControls : public TQVBox
+{
+ Q_OBJECT
+
+public:
+ RangeControls( TQWidget *parent = 0, const char *name = 0 );
+
+private:
+ TQCheckBox *notches, *wrapping;
+};
+
+#endif
diff --git a/examples/rangecontrols/rangecontrols.pro b/examples/rangecontrols/rangecontrols.pro
new file mode 100644
index 000000000..21c1a5ddc
--- /dev/null
+++ b/examples/rangecontrols/rangecontrols.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = rangecontrols
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = rangecontrols.h
+SOURCES = main.cpp \
+ rangecontrols.cpp
diff --git a/examples/regexptester/main.cpp b/examples/regexptester/main.cpp
new file mode 100644
index 000000000..493c955af
--- /dev/null
+++ b/examples/regexptester/main.cpp
@@ -0,0 +1,11 @@
+#include <qapplication.h>
+#include "regexptester.h"
+
+int main(int argc, char **argv)
+{
+ TQApplication app(argc, argv);
+ RegexpTester form;
+ form.show();
+ app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(tquit()));
+ return app.exec();
+}
diff --git a/examples/regexptester/regexptester.cpp b/examples/regexptester/regexptester.cpp
new file mode 100644
index 000000000..326c02048
--- /dev/null
+++ b/examples/regexptester/regexptester.cpp
@@ -0,0 +1,179 @@
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qclipboard.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qstatusbar.h>
+#include <qtable.h>
+
+#include "regexptester.h"
+
+
+RegexpTester::RegexpTester(TQWidget* parent, const char* name, bool modal,
+ WFlags f)
+ : TQDialog(parent, name, modal, f)
+{
+ regexLabel = new TQLabel(this);
+ regexComboBox = new TQComboBox(this);
+ regexComboBox->setEditable(true);
+ regexComboBox->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Preferred);
+ regexLabel->setBuddy(regexComboBox);
+ textLabel = new TQLabel(this);
+ textComboBox = new TQComboBox(this);
+ textComboBox->setEditable(true);
+ textComboBox->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Preferred);
+ textLabel->setBuddy(textComboBox);
+ caseSensitiveCheckBox = new TQCheckBox(this);
+ caseSensitiveCheckBox->setChecked(true);
+ minimalCheckBox = new TQCheckBox(this);
+ wildcardCheckBox = new TQCheckBox(this);
+ resultTable = new TQTable(3, 3, this);
+ resultTable->verticalHeader()->hide();
+ resultTable->setLeftMargin(0);
+ resultTable->horizontalHeader()->hide();
+ resultTable->setTopMargin(0);
+ resultTable->setReadOnly(true);
+ executePushButton = new TQPushButton(this);
+ executePushButton->setDefault(true);
+ copyPushButton = new TQPushButton(this);
+ tquitPushButton = new TQPushButton(this);
+ statusBar = new TQStatusBar(this);
+
+ TQGridLayout *gridLayout = new TQGridLayout(2, 2, 6);
+ gridLayout->addWidget(regexLabel, 0, 0);
+ gridLayout->addWidget(regexComboBox, 0, 1);
+ gridLayout->addWidget(textLabel, 1, 0);
+ gridLayout->addWidget(textComboBox, 1, 1);
+ TQHBoxLayout *checkboxLayout = new TQHBoxLayout(0, 6, 6);
+ checkboxLayout->addWidget(caseSensitiveCheckBox);
+ checkboxLayout->addWidget(minimalCheckBox);
+ checkboxLayout->addWidget(wildcardCheckBox);
+ checkboxLayout->addStretch(1);
+ TQVBoxLayout *buttonLayout = new TQVBoxLayout(0, 6, 6);
+ buttonLayout->addWidget(executePushButton);
+ buttonLayout->addWidget(copyPushButton);
+ buttonLayout->addWidget(tquitPushButton);
+ buttonLayout->addStretch(1);
+ TQHBoxLayout *middleLayout = new TQHBoxLayout(0, 6, 6);
+ middleLayout->addWidget(resultTable);
+ middleLayout->addLayout(buttonLayout);
+ TQVBoxLayout *mainLayout = new TQVBoxLayout(this, 6, 6);
+ mainLayout->addLayout(gridLayout);
+ mainLayout->addLayout(checkboxLayout);
+ mainLayout->addLayout(middleLayout);
+ mainLayout->addWidget(statusBar);
+
+ resize(TQSize(500, 350).expandedTo(minimumSizeHint()));
+
+ languageChange();
+
+ connect(copyPushButton, SIGNAL(clicked()), this, SLOT(copy()));
+ connect(executePushButton, SIGNAL(clicked()), this, SLOT(execute()));
+ connect(tquitPushButton, SIGNAL(clicked()), this, SLOT(accept()));
+
+ execute();
+}
+
+void RegexpTester::execute()
+{
+ TQString regex = regexComboBox->currentText();
+ TQString text = textComboBox->currentText();
+ if (!regex.isEmpty() && !text.isEmpty()) {
+ TQRegExp re(regex);
+ re.setCaseSensitive(caseSensitiveCheckBox->isChecked());
+ re.setMinimal(minimalCheckBox->isChecked());
+ bool wildcard = wildcardCheckBox->isChecked();
+ re.setWildcard(wildcard);
+ if (!re.isValid()) {
+ statusBar->message(tr("Invalid regular expression: %1")
+ .arg(re.errorString()));
+ return;
+ }
+ int offset = re.search(text);
+ int captures = re.numCaptures();
+ int row = 0;
+ const int OFFSET = 5;
+ resultTable->setNumRows(0);
+ resultTable->setNumRows(captures + OFFSET);
+ resultTable->setText(row, 0, tr("Regex"));
+ TQString escaped = regex;
+ escaped = escaped.replace("\\", "\\\\");
+ resultTable->setText(row, 1, escaped);
+ resultTable->item(row, 1)->setSpan(1, 2);
+ if (offset != -1) {
+ ++row;
+ resultTable->setText(row, 0, tr("Offset"));
+ resultTable->setText(row, 1, TQString::number(offset));
+ resultTable->item(row, 1)->setSpan(1, 2);
+ if (!wildcard) {
+ ++row;
+ resultTable->setText(row, 0, tr("Captures"));
+ resultTable->setText(row, 1, TQString::number(captures));
+ resultTable->item(row, 1)->setSpan(1, 2);
+ ++row;
+ resultTable->setText(row, 1, tr("Text"));
+ resultTable->setText(row, 2, tr("Characters"));
+ }
+ ++row;
+ resultTable->setText(row, 0, tr("Match"));
+ resultTable->setText(row, 1, re.cap(0));
+ resultTable->setText(row, 2, TQString::number(re.matchedLength()));
+ if (!wildcard) {
+ for (int i = 1; i <= captures; ++i) {
+ resultTable->setText(row + i, 0, tr("Capture #%1").arg(i));
+ resultTable->setText(row + i, 1, re.cap(i));
+ resultTable->setText(row + i, 2,
+ TQString::number(re.cap(i).length()));
+ }
+ }
+ else
+ resultTable->setNumRows(3);
+ }
+ else {
+ resultTable->setNumRows(2);
+ ++row;
+ resultTable->setText(row, 0, tr("No matches"));
+ resultTable->item(row, 0)->setSpan(1, 3);
+ }
+ resultTable->adjustColumn(0);
+ resultTable->adjustColumn(1);
+ resultTable->adjustColumn(2);
+ statusBar->message(tr("Executed \"%1\" on \"%2\"")
+ .arg(escaped).arg(text));
+ }
+ else
+ statusBar->message(tr("A regular expression and a text must be given"));
+}
+
+void RegexpTester::copy()
+{
+ TQString escaped = regexComboBox->currentText();
+ if (!escaped.isEmpty()) {
+ escaped = escaped.replace("\\", "\\\\");
+ TQClipboard *cb = TQApplication::clipboard();
+ cb->setText(escaped, TQClipboard::Clipboard);
+ if (cb->supportsSelection())
+ cb->setText(escaped, TQClipboard::Selection);
+ statusBar->message(tr("Copied \"%1\" to the clipboard")
+ .arg(escaped));
+ }
+}
+
+void RegexpTester::languageChange()
+{
+ setCaption(tr("Regex Tester"));
+ regexLabel->setText(tr("&Regex:"));
+ regexComboBox->insertItem(tr("[A-Z]+=(\\d+):(\\d*)"));
+ textLabel->setText(tr("&Text:"));
+ textComboBox->insertItem(tr("ABC=12:3456"));
+ caseSensitiveCheckBox->setText(tr("Case &Sensitive"));
+ minimalCheckBox->setText(tr("&Minimal"));
+ wildcardCheckBox->setText(tr("&Wildcard"));
+ copyPushButton->setText(tr("&Copy"));
+ executePushButton->setText(tr("&Execute"));
+ tquitPushButton->setText(tr("&Quit"));
+}
+
diff --git a/examples/regexptester/regexptester.doc b/examples/regexptester/regexptester.doc
new file mode 100644
index 000000000..81f7cb435
--- /dev/null
+++ b/examples/regexptester/regexptester.doc
@@ -0,0 +1,35 @@
+/*!
+ \page regexptester-example.html
+
+ \ingroup examples
+
+ \title A Small Application for Testing Regular Expressions
+
+ Regular expressions can sometimes be tricky to get right,
+ especially those that use the * quantifier. This application lets
+ you type in a regexp (without doubling the backslashes) and some
+ test text, and to execute the regexp and see the results. If you
+ click the Copy button the regexp will be copied to the clipboard
+ (with the backslashes doubled, ready for you to paste into your
+ program). Previous regexps and test texts are remembered
+ throughout the session and can be accessed by dropping down the
+ comboboxes.
+
+ <hr>
+
+ Header file:
+
+ \include regexptester/regexptester.h
+
+ <hr>
+
+ Implementation:
+
+ \include regexptester/regexptester.cpp
+
+ <hr>
+
+ Main:
+
+ \include regexptester/main.cpp
+*/
diff --git a/examples/regexptester/regexptester.h b/examples/regexptester/regexptester.h
new file mode 100644
index 000000000..faff773bf
--- /dev/null
+++ b/examples/regexptester/regexptester.h
@@ -0,0 +1,42 @@
+#ifndef REGEXPTESTER_H
+#define REGEXPTESTER_H
+
+#include <qdialog.h>
+
+class TQCheckBox;
+class TQComboBox;
+class TQLabel;
+class TQPushButton;
+class TQStatusBar;
+class TQTable;
+
+class RegexpTester : public TQDialog
+{
+ Q_OBJECT
+
+public:
+ RegexpTester(TQWidget* parent=0, const char* name=0, bool modal=false,
+ WFlags f=0);
+
+ TQLabel *regexLabel;
+ TQComboBox *regexComboBox;
+ TQLabel *textLabel;
+ TQComboBox *textComboBox;
+ TQCheckBox *caseSensitiveCheckBox;
+ TQCheckBox *minimalCheckBox;
+ TQCheckBox *wildcardCheckBox;
+ TQTable *resultTable;
+ TQPushButton *executePushButton;
+ TQPushButton *copyPushButton;
+ TQPushButton *tquitPushButton;
+ TQStatusBar *statusBar;
+
+public slots:
+ void copy();
+ void execute();
+
+private:
+ void languageChange();
+};
+
+#endif // REGEXPTESTER_H
diff --git a/examples/regexptester/regexptester.pro b/examples/regexptester/regexptester.pro
new file mode 100644
index 000000000..9aeee9f8f
--- /dev/null
+++ b/examples/regexptester/regexptester.pro
@@ -0,0 +1,5 @@
+SOURCES += main.cpp
+HEADERS += regexptester.h
+SOURCES += regexptester.cpp
+
+REQUIRES += table full-config
diff --git a/examples/richtext/main.cpp b/examples/richtext/main.cpp
new file mode 100644
index 000000000..5e7ffff89
--- /dev/null
+++ b/examples/richtext/main.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "richtext.h"
+#include <qapplication.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ MyRichText richtext;
+ richtext.resize( 450, 350 );
+ richtext.setCaption( "TQt Example - Richtext" );
+ a.setMainWidget( &richtext );
+ richtext.show();
+
+ return a.exec();
+}
diff --git a/examples/richtext/marble.png b/examples/richtext/marble.png
new file mode 100644
index 000000000..5caf7eaaf
--- /dev/null
+++ b/examples/richtext/marble.png
Binary files differ
diff --git a/examples/richtext/richtext.cpp b/examples/richtext/richtext.cpp
new file mode 100644
index 000000000..e2b393eae
--- /dev/null
+++ b/examples/richtext/richtext.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "richtext.h"
+
+#include <qhbox.h>
+#include <qhbox.h>
+#include <qpushbutton.h>
+#include <qtextview.h>
+#include <qbrush.h>
+#include <qapplication.h>
+
+static const char* sayings[] = {
+ "<b>Saying 1:</b><br>"
+ "<hr><br><br>"
+ "<big>Evil is that which one believes of others. It is a sin to believe evil "
+ "of others, but it is seldom a mistake.</big><br><br>"
+ "<center><i>-- H.L. Mencken</i></center>",
+
+ "<b>Saying 2:</b><br>"
+ "<hr><br><br>"
+ "<big>A well-used door needs no oil on its hinges.<br>"
+ "A swift-flowing steam does not grow stagnant.<br>"
+ "Neither sound nor thoughts can travel through a vacuum.<br>"
+ "Software rots if not used.<br><br>"
+ "These are great mysteries.</big><br><br>"
+ "<center><i>-- Geoffrey James, \"The Tao of Programming\"</i></center>",
+
+ "<b>Saying 3:</b><br>"
+ "<hr><br><br>"
+ "<big>Show business is just like high school, except you get paid.</big><br><br>"
+ "<center><i>-- Martin Mull</i></center>",
+
+ "<b>Saying 4:</b><br>"
+ "<hr><br><br>"
+ "<big><b>The Least Successful Executions</b><br>"
+ "<twocolumn><p> History has furnished us with two executioners worthy of attention. "
+ "The first performed in Sydney in Australia. In 1803 three attempts were "
+ "made to hang a Mr. Joseph Samuels. On the first two of these the rope "
+ "snapped, while on the third Mr. Samuels just hung there peacefully until he "
+ "and everyone else got bored. Since he had proved unsusceptible to capital "
+ "punishment, he was reprieved.</p>"
+ "<p> The most important British executioner was Mr. James Berry who "
+ "tried three times in 1885 to hang Mr. John Lee at Exeter Jail, but on each "
+ "occasion failed to get the trap door open.<!p>"
+ "<p> In recognition of this achievement, the Home Secretary commuted "
+ "Lee's sentence to \"life\" imprisonment. He was released in 1917, emigrated "
+ "to America and lived until 1933.</p></twocolumn></big><br><br>"
+ "<center><i>-- Stephen Pile, \"The Book of Heroic Failures\"</i></center>",
+
+ "<b>Saying 5:</b><br>"
+ "<hr><br><br>"
+ "<big>If you can, help others. If you can't, at least don't hurt others.</big><br><br>"
+ "<center><i>-- the Dalai Lama</i></center>",
+
+ "<b>Saying 6:</b><br>"
+ "<hr><br><br>"
+ "<big>Television has brought back murder into the home -- where it belongs.</big><br><br>"
+ "<center><i>-- Alfred Hitchcock</i></center>",
+
+ "<b>Saying 7:</b><br>"
+ "<hr><br><br>"
+ "<big>I don't know who my grandfather was; I am much more concerned to know "
+ "what his grandson will be.</big><br><br>"
+ "<center><i>-- Abraham Lincoln</i></center>",
+
+ 0
+};
+
+
+MyRichText::MyRichText( TQWidget *parent, const char *name )
+ : TQVBox( parent, name )
+{
+ setMargin( 5 );
+
+ view = new TQTextView( this );
+ view->setText( "This is a <b>Test</b> with <i>italic</i> <u>stuff</u>" );
+ TQBrush paper;
+ paper.setPixmap( TQPixmap( "../richtext/marble.png" ) );
+ if ( paper.pixmap() != 0 )
+ view->setPaper( paper );
+ else
+ view->setPaper( white );
+
+ view->setText( sayings[0] );
+ view->setMinimumSize( 450, 250 );
+
+ TQHBox *buttons = new TQHBox( this );
+ buttons->setMargin( 5 );
+
+ bClose = new TQPushButton( "&Close", buttons );
+ bPrev = new TQPushButton( "<< &Prev", buttons );
+ bNext = new TQPushButton( "&Next >>", buttons );
+
+ bPrev->setEnabled( FALSE );
+
+ connect( bClose, SIGNAL( clicked() ), qApp, SLOT( tquit() ) );
+ connect( bPrev, SIGNAL( clicked() ), this, SLOT( prev() ) );
+ connect( bNext, SIGNAL( clicked() ), this, SLOT( next() ) );
+
+ num = 0;
+}
+
+void MyRichText::prev()
+{
+ if ( num <= 0 )
+ return;
+
+ num--;
+
+ view->setText( sayings[num] );
+
+ if ( num == 0 )
+ bPrev->setEnabled( FALSE );
+
+ bNext->setEnabled( TRUE );
+}
+
+void MyRichText::next()
+{
+ if ( !sayings[++num] )
+ return;
+
+ view->setText( sayings[num] );
+
+ if ( !sayings[num + 1] )
+ bNext->setEnabled( FALSE );
+
+ bPrev->setEnabled( TRUE );
+}
+
+
+
+
+
diff --git a/examples/richtext/richtext.doc b/examples/richtext/richtext.doc
new file mode 100644
index 000000000..661e262c6
--- /dev/null
+++ b/examples/richtext/richtext.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page richtext-example.html
+
+ \ingroup examples
+ \title Richtext
+
+ In this example we demonstrate how to display rich text
+ in a widget. To do this some sayings taken from the famous
+ Unix "fortune" are displayed nicely formatted.
+
+ <hr>
+
+ Header file:
+
+ \include richtext/richtext.h
+
+ <hr>
+
+ Implementation:
+
+ \include richtext/richtext.cpp
+
+ <hr>
+
+ Main:
+
+ \include richtext/main.cpp
+*/
diff --git a/examples/richtext/richtext.h b/examples/richtext/richtext.h
new file mode 100644
index 000000000..4c0baf75e
--- /dev/null
+++ b/examples/richtext/richtext.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef RICHTEXT_H
+#define RICHTEXT_H
+
+#include <qvbox.h>
+
+class TQTextView;
+class TQPushButton;
+
+class MyRichText : public TQVBox
+{
+ Q_OBJECT
+
+public:
+ MyRichText( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ TQTextView *view;
+ TQPushButton *bClose, *bNext, *bPrev;
+ int num;
+
+protected slots:
+ void prev();
+ void next();
+
+};
+
+#endif
diff --git a/examples/richtext/richtext.pro b/examples/richtext/richtext.pro
new file mode 100644
index 000000000..b97b4abb1
--- /dev/null
+++ b/examples/richtext/richtext.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = richtext
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = medium-config
+
+HEADERS = richtext.h
+SOURCES = main.cpp \
+ richtext.cpp
diff --git a/examples/rot13/rot13.cpp b/examples/rot13/rot13.cpp
new file mode 100644
index 000000000..967c72de7
--- /dev/null
+++ b/examples/rot13/rot13.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "rot13.h"
+
+#include <qmultilineedit.h>
+#include <qpushbutton.h>
+#include <qapplication.h>
+#include <qlayout.h>
+
+Rot13::Rot13()
+{
+ left = new TQMultiLineEdit( this, "left" );
+ right = new TQMultiLineEdit( this, "right" );
+ connect( left, SIGNAL(textChanged()), this, SLOT(changeRight()) );
+ connect( right, SIGNAL(textChanged()), this, SLOT(changeLeft()) );
+
+ TQPushButton * tquit = new TQPushButton( "&Quit", this );
+ tquit->setFocusPolicy( NoFocus );
+ connect( tquit, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+
+ TQGridLayout * l = new TQGridLayout( this, 2, 2, 5 );
+ l->addWidget( left, 0, 0 );
+ l->addWidget( right, 0, 1 );
+ l->addWidget( tquit, 1, 1, AlignRight );
+
+ left->setFocus();
+}
+
+
+void Rot13::changeLeft()
+{
+ left->blockSignals( TRUE );
+ left->setText( rot13( right->text() ) );
+ left->blockSignals( FALSE );
+}
+
+
+void Rot13::changeRight()
+{
+ right->blockSignals( TRUE );
+ right->setText( rot13( left->text() ) );
+ right->blockSignals( FALSE );
+}
+
+
+TQString Rot13::rot13( const TQString & input ) const
+{
+ TQString r = input;
+ int i = r.length();
+ while( i-- ) {
+ if ( r[i] >= TQChar('A') && r[i] <= TQChar('M') ||
+ r[i] >= TQChar('a') && r[i] <= TQChar('m') )
+ r[i] = (char)((int)TQChar(r[i]) + 13);
+ else if ( r[i] >= TQChar('N') && r[i] <= TQChar('Z') ||
+ r[i] >= TQChar('n') && r[i] <= TQChar('z') )
+ r[i] = (char)((int)TQChar(r[i]) - 13);
+ }
+ return r;
+}
+
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ Rot13 r;
+ r.resize( 400, 400 );
+ a.setMainWidget( &r );
+ r.setCaption("TQt Example - ROT13");
+ r.show();
+ return a.exec();
+}
diff --git a/examples/rot13/rot13.doc b/examples/rot13/rot13.doc
new file mode 100644
index 000000000..28e3bf6cf
--- /dev/null
+++ b/examples/rot13/rot13.doc
@@ -0,0 +1,23 @@
+/*
+*/
+/*! \page rot-example.html
+
+ \ingroup examples
+ \title Rot13
+
+ This example lets you enter a text into a mulitilineedit widget.
+ It will be displayed in the edit widget to the right transformed using
+ the rot13 algorithm.
+
+ <hr>
+
+ Header file:
+
+ \include rot13/rot13.h
+
+ <hr>
+
+ Implementation:
+
+ \include rot13/rot13.cpp
+*/
diff --git a/examples/rot13/rot13.h b/examples/rot13/rot13.h
new file mode 100644
index 000000000..dc207c87e
--- /dev/null
+++ b/examples/rot13/rot13.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Definition of something or other
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef ROT13_H
+#define ROT13_H
+
+#include <qwidget.h>
+
+class TQMultiLineEdit;
+
+class Rot13: public TQWidget {
+ Q_OBJECT
+public:
+ Rot13();
+
+ TQString rot13( const TQString & ) const;
+
+private slots:
+ void changeLeft();
+ void changeRight();
+
+private:
+ TQMultiLineEdit * left, * right;
+};
+
+#endif
diff --git a/examples/rot13/rot13.pro b/examples/rot13/rot13.pro
new file mode 100644
index 000000000..e27606e52
--- /dev/null
+++ b/examples/rot13/rot13.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = rot13
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = rot13.h
+SOURCES = rot13.cpp
diff --git a/examples/scribble/main.cpp b/examples/scribble/main.cpp
new file mode 100644
index 000000000..8e5034c5c
--- /dev/null
+++ b/examples/scribble/main.cpp
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "scribble.h"
+#include <qapplication.h>
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ Scribble scribble;
+
+ scribble.resize( 500, 350 );
+ scribble.setCaption("TQt Example - Scribble");
+ a.setMainWidget( &scribble );
+ if ( TQApplication::desktop()->width() > 550
+ && TQApplication::desktop()->height() > 366 )
+ scribble.show();
+ else
+ scribble.showMaximized();
+ return a.exec();
+}
diff --git a/examples/scribble/scribble.cpp b/examples/scribble/scribble.cpp
new file mode 100644
index 000000000..438f73d5f
--- /dev/null
+++ b/examples/scribble/scribble.cpp
@@ -0,0 +1,187 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "scribble.h"
+
+#include <qapplication.h>
+#include <qevent.h>
+#include <qpainter.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qspinbox.h>
+#include <qtooltip.h>
+#include <qrect.h>
+#include <qpoint.h>
+#include <qcolordialog.h>
+#include <qfiledialog.h>
+#include <qcursor.h>
+#include <qimage.h>
+#include <qstrlist.h>
+#include <qpopupmenu.h>
+#include <qintdict.h>
+
+const bool no_writing = FALSE;
+
+Canvas::Canvas( TQWidget *parent, const char *name )
+ : TQWidget( parent, name, WStaticContents ), pen( TQt::red, 3 ), polyline(3),
+ mousePressed( FALSE ), buffer( width(), height() )
+{
+
+ if ((qApp->argc() > 0) && !buffer.load(qApp->argv()[1]))
+ buffer.fill( colorGroup().base() );
+ setBackgroundMode( TQWidget::PaletteBase );
+#ifndef QT_NO_CURSOR
+ setCursor( TQt::crossCursor );
+#endif
+}
+
+void Canvas::save( const TQString &filename, const TQString &format )
+{
+ if ( !no_writing )
+ buffer.save( filename, format.upper() );
+}
+
+void Canvas::clearScreen()
+{
+ buffer.fill( colorGroup().base() );
+ repaint( FALSE );
+}
+
+void Canvas::mousePressEvent( TQMouseEvent *e )
+{
+ mousePressed = TRUE;
+ polyline[2] = polyline[1] = polyline[0] = e->pos();
+}
+
+void Canvas::mouseReleaseEvent( TQMouseEvent * )
+{
+ mousePressed = FALSE;
+}
+
+void Canvas::mouseMoveEvent( TQMouseEvent *e )
+{
+ if ( mousePressed ) {
+ TQPainter painter;
+ painter.begin( &buffer );
+ painter.setPen( pen );
+ polyline[2] = polyline[1];
+ polyline[1] = polyline[0];
+ polyline[0] = e->pos();
+ painter.drawPolyline( polyline );
+ painter.end();
+
+ TQRect r = polyline.boundingRect();
+ r = r.normalize();
+ r.setLeft( r.left() - penWidth() );
+ r.setTop( r.top() - penWidth() );
+ r.setRight( r.right() + penWidth() );
+ r.setBottom( r.bottom() + penWidth() );
+
+ bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );
+ }
+}
+
+void Canvas::resizeEvent( TQResizeEvent *e )
+{
+ TQWidget::resizeEvent( e );
+
+ int w = width() > buffer.width() ?
+ width() : buffer.width();
+ int h = height() > buffer.height() ?
+ height() : buffer.height();
+
+ TQPixmap tmp( buffer );
+ buffer.resize( w, h );
+ buffer.fill( colorGroup().base() );
+ bitBlt( &buffer, 0, 0, &tmp, 0, 0, tmp.width(), tmp.height() );
+}
+
+void Canvas::paintEvent( TQPaintEvent *e )
+{
+ TQWidget::paintEvent( e );
+
+ TQMemArray<TQRect> rects = e->region().rects();
+ for ( uint i = 0; i < rects.count(); i++ ) {
+ TQRect r = rects[(int)i];
+ bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );
+ }
+}
+
+//------------------------------------------------------
+
+Scribble::Scribble( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name )
+{
+ canvas = new Canvas( this );
+ setCentralWidget( canvas );
+
+ TQToolBar *tools = new TQToolBar( this );
+
+ bSave = new TQToolButton( TQPixmap(), "Save", "Save as PNG image", this, SLOT( slotSave() ), tools );
+ bSave->setText( "Save as..." );
+
+ tools->addSeparator();
+
+ bPColor = new TQToolButton( TQPixmap(), "Choose Pen Color", "Choose Pen Color", this, SLOT( slotColor() ), tools );
+ bPColor->setText( "Choose Pen Color..." );
+
+ tools->addSeparator();
+
+ bPWidth = new TQSpinBox( 1, 20, 1, tools );
+ TQToolTip::add( bPWidth, "Choose Pen Width" );
+ connect( bPWidth, SIGNAL( valueChanged( int ) ), this, SLOT( slotWidth( int ) ) );
+ bPWidth->setValue( 3 );
+
+ tools->addSeparator();
+
+ bClear = new TQToolButton( TQPixmap(), "Clear Screen", "Clear Screen", this, SLOT( slotClear() ), tools );
+ bClear->setText( "Clear Screen" );
+}
+
+void Scribble::slotSave()
+{
+ TQPopupMenu *menu = new TQPopupMenu( 0 );
+ TQIntDict<TQString> formats;
+ formats.setAutoDelete( TRUE );
+
+ for ( unsigned int i = 0; i < TQImageIO::outputFormats().count(); i++ ) {
+ TQString str = TQString( TQImageIO::outputFormats().at( i ) );
+ formats.insert( menu->insertItem( TQString( "%1..." ).arg( str ) ), new TQString( str ) );
+ }
+
+ menu->setMouseTracking( TRUE );
+ int id = menu->exec( bSave->mapToGlobal( TQPoint( 0, bSave->height() + 1 ) ) );
+
+ if ( id != -1 ) {
+ TQString format = *formats[ id ];
+
+ TQString filename = TQFileDialog::getSaveFileName( TQString::null, TQString( "*.%1" ).arg( format.lower() ), this );
+ if ( !filename.isEmpty() )
+ canvas->save( filename, format );
+ }
+
+ delete menu;
+}
+
+void Scribble::slotColor()
+{
+ TQColor c = TQColorDialog::getColor( canvas->penColor(), this );
+ if ( c.isValid() )
+ canvas->setPenColor( c );
+}
+
+void Scribble::slotWidth( int w )
+{
+ canvas->setPenWidth( w );
+}
+
+void Scribble::slotClear()
+{
+ canvas->clearScreen();
+}
diff --git a/examples/scribble/scribble.doc b/examples/scribble/scribble.doc
new file mode 100644
index 000000000..6763df267
--- /dev/null
+++ b/examples/scribble/scribble.doc
@@ -0,0 +1,30 @@
+
+/*
+*/
+/*! \page scribble-example.html
+
+ \ingroup examples
+ \title Simple Painting Application
+
+ This example implements the famous scribble example. You can draw around
+ in the canvas with different pens and save the result as picture.
+
+ <hr>
+
+ Header file:
+
+ \include scribble/scribble.h
+
+ <hr>
+
+ Implementation:
+
+ \include scribble/scribble.cpp
+
+ <hr>
+
+ Main:
+
+ \include scribble/main.cpp
+*/
+
diff --git a/examples/scribble/scribble.h b/examples/scribble/scribble.h
new file mode 100644
index 000000000..6e23cbf82
--- /dev/null
+++ b/examples/scribble/scribble.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SCRIBBLE_H
+#define SCRIBBLE_H
+
+#include <qmainwindow.h>
+#include <qpen.h>
+#include <qpoint.h>
+#include <qpixmap.h>
+#include <qwidget.h>
+#include <qstring.h>
+#include <qpointarray.h>
+
+class TQMouseEvent;
+class TQResizeEvent;
+class TQPaintEvent;
+class TQToolButton;
+class TQSpinBox;
+
+class Canvas : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ Canvas( TQWidget *parent = 0, const char *name = 0 );
+
+ void setPenColor( const TQColor &c )
+ { pen.setColor( c ); }
+
+ void setPenWidth( int w )
+ { pen.setWidth( w ); }
+
+ TQColor penColor()
+ { return pen.color(); }
+
+ int penWidth()
+ { return pen.width(); }
+
+ void save( const TQString &filename, const TQString &format );
+
+ void clearScreen();
+
+protected:
+ void mousePressEvent( TQMouseEvent *e );
+ void mouseReleaseEvent( TQMouseEvent *e );
+ void mouseMoveEvent( TQMouseEvent *e );
+ void resizeEvent( TQResizeEvent *e );
+ void paintEvent( TQPaintEvent *e );
+
+ TQPen pen;
+ TQPointArray polyline;
+
+ bool mousePressed;
+
+ TQPixmap buffer;
+
+};
+
+class Scribble : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ Scribble( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ Canvas* canvas;
+
+ TQSpinBox *bPWidth;
+ TQToolButton *bPColor, *bSave, *bClear;
+
+protected slots:
+ void slotSave();
+ void slotColor();
+ void slotWidth( int );
+ void slotClear();
+
+};
+
+#endif
diff --git a/examples/scribble/scribble.pro b/examples/scribble/scribble.pro
new file mode 100644
index 000000000..35304c697
--- /dev/null
+++ b/examples/scribble/scribble.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = scribble
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = scribble.h
+SOURCES = main.cpp \
+ scribble.cpp
diff --git a/examples/scrollview/README b/examples/scrollview/README
new file mode 100644
index 000000000..3bdaa7def
--- /dev/null
+++ b/examples/scrollview/README
@@ -0,0 +1,3 @@
+This example demonstrates the use of QScrollView for displaying large
+widgets. Both techniques are demonstrated: using QScrollView to scroll
+around a large widget, and drawing arbitrary material in a QScrollView.
diff --git a/examples/scrollview/bg.ppm b/examples/scrollview/bg.ppm
new file mode 100644
index 000000000..51d8db5be
--- /dev/null
+++ b/examples/scrollview/bg.ppm
@@ -0,0 +1,4 @@
+P6
+150 150
+255
+ñßÑëÙËëØÊðÝÏïÜÎéÖÈæÓÅèÔÆçÓÅà;æÓÅôáÔöãÖ÷äÖöãÖöãÖöãÖõãÕñÞÐóàÒðÝÏóßÑøåØ÷ä×øåØûéÛÿìÞÿîàÿíàþìÞõâÔòßÑðÝÏ÷ãÖøæÙñßÑëÙËëØÊìÙËóàÒøä×øåØùæÙüéÜúçÚóàÒôàÒ÷å×úéÚõäÖôâÔùèÙþíÞýíÞúéÚûéÛøçÙóáÒòàÑôâÔðÞÐôâÔùçÚýëÝþëÝüêÜûèÛõâÔ÷ãÖùæØ÷äÖøæØþìÞúèÚ÷ä×öãÖõãÕóàÒ÷ä×úçÙôáÓóàÒûèÛýëÝõãÕíÛÍ÷å×þïáùæØõâÕñÞÐùçÚúèÛîÛÍçÔÆèÕÇõâÕýëÝþìÞýëÝþíßüéÜùæÙöãÖôâÕöãÖõâÔòßÑóàÓòÞÑîÛÍê×ÉìÙËðÜÎøå×úèÚûéÛûèÚùæØøæØ÷ä×öãÖòßÑíÛÍïÜÏóßÒøä×ôáÓñÞÐðÝÏòßÑóàÓòßÑñßÑõãÖôàÓñÝÏ÷ãÖ÷ãÕûèÛúçÚóàÒóàÒøæØöâÔùæÙûéÛøåØòàÒïÜÎòàÒòßÑðÝÏîÛÍðÝÏòßÑñßÑñÞÐöäÖóáÓìØÊìÙËóßÑñÞÐïÜÎðÝÏòßÒõâÔøåØøåØôàÒõáÓõâÕðÝÐôáÔ÷åØûéÛüéÜúçÙøä×ùæÙùæÙûéÛùæÙöãÕøä×öãÕñÞÐêØÊê×ÉïÜÎóßÑ÷ãÖøåØøåØõâÕóàÓñÞÐòáÒöå×ùèÚúéÚüêÜýìÝøçÙöåÖ÷æØüëÝýíÞüêÜþìßÿîàÿïáÿíßýêÜùæÙûèÛùæØùæØ÷äÖóáÓôâÔÿîàýëÝõáÓñÞÐöâÕöâÕòÞÐñÞÐòßÑõãÕúçÚýëÝüèÚòßÑõâÔõâÔíÚÌëÙËõâÕûéÛÿíßüêÜöãÕòàÒöäÖûéÜüéÜþìÞÿñãÿïáüìßùçÙöãÕôáÔòßÑðÝÏøå×úæÙöâÔìØÊîÛÍ÷äÖûéÜöãÖñßÒðÝÏîÛÍìÙËîÛÍóàÒùçÙüéÜûéÜùçÙûèÛøæÙ÷ä×÷å×úçÚüéÜöâÕøåØúçÚùæØöãÕôáÓøåØ÷ä×÷äÖùæÙöãÕñÞÐ÷ä×õâÕöãÕúçÚûèÛøæÙîÛÍïÜÎíÚÌîÛÍöäÖýíßûéÛúèÛþìßýëÞöãÖóáÔõâÔóßÑðÝÏóàÒúçÙýìÞôáÓôáÓóàÒõãÖôáÓîÛÍéÖÈìÙËïÝÏñÞÐñÞÐðÜÎòßÒõãÖúçÚùæØøå×úèÚüêÜøåØñÞÐëØÊíÛÍóßÑéÕÇèÕÇìÚÌóàÓôáÔñÞÐóáÓöäÖùçÙøçÙõäÖóáÒëÚËíÜÍôâÔúèÚùèÚôãÕñÞÐñÞÐóàÒ÷ãÖüéÛýìÞûéÛýëÝþëÝøæØõáÔöâÕúèÛÿíàúçÙõãÖùæØöä×ñÞÐíÚÌòàÓùæÙùæÙûéÛöä×óàÒ÷äÖøä×ôâÔøæØüéÛöãÖôáÓùåØûéÛúçÚíÛÍðÝÏòßÑ÷ä×üêÜüëÝùçÚöãÖóáÓôàÓõâÕöãÖòßÑúçÚýëÝùæÙ÷åØùçÚòßÑîÜÎêÖÈéÖÈïÜÎõâÕôàÓòÞÐóàÒ÷ãÖùçÚùæÙûèÛùæÙøåØ÷åØùæÙúçÚúçÚüêÜùæÙúçÚúçÚòßÑóàÒïÜÎïÜÎõáÔôàÓíÚÌòßÑïÜÎîÛÍñÞÑõáÔöäÖûéÛõâÔðÝÏðÝÏñÞÐïÜÎöâÔýêÜúçÙòàÒòßÑñÞÐìÚÌëÙËëÙËïÜÎöãÕúèÛøæÙöä×øåØùçÙ÷äÖõâÔðÝÏïÜÏíÛÍíÚÌíÚÌíÚÌïÜÎòÞÐõâÕýëÞÿòäþîàùçÚüêÜþìÞûèÛúçÚûèÛûèÛûèÛùæÙõãÖöãÖøåØ÷æ×óáÓñàÒôãÕðßÐéØÉûêÛýìÝùèÙôãÕôãÕ÷çÙ÷ãÕôáÓñßÑôáÓúèÚûíßñÝÏõâÕõâÔóàÒòßÒòßÑùæÙýëÞüêÜùæÙúçÚùæÙùæØôáÓøå×ûéÛøåØøæÙ÷åØúèÛþïáÿòåÿñäÿôæþòä÷å×ïÜÎòßÑõâÔôáÓðÝÏïÜÎïÜÏîÛÍíÚÌïÜÎðÝÐñÞÐòßÑõáÓùçÚýëÞúçÚòßÒðÝÏôáÓõâÔòßÑôáÓñÞÐîÛÍíÛÍòÞÐ÷ä×÷å×îÛÍçÔÆèÕÇíÚÌðÝÏîÚÌîÛÍïÜÎñÞÐóßÑôàÒøåØ÷ä×ñßÑòßÑöãÖñßÑëÙËñÞÐõâÔöãÖôáÓòßÑéÖÈïÜÎðÝÏëÙËíÚÌòàÓõâÔøåØüéÜúçÙñßÑé×ÉöãÖùæÙñÝÐéÖÈîÛÍïÜÎíÚÌîÜÎðÜÎñÞÐóàÒôáÔûèÛôàÓîÚÌèÕÇê×ÉòßÒüéÜûéÛùçÙöãÖóàÒñÝÏïÜÎïÜÎîÛÍñßÑöãÕõâÔøåØúèÚýëÝþíßÿíßÿìÞüéÜüêÝùçÚóßÑòßÑõáÔêØÊìÚËðÞÐöå×ùçÙøçÙùèÙøçÙõäÖôãÕúéÛÿòãúçÚüêÜüêÜøå×ñÞÐëØÊöãÕøåØ÷ãÖ÷åØúçÚøæÙðÞÐïÛÎóàÓùæÙüêÝÿñãýëÝüéÛúèÚøåØöä×õâÕýëÝýêÝüëÞûëÝûèÛùçÙ÷å×÷ãÖùåØüéÛüêÜúèÚüéÛûéÜúéÜñßÑëØÊíÛÍúçÚúçÚöãÕñÝÏïÛÎðÜÏòßÒïÛÍòÞÐüéÜûèÛôáÓñßÑðÝÏòÞÐöâÕöãÖôâÕñÞÐïÜÎíÚÌíÙËíÚÌíÚÌèÕÇêØÊíÛÍðÝÏòßÑôàÒòÞÐðÝÏîÛÍïÜÎñÞÐôáÓõâÕùçÙúçÚùæÙúçÚýëÝöâÕ÷ä×õáÓîÛÍëØÊìÚÌôàÒûèÚþìÞ÷åØôáÔöäÖ÷ä×õâÕóáÓøæØøæØóàÓñÞÐóàÒõáÓòßÑîÜÎëØÊòßÑðÝÏðÜÎèÕÇäÐÂëØÊøæÙüéÜÿíßþíßûèÚöä×øæØøå×óàÒçÓÅäÑÃëØÊúèÚ÷ãÖõáÓùçÚýêÜþëÝþðãûèÛúèÚüëÝúèÚòßÑíÛÍ÷æØûêÛóâÔóâÓùçÙõäÖ÷å×úéÚýîàüëÝöæ×öä×øæÙúçÚùæÙ÷å×õãÕùçÙùçÙõáÔøæØüêÜøæØïÛÍéÖÈòàÒøå×òßÒôãÖüéÜÿíßùçÚôáÓõãÕôàÒõâÔòßÑïÜÎðÝÏñÞÐðÜÎ÷äÖüêÝÿíàýêÜúçÚ÷åØûèÛþíßÿðã÷ä×ðÞÐöãÖõâÔ÷äÖöãÖñÞÐïÜÎñÝÏìÙËéÖÈéÕÇìØÊïÜÏîÛÎê×ÉðÜÎõâÕöãÕóàÒðÜÎóßÑöãÖ÷ä×ôáÔòÞÐóßÑòàÓóáÔôàÓóßÑòßÑñÞÐêØÊëØÊïÜÎïÜÎïÜÎõãÖüêÜûéÛûéÛûéÛûèÛùçÚòßÑíÚÌìÙËóàÒöãÖóßÑîÛÍîÜÎîÛÍñÞÐøåØýìÞõâÔùæÙýëÝþëÝüéÜùæÙùçÚöäÖóàÓðÝÏðÝÏðÝÏ÷ãÕöãÖöãÖõâÔóàÒòßÑöãÖùæØùéÛúéÜûèÚúçÚùæÙüêÜýëÝöãÕòßÑöãÖúçÙ÷ãÖôàÒõáÓøä×ûèÛüëÝýíàûíßûêÜûéÜûëÞÿñãüìÝùèÙúéÛûêÜûéÛýïàþïàýíÞúèÚøæØ÷æØÿóæþíßýëÝþíàþîàþíà÷åØùæÙüêÝüïâüíàúæÙöãÕöãÖôâÕùæÙùæØïÛÍðÝÏôáÔöãÖõáÓôàÒôáÓóàÒöâÔöâÔóàÒóàÒöâÕ÷ä×ùçÙóàÒòÞÐùåØûèÛòßÑðÝÏõâÕÿîáþîàøåØéÕÇïÜÎôàÒöãÖôáÓðÞÐóàÓôáÓñÞÐìÚÌéÕÇåÒÄîÛÍóàÒôàÒïÛÍðÝÏôáÓóáÓûêÜýíßùæØõãÕ÷ä×øæÙûêÜúçÙóàÒóàÒ÷ä×øæØõâÔöãÖùæÙöãÕíÙÌìÚÌòßÑòàÒîÛÍðÝÏõáÓòßÑòßÒòßÑöâÔøæØûèÚëØÊìÚÌòàÒüêÝÿîáýíàûéÛýëÞýëÞúèÚùæØùæÙþîàýëÝúèÚ÷äÖöãÕöãÕùçÚöä×ôáÔ÷äÖûéÛÿíàôáÔëØÊæÓÅíÚÌøå×þëÝ÷äÖûéÛûéÛøåØ÷äÖôáÓòßÑ÷ä×üéÛûéÛ÷äÖñÝÐñÞÐðÝÐîÛÍòßÑûêÝÿõçýðáÿïáÿðáÿðáýìÝøçÙòàÒôâÔôâÔóâÔöäÖùçÙøæØúçÙøå×óàÓôáÓ÷äÖüéÜûèÛõâÕðÝÏñÞÐöãÕûèÚúçÙôáÓõâÔýêÜþíßúæØ÷åØõáÓòßÑñÞÐñÞÑðÝÏôáÔöäÖôâÔòßÑòßÑðÝÏñÞÐóßÑõãÕøæØúèÚöãÖóàÓôáÓ÷å×óáÓíÚÍîÛÍñßÑöãÕùçÚúèÚúèÚôáÓöãÕùæØùæÙøåØöãÕöãÖùæÙùçÙ÷äÖõâÕöäÖõãÕòÞÑïÛÍðÝÏôàÒöãÕôâÔïÝÏëÙËìØÊðÝÏôàÓðÝÏòßÑòßÒñßÑôáÔùæÙòßÑïÜÎê×ÉèÕÇíÚÌóàÓûéÛ÷ä×ôáÓóßÑòßÑðÝÏóáÔôâÕöä×øåØôáÓîÜÎöâÔ÷ãÕôáÓòßÑöãÖýëÞÿïâÿíàþëÝüéÜúçÚùæÙôáÓóàÒñÞÐòßÑôáÓõâÔñÞÐíÚÌê×ÉíÚÌóàÒöâÔóàÒôâÔöäÖüêÜþíàüéÛòßÑøæØýêÝúèÚñÞÐéÕÇåÒÄíÚÌõâÔúèÚûéÛùèÛöå×ùçÙüëÜþíÞüëÜúèÚòáÓïÞÏðßÑ÷å×÷æØõäÖèÕÇíÛÍðÝÏïÜÎòßÑöãÖ÷äÖúçÚùæÙöãÖøåØûéÛþìÞÿïáüëÝôàÒöãÖûêÜþìÞúèÛ÷å×öãÖóàÓïÜÎïÝÏðÝÏïÜÎñÞÐõâÔùçÙ÷å×òßÑõâÕ÷åØõâÕöãÖþðâüêÜöäÖòßÑñÞÐñÝÏõâÕøåØûèÛýëÝüêÜûéÛôâÕöäÖùæÙûèÛüêÜüêÜþëÝýëÝýëÝýëÝûèÛöãÕëØÊèÔÆèÕÇïÜÎóàÒôàÒïÜÎñßÑôâÕõâÕïÝÏéÖÈìÚÌðÝÏïÜÎëØÊðÜÎøåØ÷ä×õâÕóßÑïÜÎìÙËê×ÉôáÓòßÑòßÑõãÖôáÓïÜÎùæÙúçÚ÷ä×ðÝÏíÚÌïÛÍñÞÐîÛÍìÙËíÚÌôáÓúéÛòàÓóáÓóàÒòßÑòÞÐñÞÐóàÒùæÙýëÝýëÝöãÕîÛÍíÛÍóàÒóàÒìÙËìÙËòßÑñÞÐêØÊíÚÌøå×úçÙùçÙþëÝûéÛùçÙøåØúèÛûêÝúéÜüêÝýêÜûéÛöãÖñÞÐúéÚùçÙøæØùçÙüìÝþñãþîßüëÝüìÝýìÝøçÙñßÑöâÔöãÕúçÚÿðâÿðâþíßøåØöãÖøåØúçÚöãÕðÝÏøå×ýëÞýêÝòßÑïÜÎõãÕ÷äÖùçÙýëÞþðãþîáûéÛ÷äÖôáÓòßÑóàÒöãÕøå×÷ä×ñÞÐóßÑöäÖõãÖøåØíÚÌîÚÌíÙËîÛÍñÞÐôáÓýêÜ÷ä×ïÝÏìÙËîÜÎñÞÐûèÛ÷ä×óàÒðÝÏóßÑôâÔ÷äÖôáÓòàÓóáÔñÞÑìÙËïÜÎóàÒóàÒðÝÏîÜÎïÜÎôáÔúçÙùåØðÝÏïÜÎóáÓöä×öãÖ÷ä×ùæÙúçÚúèÚóßÑñÞÐïÜÎíÚÌìÚÌëØÊíÚÌñÞÐøå×þëÝýëÝúèÚýëÞøåØóßÑñÞÐñÞÐòÞÐêÖÈèÕÇéÖÈëØÊêØÊèÕÇé×ÉëÙËíÚÌïÜÎïÜÎïÜÎóßÑöãÕúçÙúèÚ÷å×ôâÔõâÕùæÙúèÚ÷å×ùå×üèÛôáÓíÚÌîÛÍôâÔóàÒðÝÏòßÒîÛÎìØÊðÞÐøæÙýîàþïáþíàþëÞúèÚóàÓëØÊöå×õäÖóâÔðÞÐóáÒöåÖýíÞþïàýíßùèÙ÷å×öäÖþëÝýëÝýëÝüëÝøæØòßÒòßÑðÝÏòàÒ÷å×÷åØõãÕþìÞûéÛ÷äÖìÙËèÔÆíÚÌóßÑòßÑòßÒòßÒòàÒóßÑüêÝûéÜûêÜúèÛ÷äÖòßÑûèÛùæÙ÷äÖõâÔõâÔõâÕìØÊê×Éê×ÉðÝÏ÷ä×üëÝûèÚóàÒê×ÉçÔÆê×ÉîÛÍôâÔñÞÐîÛÍë×ÉìÙËíÛÍðÝÏìÚÌê×Éê×Éê×ÉèÕÇãÐÂê×ÉïÜÎïÜÎëÙËèÕÇäÐÂìÙËñÞÐôáÔøæØþîàôáÓóßÑôáÓ÷äÖ÷äÖóàÓòßÑõâÔöäÖõâÕöãÕ÷å×ôáÔøå×úèÚúæØúçÙûéÛøåØìØÊçÔÆóàÒöãÖðÞÐëØÊîÚÌöäÖúèÛóàÒæÒÄîÜÎñÞÐôáÔ÷ä×ùæØùæØûèÚöâÔðÝÏðÝÏöãÖûèÛýëÞøä×÷ä×ýëÝþëÝúçÚöä×÷äÖøåØüêÝúèÛñÞÐëØÊêØÊêØÊíÛÍòßÑõâÔ÷å×õâÔôáÓõâÔñÞÐìÙËîÝÎóâÔöäÖóâÔòàÒóâÔõãÕõäÕóâÔôâÔ÷æØûêÛüéÜÿíßþíßõãÖîÛÍêØÊòßÑùçÚýïáþñãþðâþóåùçÙõâÔõáÓðÝÏê×ÉêØÊñÞÐíÛÍçÔÆéÕÇôâÔûïáþìÞüêÜûéÜþìÞýëÝûéÛúèÚÿðâþîàýíàýðâýìß÷åØôáÓñÞÐóàÒõâÔôâÔóßÑöâÕùæÙ÷å×ôáÓñÞÐêØÊìÚÌïÜÎðÜÎñÝÏðÝÏôáÓñÝÏíÚÌëØÊíÚÌïÜÎïÛÍê×ÉëØÊñÞÐðÝÏê×ÉéÖÈëØÊïÜÎõáÔøæÙøæÙøåØøåØõáÓðÝÏíÛÍìÙËðÝÏùåØýëÝøåØóàÒòßÒõãÕöãÕñÞÐêÖÈìÙËôáÓðÝÏóàÒñÞÐìÚÌîÛÍõâÕ÷ä×ûèÚüêÝùæØõâÕóàÒôáÔñÞÐòßÑúçÚýêÝûéÜùçÙôáÔòÞÐôáÓöãÕôáÓùæÙúçÚõâÕôáÓùæÙûèÛþìÞÿðâþíß÷åØõâÔ÷äÖúèÚýíÞÿïàÿïàüëÝøçØóâÔîÜÎìÚÌòàÒúéÚþïáþîàûéÛøæØøæØøçÙöå×îÝÎëÙËëÙËòàÒøçÙûëÝøæØñÞÐñÞÐúçÚýëÝûéÜóàÒöä×öä×ùçÚüéÜõâÔîÝÎóáÒòáÓ÷å×úèÚôãÕòàÒøçÙþíßýîßøçØòáÓöâÕúèÛúçÙóßÑ÷äÖþîáüêÜûéÛûîáøéÛðÞÐìÙËðÜÎôáÓõãÖôáÓõáÓöãÖñßÑôáÓ÷åØûèÛöãÖïÜÎìØÊôáÓ÷ä×óßÑðÝÏñÞÐîÛÍíÚÌëÙËîÛÍöãÖýìß÷å×óàÒðÝÏòàÒôáÔôàÓôáÓðÝÏôáÔöãÕñÞÐñÝÏùêÜúéÛöãÕïÜÎðÝÏôâÕóáÓõáÓøåØúèÛõãÕíÚÌõâÕóáÓñÞÐðÝÐðÝÏðÞÐòßÑöãÖøåØôàÒðÜÎíÚÍîÛÍóßÑóßÑîÛÍðÜÎõâÕòßÑñßÑôáÓøåØõâÕîÛÍìÙËîÛÍóßÑùæÙúçÙ÷äÖöä×øæÙùçÙóàÓñÞÐõâÔýìÞþíßüëÝùæØúèÚþîàúèÚûêÛýìÝüëÜ÷å×ïÞÐúéÚýîßýíÞøçØùçÙýîßüìÞøçÙôãÕôãÕõäÖóâÔóâÓ÷çØúëÜúêÛöå×òáÓôàÒöãÕôâÔöãÖüêÜþìßúçÚûèÚúçÚùçÚ÷åØõãÖøæØøæØôãÕöå×ùçÙöäÖýíÞüëÝúéÚ÷æØõäÖôãÕ÷ãÖöãÖõáÔõâÕöäÖöä×ôáÓïÜÎê×Éê×ÉðÝÏôâÔùæØúèÚùçÙ÷ä×øåØûèÛ÷å×õâÔôáÔ÷ãÖøåØ÷ä×óàÓðÝÏñÞÐ÷ãÖùçÙøæØê×ÉñÞÐöãÕõâÕöãÕøå×ûéÛüêÜøæØðÝÏîÛÍñÞÐøåØõâÕóàÒñÝÏìÚÌèÕÇçÓÅê×ÉðÜÎ÷å×øæØöãÖûéÛøå×ôáÓñÞÑôáÔ÷åØëÙËñÞÑ÷åØùæÙõâÔðÝÏéÖÈëØÊîÜÎïÜÎëØÊåÑÃêØÊê×ÉéÕÇëÙËðÝÏõãÖúèÚüêÜüéÛöä×ôáÔöãÖôáÓóáÔõáÓ÷å×øæØ÷åØôáÓ÷ä×üêÜûèÛóàÓïÜÎøå×õâÔðÝÏîÜÎöäÖþíßþõæþîßüëÜýíÞþîàüìÞÿîßüëÝûêÜüêÜøæØñàÒóâÔñàÑòàÒöå×øæØøæØûêÛþíßþîàûéÛúèÚúéÚøå×üêÜûéÛ÷ä×ùæÙøæØÿñäÿíàÿîàûéÜ÷ä×ûéÛøæØõäÖòáÓóâÔøæØúéÚñßÐïÝÏîÜÎñßÑöå×úéÛ÷ä×ôàÒõâÕúèÚóàÓçÔÆïÜÎðÞÐîÚÌôàÓýîáÿòäÿòäÿïáýêÝøæÙöäÖ÷ãÕ÷ä×óàÒðÝÏòßÑøä×üêÜõãÖòßÑóàÒùæÙùæÙöâÔöãÖöãÕöâÔöâÕóàÒðÝÏðÝÏîÜÎðÝÏôáÓõâÔóàÒüéÜúèÚóàÒñÞÐóàÒîÚÌòßÒõâÕùçÙýëÝûèÛ÷ä×òßÑîÜÎëÙËíÚÌóàÓùçÙöãÖôáÓóàÓõâÔ÷å×úçÙéÕÇèÔÆìÙËôáÓùæÙøåØðÝÏéÖÈêØÊóáÔ÷ä×óßÑóßÑõãÖõâÔðÝÏïÜÎòàÓóßÑõâÔöä×öâÔôàÒóßÑòßÑóßÑñÞÐõâÕøåØõâÔõáÓ÷äÖøçÚúèÚüêÝüîàüðâýìÞûéÛýìÞþîàþïáùçÙ÷å×öå×öå×ôãÕñßÐòáÓóâÔõäÖúèÚúèÚ÷æØûéÛúèÚ÷å×ôãÕøçØþîßúçÙùæÙýêÜÿîàüêÜùæÙùæÙøåØúçÚ÷ä×ôáÓúæÙÿðâüêÜøçØôãÕõäÖøçÙôãÕöå×øçÙøèÚúèÚúèÚóàÒîÛÍïÜÎùæÙùæØòÞÑíÙËóßÑóßÑöãÖúèÚöäÖöãÖöãÕôâÕóßÑïÜÎìÙËðÝÏðÝÏðÝÏñÞÐóáÓöãÖ÷ä×ùæÙöä×ïÜÎîÛÍñÞÑôáÓíÙËìØÊôáÔõâÕîÛÍçÔÆèÕÇìÙËóßÒ÷ä×öä×óáÔòàÒíÛÍòßÒúèÛúçÚ÷å×ôáÓñÝÏóßÑõâÔöãÖöâÕôáÓøåØþíàþìßøæØõâÕñÞÐíÛÍê×ÉëÙËíÙËõâÔôáÓóáÓõáÓôáÓñßÑôáÓïÜÎïÜÎôáÔõãÕñÞÐïÜÎñÞÐòßÑòßÑñÞÐïÜÎòàÒøæÙüéÜöãÖîÚÌèÕÇòßÑñÞÐíÛÍðÝÏøå×üêÜùæÙüéÜýìÞúèÛóáÔîÚÍìÛÍôãÕüëÝþîßýíßýîßùçÙõäÖöå×ûêÛúèÚôãÕòáÓñàÒóâÔúéÚüëÜûêÛýìÝýìÝüëÜüëÝûêÛûêÛþìÞüéÜûèÛùæÙöãÕôáÔ÷ä×ùæÙûèÛüéÜüêÝüêÜúêÜúèÚûêÛùçÙøæØýìÞýìÝþíÞþîßþîßþîàþîßûèÛ÷äÖñÞÐñÞÐöãÖúèÚùçÙùçÚøæØöãÖóàÓñÞÐðÜÎïÜÎðÝÏòÞÐñÝÏîÛÍìÚÌñÞÐõâÔóàÓñÞÐðÝÏöãÕùæÙõáÓëØÊìÙËõãÖüéÛùæØøå×÷ä×òßÑêØÊíÚÌñÞÐñÞÐîÛÍñÞÐ÷ä×îÛÍíÚÌîÛÍóßÑöãÕõâÕøå×ñÞÐìÚÌîÛÍðÝÏòßÑ÷ä×øæÙûèÚúèÛ÷ä×òßÑöãÕøæØùçÚöãÕñÞÑìÙËôáÓøæØüéÜúèÚóàÓíÚÌóàÓôàÓñÞÐìÙËìÙËðÝÏóàÒñÞÐíÛÍìÚÌïÝÏôâÔõâÔûéÛþëÝúèÚöãÖõãÕõâÕôáÓùæØüîáýìÞûèÛøå×õâÔóàÒòßÑóàÒóàÓæÕÆîÜÍñßÐëÚËèÖÇé×ÈñßÑùéÛýíß÷æØõäÖúéÚùèÚõãÕñàÒôâÔöå×÷æØóâÔóáÒôãÔ÷çÙøçØõäÖûéÛýêÜõâÔìÙËñÝÏøå×õâÕúçÚùæÙýëÝÿíàùçÚóâÔôãÕøæØôãÕðÞÏóãÔüëÜøçÙóâÓñßÐóâÔöæØ÷ãÖûéÛùæÙóßÑöãÕþîàþìÞýëÝÿðâýîáùæÙøåØüîàûéÛøæØøæØøæØöãÖíÚÌôáÔùæÙöãÖñÞÐîÛÍïÜÎôâÕöãÖóáÓôáÓ÷ä×öãÕûéÛ÷äÖêÖÉæÓÅêØÊê×ÉèÔÆèÔÆîÛÍóàÒõáÓòßÑñÞÐöãÖ÷å×ðÝÏíÚÌéÕÇëØÊëÙËêØÊìÚÌòÞÐñÞÐ÷äÖôáÔìØÊíÚÌöãÕýëÝùçÚöãÕõãÕùæÙüêÜùçÚúçÚùæÙúèÚûéÛüêÜôâÕñÞÐòßÒ÷äÖôáÓíÚÌïÜÎðÝÏïÜÎïÜÎòàÒ÷å×÷äÖðÝÏîÛÍöäÖûéÛûéÛûèÚùæÙ÷ä×öãÖôáÔóàÒóàÓóàÒôáÓ÷ãÕõâÕñÝÏôãÕðßÐéØÊæÔÅëÙÊóâÓýðâøçÙøçÙùçÙöå×÷æØýðâþðâùèÚñßÐóáÓúéÛöå×øæØôâÔòáÓöå×òáÓîÛÍìÙËîÛÍúèÚÿíßýëÝôàÓòßÑóàÒ÷ä×òßÑêÖÈðßÑúéÛÿðáíÛÌçÕÇäÒÃîÜÍòáÒöåÖôãÕîÝÏèÖÈðÝÏóàÒúêÝüîàõâÔïÜÎöãÖþîàþìÞøæØõãÕðÝÐòÞÐùçÙýíßûéÛúçÙüèÚ÷å×õâÔñÞÑîÜÎìÚÌëÙËêØÊèÔÆîÚÌîÜÎçÔÆäÑÃà̽âÐÂãÐÂãÐÂëØÊõâÕõâÕòÞÐïÜÎòßÑöâÕöãÖùæØùæÙôàÒìÚÌîÜÎöãÖöãÖñÝÏîÛÍðÝÏòßÒñÞÑìÚÌçÕÇâοäÑÃîÚÌ÷äÖîÜÎëØÊìÚÌõâÔøåØõâÔúçÙ÷äÖóàÓðÜÏðÜÏñÞÑñÞÐìÚÌé×ÉìÚÌñÞÐõáÓóàÓòßÑóßÑ÷ä×øå×öãÕóàÒòÞÐîÜÎíÛÍóàÒüéÛ÷äÖûéÜûèÛôáÓôàÒ÷ä×öãÕøä×ùæÙøå×ñÝÏéÖÈòáÒôãÕôãÕôãÕ÷å×úèÚùçÙûéÛýìÝûéÛøçÙöå×öäÖùèÙûêÛùèÚúéÚûéÛüîàýîàùèÚöäÖöå×òáÓïÜÎðÞÐ÷å×ûèÛùå×ûèÚøåØöãÖôàÒñÞÐòßÑõâÔøçÙùçÙýëÝöäÖóáÒêÙÊè×ÈêØÉìÚËðÞÐôãÕ÷æØïÜÎîÛÍòÞÐòßÒðÝÏñÞÐøä×ùæØùæÙöãÖòÞÐîÛÍåÒÄëØÊïÝÏðÝÏñÞÐòßÑúçÚùæÙ÷ä×öä×öäÖ÷å×õâÔòßÑòÞÐîÛÍëØÊìÙËïÜÎñÞÑóàÒôáÓ÷äÖúçÚñÞÐïÜÎïÜÎòßÑòßÑðÝÏïÜÎñÞÐòÞÐñÞÐñÞÐóàÓôàÒöâÔ÷äÖøä×÷åØöãÖíÛÍðÝÏòÞÐïÜÎëØÊåÓÅçÓÅñÞÐ÷ãÖòàÒðÝÏòßÑòßÑîÛÍëØÊê×ÉíÚÌðÝÏóáÓõâÕõâÕöãÕùæØýêÜùçÚóáÓòÞÐõâÔóàÒìÙËòßÑ÷ä×øä×óàÒòßÑõâÔ÷åØúèÚúçÚôàÒóàÒöä×÷ãÖõâÔôàÒöâÔøå×ùçÙôãÕöäÖ÷æØ÷æØ÷å×÷å×ôãÕúèÚ÷å×óáÓøçÙúéÚøæØúéÚþíßÿñãÿñâþíÞýíßüëÝøæØõäÖöå×õäÖúæØñÞÐôáÓòàÒíÛÍóàÒúçÚúçÚøåØõâÕ÷äÖùæÙúèÚõäÖ÷æØúéÚúèÚòáÓîÝÏîÝÏïÞÐðßÑòáÓóâÔõâÕ÷å×ùæØöä×õâÕøå×ùæØôáÓõáÓòßÒòßÑúçÙöäÖðÝÏëÙËîÛÍõâÔúçÙùæÙõâÔïÝÏîÜÎóàÒ÷åØöâÔöãÕõâÕóßÑôáÓùæØøåØøæÙùæÙùæÙúçÚúçÙòßÑðÝÏîÛÍíÛÍéÖÈåÒÄíÛÍîÛÍñÞÐóßÑñÞÐîÛÍòßÑ÷å×ùæÙ÷ä×õáÓóàÓõâÕñÝÏíÚÌë×ÉêØÊéÖÈðÝÏøåØ÷ãÖìÙËê×ÉñÞÐðÝÏðÝÏðÝÏòßÑöäÖùæÙ÷ä×úçÚúèÚøæØùæØüéÛýêÜøä×ôàÒùåØúçÙøåØðÝÏðÝÏôáÓûéÛûéÛöãÕìØÊêÖÈíÚÌöãÕùçÙøåØýëÞþìßýìßýêÜûéÛûèÛúèÚöå×óâÔôãÕöå×ùçÙ÷æØøæØõäÖùéÛþïàûëÜüëÜüëÜþîßþîàúèÚòàÒçÕÇíÛÍõãÕûêÛûêÛûéÛ÷äÖîÜÎòàÒõáÓòßÑúèÚúèÚóáÓñÞÐøå×øåØôàÓòáÒóâÔôãÕ÷å×øæØúèÚúèÚùçÙ÷æØøæØûéÛýìÝýëÝþìßûéÛ÷äÖøåØúèÚûîà÷å×ôáÓôáÓõáÓüéÛþîáùåØóàÓöãÕúèÛúëÝõãÕòßÒìÚÌèÔÆæÒÄåÑÃìÚÌòßÑõãÕ÷ä×ûèÚûëÝøåØôáÔðÝÏìØÊëØÊëÙËòßÑîÛÍëØÊêØÊéÖÈçÓÅèÔÆçÔÆëØÊòßÑõáÓóßÑôàÒõâÔóàÒíÛÍìÙËìÙËøäÖðÝÏë×ÉïÝÏ÷äÖúçÚöãÖõâÕóßÑñÞÐòßÑóàÒêØÊîÛÍñÞÑôáÔõâÕôàÓõâÕóàÒïÝÏîÛÍòÞÐ÷ä×ûéÛúçÚöãÕñÝÏñÞÐóáÓñÞÐëØÊíÚÌúçÙýëÝúçÚøæØôáÔôáÔùçÙùæØôáÔõãÕõâÔóàÒòàÒöãÖúèÚüìÝùéÚ÷æØøçÙùçÙøæØùçÙ÷å×úèÚÿòãÿñâúéÛûéÛøæØõäÖóáÓîÝÎè×ÈïÞÐïÞÏôãÕ÷æØøæØúéÚûéÜùçÙûéÛúèÚ÷ä×øæÙúçÙòßÑðÝÏöãÕøåØôâÔñàÑõäÖôãÕúéÛûêÛþîàþîßúéÛôãÕòáÓóáÓôãÔùæÙøåØòßÑñÞÐöäÖöäÖæÓÅé×ÉòßÒþìÞÿîàüéÜ÷å×÷ãÖöä×óàÓëØÊãÐÂèÕÇìÙËñÞÐóàÓñßÑïÜÏöãÕøåØôâÔðÝÏíÚÌçÓÅçÔÆé×Éé×ÉéÖÈìÙËïÜÎëÙËêØÊëÙËïÜÎðÝÏïÜÎöãÕôáÔôáÓöãÕ÷ãÖõâÔöãÖõáÓóßÑòßÒóàÓóàÓôàÒòßÑõáÔüéÜüêÜ÷äÖîÜÎîÛÍóßÑúçÚ÷ä×ðÝÏéÖÈñÞÑùçÚþìßýëÞúèÚõâÔòßÑïÜÎðÝÏóàÓ÷ä×õâÕüéÛûéÜòßÑòßÒøå×øåØöãÖ÷ä×üéÜúèÚôáÓøæÙ÷äÖôáÓïÜÏìÚÌëØÊìÙËóàÒ÷ä×øå×÷ä×ùæÙýìÝüëÜýìÝûêÛóâÔëÙËôãÕôãÕøæØõåÖõäÕüíßýñâõäÕéØÉæÔÅìÚÌóâÓôãÕñàÒöäÖúéÚüìÝÿóäþìß÷ä×óàÒøæØüêÜùçÚ÷åØûêÜüîàýíßüêÜùçÙ÷å×÷æØ÷æØÿôåÿòäÿòäÿñâÿðáýïàúéÛóâÔîÝÎóàÓ÷å×÷äÖûéÛýëÞ÷ãÕìÙËñÞÐðÜÎðÞÐïÜÎçÔÆæÓÅëØÊñßÑñÞÐëØÊäÑÃë×ÉìÙËïÜÎóáÓøåØúèÚòßÑòßÑìÚÌëÙËêØÊãÐÁçÔÆîÛÍïÜÎìÙËëÙËîÛÍé×ÉëÙËïÜÎôáÓôáÓñÞÐîÜÎðÝÐñÞÐòßÑñÞÐïÝÏöä×öãÖøåØýíàþñãþðãøä×òßÑðÝÐôáÓôáÓîÛÍíÚÌíÛÍòÞÐöãÕòÞÐéÖÈüéÛ÷ãÖðÝÏíÚÌïÜÎòÞÐñÞÐóàÒõâÔöâÔôàÒóàÒõáÓöâÕöä×ùæÙüêÜýëÞÿíßýïáûéÛîÛÍéÖÈê×ÉìÙËîÛÍíÚÍêÖÈîÛÍöâÔþìÞÿîáÿíàÿòäýîàòßÑðÜÎòßÒòßÒïÝÏñÞÐõâÕùæÙùæÙóáÓêÖÈë×ÉòÞÐôãÕõäÖðßÑôâÓúèÚùçÙ÷å×øæØøæØ÷å×öäÖõäÕøçØùèÙøæØöå×ùèÚýïá÷åÖõãÕöåÖûêÛüëÜûéÛûèÛýêÝüéÜøåØ÷ä×øæØüîàýðâýíàþñäÿôæþíßøäÖüêÝýîàúçÙóàÓðÝÏþëÝþìÞöäÖëØÊìØÊïÜÎ÷ãÕüéÛþìÞüéÜùæÙøåØùçÚýíàüìÞöãÕöâÔúçÙøå×ôáÔöâÔóßÑïÜÎôàÒöãÕóàÒðÝÏðÝÏðÝÐîÜÎîÛÍòàÒõâÕëØÊæÓÅíÚÍë×ÉçÔÆãÐÂâÏÁçÓÅêØÊîÜÎõâÕóßÒñÞÐòàÓðÜÎóàÒõãÖõãÕñÞÐïÜÎïÜÎôáÓîÛÍîÛÍùåØýëÝüêÜ÷åØ÷äÖõâÔòßÑðÝÏîÛÍôàÒùåØýêÝüêÜ÷ãÖòßÑõáÓ÷åØ÷åØôáÔòßÒñÞÑôâÔðÝÏêÖÈåÒÄèÕÇîÛÍõãÕ÷å×úçÙûèÛûéÛúèÚûéÛúèÚüêÝýíßøçÙñÞÑèÕÇôáÔûèÛøæØõâÔöâÕõâÔóàÓóáÓ÷ãÖõãÕñÞÐñàÒ÷æØúéÛþðáÿòãûêÜöå×öå×ôãÕðßÑíÛÌëÙÊíÛÌóáÓùèÙúéÚöå×òàÒñàÑïÞÏñßÑõäÖøçÙøæØ÷ãÖøåØõáÔîÛÍíÚÌðÝÏôáÔõâÔöä×øä×ùæØúèÚùæØõâÕñßÑîÛÍîÛÍðÝÏúçÚýëÝþíßúçÚöãÕùæÙþíßþëÝýìÞþëÝûèÛ÷åØñßÒîÜÏíÙÌîÜÎëÙËæÒÄïÜÎíÛÍïÜÎíÛÍíÚÌòßÑøå×õâÔòßÑõâÔõãÕóàÒíÚÌïÜÎëØÊê×ÉòßÑôáÔùæÙöãÖðÝÏìÙËëØÊéÖÈèÕÇéÖÈêÖÈêØÊèÕÇæÒÄïÜÎöãÖøåØðÝÏïÜÎõáÔ÷ä×øä×öãÕôàÓõâÕ÷å×ôáÓöãÕ÷ä×÷åØ÷ä×öãÖûèÚúèÚùæÙ÷ä×öâÕôâÕ÷ä×ùæÙøåØñÞÐïÜÎñÞÐíÚÌìÙËîÛÍòàÓöãÖ÷ä×þëÝþëÝúèÚöãÕöäÖøåØöãÖìÙËë×ÉíÛÍíÚÍðÝÏôáÓñÞÐîÜÎîÛÍòÞÐöãÖóßÑîÛÍîÛÍöãÕõãÖðÝÏðÞÐúéÚýíÞúêÜøèÚ÷æØ÷å×÷å×öäÖôãÕñàÒïÞÐòáÓñßÑòàÑôãÔóâÔñàÑøæØ÷å×øæØúéÚûêÛûêÛüéÜûéÛôáÓëÙËîÛÍöâÕöãÖóßÑõáÓñÞÐîÜÎôáÔôâÕïÜÎìÙËñÞÐ÷äÖûèÚøåØøæØûèÛùæÙöãÖøåØûéÛôáÓñßÑøæÙüêÜûéÛùæØòßÑñÝÏõâÕðÝÐåÒÄïÜÎëØÊëÙËñÝÏòÞÐñÞÐðÝÏôáÔøåØ÷å×ôáÓòßÑöãÖóàÒìÙËñÞÑùæÙõâÔôáÓöâÔõáÓñÞÐìÙËèÔÆæÒÄáÎÀåÒÄðÝÏòßÒõâÕùçÙúèÚ÷ãÖðÝÏñÞÐøä×óàÒ÷äÖöãÕîÛÍéÖÈçÓÅðÝÏîÚÌíÚÌóàÒûéÛÿðâÿïáüéÜøæØõâÔ÷ãÖùæÙöãÖûèÛÿíßÿíßüêÜúèÚúçÙ÷ä×÷åØýìÞÿðâÿïáúçÚúçÚùæÙøåØùæÙùæØîÛÍèÔÆë×ÉòßÑöä×ýíßÿóåúæØôàÒúéÜÿïáÿïáüêÜûéÛøæÙòßÑïÜÎíÛÍòáÓòáÒðßÑìÚËìÚÌñàÒõãÕ÷å×úèÚüìÝþíÞþíÞþíß÷å×ïÞÏðßÑöå×úèÚðÞÏõäÖûéÛýîßýîàýîàøåØùæÙõâÕëØÊåÑÃæÒÄçÓÅçÓÅíÙËðÜÎòàÒûéÛÿíàþìÞýíßþíßüêÜùæÙûèÚ÷ä×ñÞÑõáÓûéÛýëÝóàÒêÖÈäÐÂê×ÉôáÓùçÙüéÛúèÚùçÙùçÙ÷äÖóàÒóàÒðÝÏîÛÍñÞÐóàÒðÝÏêÖÈñÞÑòÞÐëØÊìÚÌôâÕöãÖðÝÏõâÕýêÝùæØõãÕôáÓòßÑðÝÏðÝÏòßÑõáÓñÞÑñÞÐõãÖôáÓóàÒùçÙûêÜòÞÑëØÊïÜÎôáÓôâÕøæØïÜÎèÔÆëÙËñÞÐõãÖîÜÎìÙËë×ÉïÜÎöäÖûéÜúçÚûèÛúçÚøåØöâÕôáÓëÙËðÝÏøå×üëÝùæØòßÑïÛÍôáÓûéÜÿñãþïâüêÝüéÜúçÚúèÚûéÜöãÖîÚÌîÛÍóàÒùæÙþìÞÿîàýîá÷äÖúèÛþìÞÿñäþðâýíßýëÝþëÝûèÛ÷åØúèÚýîáõäÖïÝÎïÝÎòàÑôâÔ÷æØöäÖ÷æØùçÙúèÚúéÛøèÚøçØúéÚúêÜûëÝýìÞýìÝôâÔöå×÷å×öäÖôãÕôãÕøåØùæÙøåØòßÑê×ÉäÑÃîÚÍïÝÐòàÓøä×ûéÛüêÝöãÕúéÜþïáÿðãþíßüéÛöãÖðÝÏìÙËòßÑúçÚûèÛ÷ä×òßÑëØÊèÕÇîÜÎ÷äÖóßÑñÞÐðÝÏñÞÐóßÑòßÑóàÒ÷ãÖóßÑðÝÏóàÒóàÓñÞÐïÛÍê×ÉèÕÇîÚÌöâÕîÛÍê×ÉëØÊë×ÉäÑÃãÐÂê×ÉëØÊíÚÌïÜÎñÞÐòßÑôáÓõâÔðÝÐèÕÇëØÊóàÒíÚÍéÖÈë×ÉõâÕöãÕðÝÏëØÊëØÊìØÊðÝÏóàÒôáÓõâÕõâÕõâÕõâÕôáÓóàÒñÞÐñÞÑñÞÐðÝÏîÛÍìÙËóáÓïÜÎïÜÎ÷ãÖøåØôâÕõâÕ÷ä×øæÙ÷äÖôáÓñÞÐïÝÏíÛÍìÙËìÙËëÙËé×ÉôáÓùæØöãÕóàÒóàÒìØËòßÒüëÞþíßöãÕöãÕýëÞýëÝüêÜûéÛüêÜýëÝûêÝýìÞùèÙûìÝýïàýíßþïàþîßýìÞûéÛõäÖñàÒîÝÎíÜÎùèÚÿóåÿöçÿòãÿïàþïáþîàúéÛõäÖöå×ùèÙøåØòßÑîÜÎòàÒøå×ùæØôàÓöä×ôáÔ÷åØúçÚóàÒæÒÄîÚÌõâÔùçÚýêÜÿìÞüêÝõãÕõãÕûèÛûèÛøåØúçÚýëÝùæÙïÜÎòàÒûèÚðÝÏéÖÈçÔÆïÜÎôàÒòßÑùæØýêÜùæØ÷ä×üéÛûèÛõâÕíÛÍìÙËôàÒõâÔïÜÏïÜÎðÝÏèÕÇäÐÂéÖÈêÖÈèÔÆëØÊïÜÎõâÕùçÙüêÜöâÕðÝÏæÒÄåÒÄèÕÇãÏÁåÒÄïÜÏúèÛýíàöäÖê×ÉòÞÐùèÚûéÛôáÔïÜÎðÝÏýëÞøæØøåØûéÛ÷ä×ðÝÏìØÊäÑÃà̽æÒÄïÜÏöãÕöãÕíÛÍéÕÇçÓÅìÙËùçÙÿðãýëÞöäÖïÜÎóàÒùæØñÞÑòßÑìÙËìØÊòßÑòßÑîÛÍõâÔ÷ãÖïÜÎìÙËìÚÌöäÖûéÜúèÚøæØöãÕïÜÎëØÊñÞÐõâÕúçÚûèÛöãÖùèÚþðâÿõæÿðâüìÞúéÛõäÖ÷å×÷å×÷æØöå×öå×÷æØúèÚúéÚ÷åÖõãÕöäÖüîßþïáþðáþðáýîßüìÝøå×òÞÐðÝÏõáÔùåØøä×üéÜúçÚûéÛÿîàüêÜõâÔöâÔðÝÏðÝÏîÛÍíÚÌóßÑùæÙüéÜþëÝüéÛõâÔïÜÎõáÔúèÚüéÜöãÕïÜÎëØÊæÒÄìÙËòÞÐõáÓ÷äÖùçÚôâÔðÝÏóàÓôáÓíÚÌé×ÉçÔÆíÚÌóßÑòßÑìØÊäÑÃëÙËîÜÎñÞÐóßÑòßÑðÝÏôâÔïÜÎîÛÍòßÑñßÑìÙËæÒÄçÓÅçÓÅéÕÇîÜÎöâÕöãÕùæÙùçÙìÙËãÑÃèÖÈîÛÍôáÓøåØ÷ä×÷ä×øåØøä×úçÚøä×ðÝÏìØÊíÚÌê×ÉìÙËîÚÌíÙËêÖÈçÓÅðÝÏíÚÌïÜÎòàÒôáÓøåØúçÙòßÑðÝÏñÞÐïÜÎîÜÎðÞÐóàÓøæØüìßýìßúçÙùçÙøæØöâÔñÞÐóàÒöäÖñÞÐñÞÐíÚÌîÛÍôáÓôáÔòßÒðÜÏôáÔúçÚ÷ä×ôàÒñàÒøçÙûìÞùéÛôãÕñàÑòáÓôãÕøæØüìÝüîßüîàÿòäýíÞøæØóâÔòàÒòàÒñàÑõäÖùçÙøçØôâÔðÞÐðÝÏóàÓ÷ä×ùçÚ÷ä×õâÔýêÝþîáÿïáþëÞýêÝýìÞûèÛ÷ä×òàÒïÜÎïÜÎîÜÎöãÕûèÚûèÛôáÔóàÓöäÖðÝÏöãÕúçÚøåØõâÔòàÒóáÓóáÓôàÒõâÔöãÕ÷å×ñÞÐê×ÉêÖÈë×ÉéÖÈëØÊôáÓñÞÐîÛÍíÚÌîÜÎðÝÏîÛÍîÜÎîÜÎïÜÎïÜÎðÝÏòÞÐöãÕôâÔêØÊåÒÄåÑÃìØÊîÚÌðÝÏñßÑòßÑòÞÐøåØøæÙôáÓíÚÌíÚÌóàÓëØÊìÚÌïÜÎñÞÐôàÓõâÔïÜÎðÝÐë×ÉãÐÂäÑÃìÙËöãÖøæØøæØöãÖöãÖøå×úçÙôáÓñÞÐôáÓõãÕ÷ä×òßÑìÚÌðÝÏòßÑëÙËêØÊåÒÄìÙËûéÛÿòåÿîàÿïáûèÛ÷äÖóàÒöäÖúçÚüêÜøåØ÷ä×õâÕ÷ä×úèÚüêÜÿîáþëÞýëÝúçÚöãÖ÷äÖøæ×øæØöå×öå×øæØúéÚúéÚúéÛüëÜÿñâÿõæÿõæþïáûêÛùçÙüëÝýñãýóåóâÔóâÔñàÑïÝÏîÝÎîÜÍòßÑõâÕúèÚþîàþîàýëÝþìÞÿîàýìÞöãÕõâÔøæÙüêÜùæÙïÜÎîÜÎöãÖöãÖöãÖøåØøæÙõãÕ÷ä×ýêÜðÝÏôâÔøæÙûèÛúçÚùæÙþñäûéÜõâÔòÞÐðÝÏíÚÌöãÕðÝÏíÙËîÚÌñÞÐôáÔòßÑïÜÎêØÊéÖÈêØÊíÚÌìÙËîÛÍðÝÏðÝÏíÛÍëÙËéÕÇóàÓõãÕëØÊé×ÉðÜÎúèÚùåØøåØöä×ñÝÏéÖÈíÛÍðÝÏíÛÍðÝÏ÷å×øæÙöãÖóàÒñÞÐòÞÐòßÑðÝÏêØÊê×ÉéÕÇìÙËïÜÎïÜÎùæØ÷ä×õáÓõáÓúéÜýóåþíàûèÚõâÔõâÔ÷ä×öâÔòßÑõãÕúçÚõâÕðÝÏñßÑöâÕüêÝþðãõâÔîÛÍõâÔðÝÏñÞÐõãÖûéÛûèÚöãÖ÷ä×ûèÚÿïâÿðãýëÞúèÛýëÞÿîàþìÞüêÜÿìßþíßõãÕòáÓïÞÐóâÔùçÙüìÞÿøêýïáøçØöäÖ÷å×õãÕðßÑñßÑóáÓøçÙúéÚùçÙüëÝúèÚöå×óáÒóáÒóâÔùæÙûèÛýëÞþíàüêÜúèÚðÝÏëØÊçÔÆê×ÉêØÊçÓÅòßÑóàÓñÞÐøäÖþìÞüéÛóáÓðÝÏðÝÏôàÒòßÑíÚÌöä×÷åØøåØøåØøå×öãÖøæØöâÕõâÔùæÙúçÚúçÚøåØùæÙøåØøåØúçÚúèÛóßÑñÞÐîÛÍìÙËîÛÍïÜÎðÝÏîÛÍìÙËìÙËîÛÍïÜÏñÞÐñÞÐóßÑôàÒõâÕ÷ä×öãÖóàÒñÞÐðÝÏìØÊæÒÄáÎÀåÑÃäÐÂîÜÎùæÙúèÚ÷åØöäÖöãÖøåØ÷äÖóßÑîÜÎðÝÏôáÓùæÙ÷äÖñÞÐîÜÎðÝÏóàÒóáÓñßÑïÝÏöãÕúçÚùçÙùæÙùæÙôáÓöäÖýêÜüêÜ÷åØ÷äÖöâÕøä×úéÛöå×êØÊéÕÇïÛÍñÞÐôáÓùæÙýëÝùçÙôáÔñÞÐòßÒøäÖøå×õâÕõãÖúêÜûêÝúçÙøå×ùæØ÷äÖîÝÏíÜÎíÜÎòàÒóâÔóâÔ÷çÙñàÑíÜÍòáÓôãÕóâÔîÝÎòàÒõãÕ÷æØøæØöå×ÿïáÿïáÿïáþîßþíßüìÝúèÚþíßþíàøå×òßÑñÞÐëØÊäÑÂäÒÄîÛÍñßÑìÚÌñßÑóàÓùå×þíßüéÜõáÓñÞÐïÜÎòßÒúèÚúêÜ÷åØúçÚöäÖóáÓñÞÐïÛÍëØÊîÛÍñÞÐôáÓ÷äÖ÷äÖöãÕñÞÐ÷äÖ÷äÖôáÔõâÕòàÒòßÑîÜÎëÙËêØÊïÜÎóßÑôáÔîÛÍèÕÇéÖÈðÝÏöãÕùçÙôáÓñÞÐôàÓòßÒíÚÌé×ÉëÙËíÛÍïÜÎïÜÎïÜÎçÔÆêÖÈíÙËïÜÎñÞÐñÞÐôáÔôáÓóßÑñÞÐðÝÏïÜÎ÷ä×öãÖôáÔòßÑòßÑóßÑîÛÍòßÒùæØúèÚòßÑçÓÅóàÒûéÛúçÚ÷åØøåØõáÓûèÚþëÝöãÕ÷äÖüéÜòÞÑøåØ÷åØñÞÐñÞÐöãÖõãÕûèÚüéÛüêÜüéÜùæÙ÷ä×ûìßôáÔðÜÎíÛÍïÜÎöãÖöä×ùçÙûéÛöãÕôàÒ÷ä×úêÜõãÕñßÐóâÔ÷å×øæØñàÒîÜÍïÞÏõäÖöå×òáÓ÷å×úéÛûêÛøæØöå×öå×öå×óâÓñßÐóâÔùèÚýîßþïáþìßùçÚõáÓõâÔøåØùçÙöäÖøæØüîàýðãüîàýîá÷ä×øåØúçÚóàÒïÜÎ÷ãÖ÷ä×öä×öãÕöäÖøä×ùæÙóßÑìÚÌé×ÉæÒÄâÎÀâÏÁéÖÈíÛÍëØÊæÓÅãÐÂë×ÉóàÒòßÑîÛÍïÜÎëÙËóßÑòÞÐòßÑóáÓõãÕ÷äÖïÜÎïÜÎîÛÍïÜÎñÞÐôàÒðÝÏíÛÍîÜÎòÞÐðÜÎéÖÈëØÊñßÑöäÖøåØùæÙûéÛúéÛ÷äÖõãÖîÛÍéÕÇìÙËìÚÌîÛÍíÚÌíÚÌñßÑ÷å×îÛÍñÞÐøå×öãÕñÞÐóßÑøåØ÷ä×öâÔôáÓòßÑñÞÐêÖÈïÝÏùçÙûéÛ÷ä×úèÛôâÕðÝÏöãÖöãÖñÞÐ÷ä×üêÜôáÓïÜÏôáÓ÷äÖõâÔóàÒùæØùæØôàÒôáÓúçÙýëÝöãÖðÜÎòßÑöãÖùæÙ÷ä×÷ä×òàÒíÚÌìÙËïÝÏõãÕùèÚüëÜúéÚòáÒëÚËíÛÌøçØùèÚîÜÎëÙËòàÒúçÚøåØ÷ä×÷ãÖóàÒîÜÎê×ÉïÜÎîÛÍôàÒûèÛûèÛõâÔðÝÏîÜÎòßÑøåØûèÛ÷äÖýîàýëÝñÝÏðÞÐùçÚûèÛùæÙñÞÐçÓÅéÖÈñÝÏñÞÐíÚÌíÚÌöãÖúèÚùçÙîÜÎê×ÉêÖÈõáÓ÷å×ðÝÏêÖÈìÙÌïÝÏðÝÏîÛÍìÙËíÚÌíÚÌìÙËéÕÇìÙËñÞÐõâÕ÷ä×øåØõâÔíÚÌåÒÄê×ÉîÛÍòßÑôàÒñÝÏîÚÌçÔÆë×ÉöãÕûèÚõâÕôâÔòàÒôâÔùçÙýíßýíßüéÛûéÛúçÚøåØöä×öãÕöãÕòßÒ÷åØ÷åØïÜÎîÛÍñÞÐñÞÐñÞÑõâÔôáÓñÞÐôáÓúçÚýëÝûèÛöãÕøåØýìÞõâÕôàÓôáÓ÷ä×öãÖòàÒðÞÐîÜÎñÞÑôáÔõâÕùçÙøæÙúçÙúèÚûèÛýëÞþïáûêÝóàÒìÚÌðÝÏøå×üêÜÿíßûéÜøå×÷äÖõâÕóàÒòÞÐõâÔ÷ä×÷åØúçÚýêÜüíßüëÜúèÚ÷æØõäÖôâÔöäÕöäÖ÷æØùèÚùçÙ÷å×òßÒóàÒôàÒõâÔ÷ä×÷åØøå×øå×òßÑñÞÐõáÔôáÓóàÒìÙËëØÊõâÔüêÜþëÝþìÞúçÙóßÑìÙËëØÊìÙËøå×õâÕòßÑóàÓöäÖøå×öãÕóàÓòÞÑòßÑðÝÏíÚÌìÚÌïÝÏôáÓóßÑîÛÍíÛÍùæØüéÛøåØïÜÎìÙËîÛÍìÚÌíÚÌîÛÍîÛÍìÙËê×ÉéÖÈîÚÌïÜÎëÙËê×ÉëØÊëØÊðÝÏóàÒòßÑòÞÐòßÑòàÒñÞÑïÜÎïÜÎðÝÏðÝÏèÕÇê×ÉíÚÌðÝÏñÞÑñÝÐõáÔ÷ãÖùæÙûéÛûéÛûèÛöãÖöä×øåØ÷å×ôáÔðÝÏëÙËîÛÍòÞÐõãÕ÷äÖúçÙøå×÷ãÕùçÙþïâþîàùèÛüéÛüéÛöä×öä×õáÔë×ÉëÙËîÛÍîÛÍõáÓûéÛûèÛéÖÈîÜÎóàÒøäÖúçÚûêÜýëÝõâÔðÝÏõãÕ÷åØôáÓûèÛýëÝþíßþñãþðãüîàüëÝúçÚöâÕöâÔúèÚþìÞÿõçþïàøçØöå×ùèÚýìÝûêÛ÷å×øæØÿîßùèÙíÜÎëÙËñÞÐöâÕõáÓóàÓóàÒüêÜüêÜùåØ÷ä×ùåØøä×üéÛøåØõâÕõáÓöâÔõâÔùæÙôáÓòßÑõâÕöãÖõâÕìÚÌîÛÍñÞÐ÷åØüêÜþëÝþíßýëÞøåØòßÑðÝÏðÝÏøæØ÷ä×öãÕñÝÏðÝÏ÷ãÕýëÝüéÜõâÕëØÊê×ÉìÚÌîÛÍë×ÉéÖÈëØÊçÔÆâÏÁæÒÄèÔÆéÕÇêØÊíÛÍñÞÐïÜÎõâÔ÷ä×óßÑîÛÍìÚÌ÷åØùæÙòßÑîÛÍðÝÏïÜÎèÕÇæÒÄãÐÂâÏÁéÕÇðÝÏñÞÐõâÔùçÙúèÚöãÖñÞÐøæÙ÷ä×÷åØùæÙøåØóàÒòßÒóàÒòÞÐóàÒôáÔòÞÐóàÒñÞÐòßÑøæØøåØóàÓüéÜþíà÷åØñÞÐõáÓõâÔýíßÿîàüéÛüéÜýëÝôâÔóàÒðÝÏñÞÐôáÓðÝÏçÓÅïÜÎõâÕúèÚüêÜüéÜúçÚúèÚüêÜþíßþïâýðãýðãöãÖôáÔôáÓ÷äÖùçÙúèÚóâÔ÷å×ûéÛúèÚöäÖñàÒíÛÌíÛÌðßÐ÷å×úèÚùçÙôáÓõáÓòßÑíÚÌëÙËíÚÌòßÑõâÔúèÚýëÝúçÚøä×ïÛÍöãÕøåØðÝÏíÚÌïÜÎòßÑùæÙþìßÿìßüêÜûéÛöãÖüêÝüêÝõãÖôàÒ÷ä×úèÚ÷å×ðÞÐê×ÉîÛÍöãÕøåØôáÓïÜÎóàÒøæÙ÷ä×ñÞÑìÙËìÙËôáÓùæÙùæÙòßÑë×ÉéÖÈòßÑ÷ä×÷ä×òßÑíÛÍêØÊíÛÍîÜÎíÛÍîÛÍïÝÏîÜÎîÛÍñÞÐôáÓñÞÑôâÔîÛÍêØÊñÝÏóàÒîÛÍïÜÎíÛÍëØÊïÜÎóàÒóàÒðÝÏíÚÌìØÊíÚÌîÜÎóßÑóßÑñÞÐîÛÍñÞÐ÷å×üìÞùçÙñÞÐîÛÍïÜÎë×ÉôáÔóáÓîÛÍéÖÈìÙËôáÓôáÔôáÓñÞÐðÝÏ÷å×þîàÿòäþïáüêÜþíàÿïáûéÜúèÚøä×ùæÙüéÜøåØïÛÍöãÕúçÚúèÚöãÖõâÕöãÕùçÙûéÛûèÛ÷ä×õâÕõâÕôàÒ÷åØüêÝþíßøæØðÞÐè×ÈðÞÐøçØøçÙóâÔíÜÎöäÕôâÔòàÒóâÓøçØüëÝüêÜöãÕðÝÏíÚÌðÝÏòàÒîÛÍñÝÏøä×úçÚõâÔôàÒóàÓúçÙûéÛõâÔòßÒôáÔ÷äÖüêÝýíßúçÚöãÕõâÔþëÝÿñãÿðâúèÚ÷ä×ùçÚñÞÐñÞÐïÜÎëØÊîÛÍñÞÐêÖÈëØÊîÛÍöãÕöãÖîÜÎäÐÂâÏÁåÑÃïÝÏóàÓòßÒôàÒîÛÍìÙËðÝÏðÝÐîÚÌñÞÐóàÓõâÔ÷äÖùæÙûèÛõâÔíÚÌæÒÄèÕÇîÛÍòßÒìÙËëÙËçÔÆäÐÂéÖÈòßÒòßÑõâÕøæÙùæØõâÔòßÑõãÕîÛÍçÔÆèÕÇïÝÏöä×÷ãÖõáÓòÞÐòßÑ÷ä×üêÝúçÚôàÓéÕÇìØÊõâÔ÷äÖùæÙõâÔðÝÏëØÊëØÊìÙËåÒÄäÑÃíÚÌùæØûèÚýìÞþìßöãÕñÞÐõâÔøåØ÷åØúçÚüêÜýëÝùæÙöãÕóàÒ÷åØöäÖöâÔõáÓòßÑðÝÏðÝÐöãÕùæÙøåØ÷äÖ÷ä×ùæÙüéÜÿðâÿòäûéÜòàÒöåÖòàÒïÝÎñßÑùéÚüðâÿòäþòäýðâýîßúèÚöå×õâÔõáÓ÷ãÖúèÚúèÚøæØòßÑòßÑùçÙûéÛøåØùçÙøä×õâÔõâÔùæÙúçÚøåØûèÛøå×õâÔ÷ä×ùçÙûèÚÿòäÿïáýìÞúçÚ÷äÖôáÓöãÖûèÛüíàüëÝøåØòßÑæÒÄê×ÉòàÓ÷ä×óàÒðÝÏìÙËîÛÍíÚÌêØÊæÓÅãÐÂòßÑóàÓõãÖõâÕíÚÌåÑÃçÔÆòàÒõâÔêÖÉéÖÈðÝÏìÙËæÒÄæÒÄìÙËïÝÏîÛÍé×ÉëØÊîÛÍèÕÇäÑÃìÙËøä×õâÕõáÓ÷å×öãÖóàÒõáÓóßÑñÝÏñÞÐóàÒõâÔòßÑë×ÊéÕÇñÝÏõáÓóàÒùæÙíÛÍêØÊôáÔ÷ä×ñÞÐçÓÅçÓÅðÝÏùæÙùæÙúçÚ÷äÖõâÔ÷äÖõâÔíÛÍèÔÆìÙËïÜÎïÜÎçÔÆèÔÆôâÔúèÚúçÚøäÖõáÓøå×üëÞüêÜúçÚùæÙøå×óàÒë×Éé×ÉêØÊñÞÐôâÔðÝÏñÞÐ÷äÖüìÞüïâúêÜûèÚýëÝûêÛóáÓîÜÍóâÔûêÜÿðâúéÛ÷æ×öäÖøçÙùèÙøæ×þëÝÿîàÿóåÿôæÿóåþðâþëÝüéÜúçÚùæØøåØ÷ä×èÕÇäÑÃèÔÆüëÞÿïáýëÝüéÛûèÛòßÑïÜÏùæÙýëÞøåØöâÕøåØûéÛ÷ä×òßÑöãÖóßÑóàÓùçÙýêÜýêÜüêÜþîàùçÙëØÊíÚÌùæØùçÚüëÞôàÓíÚÌïÜÎíÛÍðÝÏðÝÏðÝÏïÜÎïÜÎïÜÎòàÓîÜÎëØÊìØÊëØÊèÔÆëØÊíÚÌìÚÌëÙËîÛÍòßÑôáÓñÞÐîÛÍíÚÌðÝÏôâÔóàÒöãÕôàÒëÙËëØÊïÜÎìÙËéÖÈê×ÉîÛÍê×ÉáÍ¿à̾çÓÅîÛÍóàÒõáÓöãÕíÚÌìÙËîÛÍóàÒðÝÏê×ÉçÔÆèÖÈïÝÏóßÒñÝÏòßÑøæÙüêÜöãÖìÚÌïÛÍóàÓåÑÃéÖÈóàÓøåØõâÔõâÔðÜÎöãÕûèÛýëÝùçÙõâÕõáÓøå×ùæÙ÷ãÖõâÕ÷äÖðÝÏíÙËîÛÍïÜÎðÝÏõâÔþìÞôáÓçÔÅåÒÃïÜÎûéÛûéÛùçÙ÷æ×÷å×ùçÙùéÛïÝÏñßÑóâÔóâÔñßÑïÝÏ÷å×ûéÛþîàþîáûéÜøå×üêÝýìÞùçÚñÞÐñÞÐöäÖùçÙ÷å×øå×ûéÜùèÚöãÕïÝÏöäÖ÷ä×õâÔôáÔñßÑóàÓùæØùæÙöâÕôáÓòßÑ÷ä×ôáÔôâÔ÷å×úçÙúçÚöä×òßÒîÚÌíÚÌïÜÎðÝÏòÞÐîÛÍæÓÅìÙËøåØøæÙñÝÏðÝÏïÜÎïÜÎñÞÐòßÑìÙËê×ÉéÖÈê×Éê×ÉèÔÆçÔÆíÚÌñÞÐòßÑóàÒôáÔøå×ðÝÏëØÊðÝÏòßÑïÛÍïÜÎîÛÍïÜÎñÞÐñÞÐïÜÎòßÒñßÑíÚÌçÔÆãÏÁà̾íÙËóàÒøå×úçÚöãÕñÞÐôáÔöãÕõâÕóßÑóßÑôáÓöäÖòàÒïÜÎê×ÉëØÊõâÕõáÓóáÓíÛÍîÛÍöâÕûçÚñÝÏðÝÏòßÑôáÓóàÒñÞÐé×ÉìÚÌòßÒúèÚûéÜøåØúçÚøåØøåØúçÚûéÛûéÛýïá÷äÖîÛÍíÚÌôáÔýëÝûéÛðÝÏåÑÃæÒÄîÛÍöãÕøæØýíßþðáùèÙïÞÐèÖÈòáÓõäÖõäÖòàÒðÞÏñàÑë×ÉîÜÎóàÒöâÔôáÓòßÑðÞÐñßÑðÝÐíÚÌñßÑùçÙþìÞþëÝüêÜïÜÎë×ÉèÔÆêÖÈòÞÐöâÔñÞÐéÖÈâÏÁçÓÅíÚÌîÜÎóàÒùçÙüèÚõáÔ÷ä×úçÚúçÚöäÖòßÑðÝÐçÔÆãÐÂìÚÌóßÑóàÒíÚÌêØÊé×ÉñÝÐöãÕöãÕôàÒñÞÐïÜÎìÚÌìÚÌíÚÌìÚÌðÞÑõâÕöäÖòàÒíÚÌé×ÉíÚÌïÛÍëØÊçÔÆæÓÅâοâÎÀçÓÅïÜÎíÚÌåÑÃëØÊíÚÌìÙËèÔÆçÔÆê×ÉòßÑôáÓóàÒîÛÍìÙËíÚÌøåØþëÝûèÛïÜÎéÕÇçÔÆê×ÉñßÑöäÖ÷äÖ÷ä×ùæÙþðâþìßúèÛñÞÐïÜÎøæØõâÔóàÒõâÔøæÙøæÙûéÛúçÚöäÖòßÒôâÕúçÚûéÛøæÙöãÖöãÖûèÛýëÝüëÝøåØüéÛøåØïÜÎðÜÎöãÕðÝÏðÝÏðÝÏõâÕüéÜþîàóáÓóßÑõâÕøæØõâÔîÛÍúèÚþîßÿïáúèÚóáÓïÞÏøçÙüêÜüëÜ÷æØôãÕóâÔðÝÏïÝÏïÜÎñÞÐôàÒöâÕïÜÎìÚÌîÛÍ÷äÖüêÜüêÜóàÒùæÙüêÜôàÒöãÖúçÚôáÓõâÔõâÔñÞÐðÝÏòßÑêÖÈèÔÆêØÊîÛÍóàÒûèÚúçÚöãÖñÞÐîÜÎðÝÏóàÒíÚÌïÜÎðÞÐðÝÏðÞÐñÝÏðÝÏóàÒ÷ä×òßÑíÚÌðÝÏíÚÌìÙËêØÊêØÊêØÊêØÊðÝÏòßÑòßÒñÞÐðÝÏðÝÏðÝÏïÜÎëÙËâÏÁß˽ß˼åÒÄìÙËôáÓ÷åØ÷äÖöâÔïÝÏòßÑòÞÐíÛÍê×ÉçÓÅêØÊìÚÌòÞÐøåØ÷åØóàÒñÞÐðÝÏéÕÇÝÉ»ÝÊ»ãÐÂéÕÇèÕÇéÕÇîÛÍôáÓøåØôâÔøæØþìÞùçÙòßÑôáÓøåØûéÛÿíàûéÜõãÕóàÓùçÚýëÝûéÜúèÚúèÚöãÕôáÔöãÖ÷ãÖôáÓïÜÎìØÊòßÑïÜÎîÛÍðÞÐñÞÐðÜÎóáÓùèÚüêÝþìÞýêÜ÷ä×èÕÇíÚÌôâÕýìÞýìÞûèÛøæØùèÚùèÚûéÛüêÜýìÞúéÛ÷å×óáÓóáÓöå×úèÚýëÝûèÚøä×öãÕøä×ùæÙûèÛùæØúèÛþíßüëÝöäÖôáÔ÷ãÖöãÕòÞÐóàÒ÷äÖóàÓòßÑóàÒóàÒóàÒùæØøå×÷äÖõãÕðÜÎëÙËíÚÌùæØûèÛúèÚõãÖòàÒñßÑðÝÏûèÛþîà÷å×îÛÍêØÊðÝÏøæØûéÛõâÔîÛÍéÖÈåÒÄçÔÆêØÊîÛÍïÜÎðÜÎíÚÌéÖÈãÐÂâÏÁèÕÇñÞÐôàÒóàÒïÝÏë×Éë×ÉîÛÍôâÔóàÒñÞÑòßÒöãÕúçÚõáÔê×ÉåÒÄê×ÉîÛÍìÚÌçÔÆê×ÉðÜÎóàÓóàÓðÝÏóàÒðÝÏíÙËíÙËðÝÏóàÓôáÔñÞÐñÝÏõâÕóàÓîÜÎäÑÃê×ÉõâÔ÷äÖòßÑôàÒõáÓôáÓ÷åØýëÝöãÖæÓÅïÜÎüëÝþëÝôáÓòßÑñÞÐëÙËòÞÐôàÒïÜÎê×ÉæÒÄèÔÆê×ÉîÛÍõâÕúçÚûèÚúçÚüëÝùçÚùå×ùæÙôáÓðÝÏóàÓ÷ä×üêÜýëÝýëÝûêÜòáÓìÚÌðÞÐ÷æØýìÝøæØñàÑíÛÌôãÕûëÜþñâûèÛúçÚùæÙùæÙùæÙùæÙüéÜÿîàÿðãüêÝôáÔíÛÍ÷ä×õâÔïÜÍïÜÍîÛÌñÝÎöãÖøæ×ûëÜùæØòßÑôàÒüêÜýëÝüêÜúèÚôáÓèÕÇñÞÐóàÓóàÒîÛÍêØÊé×ÉõâÔüéÜþíßùåØòßÑðÝÏøåØüéÛòßÒðÜÎñÞÐãÐÂåÑÃêÖÈîÛÍòßÑòÞÐñÝÏéÕÇéÖÈçÓÅçÓÅíÚÌôâÔõâÔöãÖõâÕóßÑöâÔùçÙðÞÐèÖÈåÑÃëÙËïÜÎîÛÍîÛÍðÝÐòßÒñÞÑîÛÍêØÊçÓÅîÛÍòÞÐïÜÎðÝÏöãÖóßÒöâÔøåØøåØ÷åØöä×ùæÙûéÛýëÝúèÚõâÔòÞÐöãÕóàÒñÝÐñÞÐòÞÐðÝÏïÜÎóáÓóàÒíÛÍìÚÌïÝÏñÞÐòßÑîÛÍéÕÇêÖÈíÚÌóàÓìÙËëÙËòàÒ÷åØöãÕøæÙøåØùæÙúçÙúèÚûèÚõâÕòßÑîÜÎíÚÌíÚÌìÚÍýëÝÿíßÿíàûéÛôáÔðÝÏéØÉè×ÈóâÔûëÜõäÖîÝÏêØÊêÙÊòáÓþðáþôåþïàùæÙñÞÑóàÒøåØùçÚýêÜïÜÎôáÔõâÕñßÑôàÒúçÙúè×ýìÛôáÎõâÑ÷åÔúèÖ÷äÔ÷åÔøæÓøæÕöãÒôàÐõãÕúçÙöãÖòßÑôàÒðÝÏê×ÉèÔÆêÖÉôáÓûéÛýëÝúçÙìÙËåÑÃíÚÍõâÕõâÕôàÒíÚÌíÚÌîÛÍîÚÌóàÒñÞÑôáÓôàÒñÞÐïÜÎðÝÏòßÑðÝÏïÝÏòÞÐðÝÏíÚÌïÝÏïÜÎíÚÌîÛÍðÝÏòßÑêØÊê×ÉëØÊìÚÌèÕÇâÏÁëÙËöãÕúèÚýëÝüéÜóàÒóßÑõáÔ÷ä×øæØúçÙúçÙùåØøæÙùæÙúçÚöâÕðÝÏöãÕõâÕôâÔôáÓôáÔõâÕÿíàýëÝúçÙôáÓñÝÏîÛÍòßÑîÜÎëÙËïÝÏøåØýîáüêÜôáÔîÛÍïÜÎðÝÏðÝÏòÞÐîÚÌîÚÌöãÕûèÛüêÜýëÞÿíßûéÛñÞÐïÜÎòßÑ÷äÖøåØ÷å×öãÕ÷å×úèÚÿïáýëÝûéÛüêÜùæØóáÓïÝÏñßÑñàÒîÜÎêÙÊèÖÈîÝÏóâÓøçØùçÙøçÙöå×üéÛüêÜøæÙôáÔ÷ä×ýêÜóßÑïÜÎñßÑûêÜÿíßýëÛüêÙýíÚùæÔþíÚûê×öäÒúèÖýëØüê×øæÓøæÔûèÖïÝÏóßÑõâÔôáÔöãÕøå×ñÝÐ÷äÖùçÚöâÕõãÕùçÙüëÞõâÕïÜÎïÜÏïÝÏìÙËéÖÈìÙËðÝÏïÜÎðÝÏùçÙüéÜúçÚôáÓíÛÍìÚÌîÛÍíÛÍêØÊèÕÇèÕÇæÓÅäÐÂëØÊèÕÇèÕÇìØÊïÜÎïÜÎíÚÌïÜÎðÝÏïÜÎìÙËéÖÈëÙËòßÑôáÓòßÒõâÔûèÛóàÒðÝÏïÜÎóàÒ÷äÖùæØóßÑõâÔøåØüéÜùçÙõãÕîÛÍíÚÌëÙËíÚÌñÞÐôáÓôâÔûèÚþìÞýìßüëÝüìÞûéÛôáÓðÝÏôàÓøæÙøæÙòßÑðÝÏñÞÐøå×øæØõãÖûèÚûèÚüêÜýìßýëÝúèÚóàÓùçÙüéÜöäÖôâÕöãÖ÷ä×øåØýëÞÿòäÿïâúæØúèÚøæÙøåØûèÛýëÞýìßýðâýîàõäÕñàÒùéÛûðâøæØúèÚúèÚòáÓëÚÌè×ÉîÚÍõáÓòßÑïÜÎõâÔöãÖðÜÎ÷äÖüéÛûéÛ÷å×ôáÑùçÖõãÐõâÐþíÚüëØõãÐóáÏøåÓúèÕøæÔõãÑóáÎöãÕóßÑúèÚþïâüëÝûéÛùåØûèÚöãÕéÕÇçÓÅìÙËøå×úèÚüêÜýêÝûèÛùæØøæØúèÚùçÙòÞÐíÛÍïÝÏôáÓòßÑîÛÍêØÊëÙËïÜÎëÙËê×ÉèÖÈé×Éê×Éê×ÉìÙËéÕÇçÓÅê×Éê×ÉçÔÆê×ÉïÜÎðÝÏîÛÍíÚÌîÛÍíÚÌê×ÉèÕÇåÒÄæÓÅñÞÐòÞÐïÜÎðÝÏõãÖøåØ÷äÖóßÑñÞÐòßÒöãÕùçÚüéÜíÚÌñÝÏõáÔóàÓîÛÍèÕÇäÐÂìÙËõâÕùçÙûéÛûìÞúçÙøåØöä×öä×öãÖôàÓôáÓùçÙýëÝýëÞþîáÿóåÿðãÿðâýìßúçÚùæÙúçÚûéÜøåØøå×ýëÝýëÝúçÚýìÞþïáüïáùçÙ÷ä×øæØìÚÌòÞÐòßÑïÜÎóàÒûèÛøçØöå×ñßÑ÷æØþðáýïàùéÛøçÙùçÙúéÚøçÙóáÓîÜÎòßÑòßÑøæØûéÜôáÓøäÖúèÚöãÖìØÊíÙËôáÓþëÛúçÕøåÓôâÏøæÓüê×øæÓòàÎòàÎøæÓùæÔôâÐíÚÌìÙËôâÕùçÙóàÒïÜÎòßÑïÜÎìÙËë×ÊéÖÈçÔÆäÑÃìØÊóáÓøåØùæÙùæØ÷å×ôáÔñÞÐôàÒòßÑìÙËéÖÈìÚÌïÜÎîÛÍïÜÎòßÑðÝÏðÝÏîÛÍîÛÍïÜÎòßÑëÙËïÜÎóàÒóßÑëØÊãÐÂë×ÉîÛÍñÞÐðÝÏòßÒõâÕñÝÏçÔÆæÒÄë×ÉéÖÈëØÊòßÑóßÒôàÓðÝÏèÔÆß˽ê×Éê×ÉèÕÇæÓÅæÒÄæÒÄïÜÎìÙËéÖÈê×ÉïÜÎóàÒîÛÍìÙËê×ÉèÕÇê×ÉëØÊëØÊôáÔùçÚ÷ä×õâÕ÷ãÖúèÚùçÙöãÕóàÒ÷äÖüëÝüêÝüéÛõâÔïÜÎôàÓüéÛþîàùæØöâÕüéÜÿîáþíà÷äÖïÝÏëØÊíÚÌóàÒ÷äÖïÜÎóßÑóàÓðÝÏïÜÎðÝÏïÝÎóâÔùèÚüëÝùèÚõäÖÿðâýìÝúéÚùéÚøèÚøçÙýêÝúçÚøåØúèÛûèÛøå×úçÚóàÒïÜÎóáÓ÷äÖ÷äÖöãÓõãÐõãÑçÕÃêØÅôáÎôâÏíÛÈé×ÄíÛÈòàÍôâÐ÷å×øå×÷ä×ðÝÏìÙËëØÊðÝÏïÝÏôáÓûéÜúèÚôáÓìØÊíÚÌîÜÎïÜÎîÛÎíÙÌåÒÄãÏÁâÎÀîÚÌ÷äÖõâÕïÜÎòßÒõáÓòßÑðÝÏïÜÎòßÑòßÑïÜÎìÚÌíÚÌðÝÏñßÑòßÒñÞÐïÜÎïÜÎðÞÐñÞÐòßÑóßÑôàÒöâÔ÷ãÖòÞÐïÛÍðÜÎ÷ãÖøå×ôàÒðÝÏôâÔöä×ñÞÐê×ÉçÔÆæÒÄé×ÉíÚÌíÚÌîÛÍðÜÏüëÝûéÜøæØôáÔóàÒòßÒüìßñßÑåÒÄâÏÁæÒÄéÖÈíÙËöãÕøåØîÛÍîÜÎöãÖûéÛöâÕòßÑôáÔõáÔóàÒ÷åØûèÛøæØòÞÐñÞÐöâÔûèÛýëÞýìßýêÝúèÛøæÙúçÙ÷å×óàÓðÝÏòßÑõâÔúçÙøåØúèÚýíßúéÛóàÒïÝÎöäÖþîßûêÛöå×ûëÜøçÙúèÚõäÖîÝÎðßÑøçÙúèÚôáÓñÞÐíÙÌîÛÍùæØõáÔôàÓøæØþïâþïáùæ×íÚÉëØÅóáÏîÜÉïÜÉïÝÊìÚÇóàÍôâÏðÞËðÞËôâÐúçÚúçÚóàÒòßÑøåØúçÙûèÚûèÚüêÜþíßÿîáþìßúçÙóàÓìÙËçÓÅäÐÂáÎÀçÕÇçÔÆáÎÀäÑÃïÝÏôàÓðÝÏòßÑòßÑîÜÎìÚÌëÙËðÝÏñÞÐïÜÎíÚÌñÝÏõâÕüêÜ÷åØîÛÎæÒÄìØÊ÷ä×õâÕòßÑðÝÏòßÑñÞÐïÜÎóàÒùæØ÷ä×÷åØùæÙõáÔïÜÎòßÑðÝÐéÕÇéÖÈîÛÍôáÓñßÑíÛÍë×ÉñÞÐøå×÷ä×óàÒôàÒüêÜýíßüêÝòàÓøæØùçÙóàÒðÞÐñÞÐë×ÉèÕÇéÖÈòÞÐ÷ä×øæÙ÷ä×òßÑóáÔùçÙòÞÐåÑÃìÙËîÛÍôáÓúèÚ÷åØðÝÏðÜÎóßÒöâÕõâÕ÷ä×úçÙúèÚþìßÿîàüêÜùæÙ÷åØõâÔùçÚûèÚøæØöãÖõãÕüíÞúêÜõäÖïÝÎðÞÏóâÔüêÜþíßýìÝ÷æØõäÖöæ×òàÒïÜÏòßÑòßÑïÜÏòßÒýëÝÿîàÿðâþíßúçÚõâÓùæÕðÞËôâÐúèÕòàÍëÙÇðÞËëÙÇñßÍøæÔôâÐòàÎðÝÏîÛÍîÛÍñÞÐòßÑñÞÐøæÙþíàûêÜöãÖøæØøå×ùæÙ÷äÖðÝÏîÛÍòßÑïÜÎôàÒóßÑòßÑê×ÉäÐÂéÖÈéÕÇèÔÆëØÊôâÕõáÔïÜÎòßÑòßÑóßÑóàÒóáÔóàÓìÙËïÜÎðÝÏîÛÍìÚÌíÚÌðÝÏëØÊèÕÇìÚÌñÞÐóàÒóßÑõáÓôàÒñÞÐòÞÐõáÔìÚÌìÙËíÚÌðÝÏöãÕúèÚùæÙúçÚùæÙöä×óàÒñÞÐóàÓõâÔõâÔõãÖõâÕôáÓèÕÇéÖÈïÝÏùæÙúçÚõâÕûéÜùæÙøå×úèÚûéÜùèÚõâÕõâÔôàÒîÛÍëØÊéÖÈíÛÍîÜÎñÞÐóàÒðÞÐëØÊäÐÂåÒÄëØÊõáÓõâÔïÜÎúçÚüéÜüéÜûéÛüëÝüíàûéÛ÷ä×òßÑòßÑõâÕøåØÿóåÿôæþñãûêÜùèÚúèÚùèÙõäÕõäÕýíÞÿðâþíßýìÞûéÛýìÞþîàüëÞýëÞÿïáýìÞúçÙöãÖôáÔóàÑôàÐòßÍóáÏùçÔùçÔõãÑýëØôâÏíÛÈðÞËõãÑ÷åÒôáÔôáÔôàÓóàÒòÞÐðÝÏ÷ä×÷äÖôàÒïÜÎíÛÍîÛÍõâÕôáÓðÝÏòßÑôàÒðÝÏïÜÎñÞÐñÞÐîÛÍéÕÇäÑÃçÓÅèÕÇêØÊíÛÍðÝÏñÞÐòÞÐòßÑñÞÐðÝÏíÚÌëØÊãÐÂê×ÉðÝÏðÝÏîÛÍìÙËîÛÍïÜÎñÞÐòßÒôáÓõâÔñÞÐóáÓôàÓòßÑðÝÏñÝÏíÙËë×ÉìØÊðÝÏòßÑðÜÎõâÔøå×ûéÛúçÚõâÔðÝÏéÕÇôáÔüéÛøå×òßÑïÜÎúçÙúèÛúèÚøåØõáÔóßÑýëÝÿìÞÿìÞúèÚòßÑê×ÉìØÊôáÔúçÚ÷ä×÷å×úçÙüéÛûèÚøåØóßÑïÜÎëÙËùæØùæØõãÖòßÑóàÒöãÖñÞÐóàÒöä×ûéÛÿïáÿõçúçÚ÷ä×öãÖúèÚþìßÿíàøèÚúêÜýíÞþíÞýìÝýìÝ÷æØðÞÐïÝÎøèÙüìÝúèÚþìÞýëÝÿïâÿõèÿòåþíßøæÙôáÓîÜÎìÚÌïÜÎñÝÎúç×üê×÷åÒõãÑøåÓôâÐùçÔúèÕ÷åÒùèÕüêØõãÑòßÒôáÔõáÓòßÑñÞÐóßÑïÜÏîÛÍôàÒôáÔïÜÎïÝÏéÖÈîÛÍîÛÍíÚÌñÝÏõâÔðÝÏïÜÎìÙËõâÔüéÜ÷åØïÜÎôàÓôàÒîÛÍïÜÎôàÒîÛÍðÝÏñÞÐôáÓöãÖöãÖðÝÏðÝÏïÜÎìÚÌêØÊé×ÉíÚÌõáÔúçÙõâÕîÛÍéÖÈçÔÆíÙËòßÑöãÖ÷ä×øå×òàÓòßÒòàÓóáÔóßÑðÝÏíÚÌñÞÐöäÖúçÚ÷äÖòßÑòÞÐùæØüèÚöãÖõáÓöãÖøåØöãÖôâÔõáÔ÷ä×ùæÙñÞÐóàÒôâÔôâÔóàÓóàÒóàÒöãÕùæÙüêÜýìßýëÞùçÙúèÚûéÛûèÛûéÜûéÜüêÜøæØòßÒîÛÍòßÒùæØðÝÏóßÑöãÖøåØ÷ä×ôâÔýêÜúèÛúçÙüèÚûéÛùæÙñßÐðßÐðßÑôãÕöäÖ÷å×ôãÕõäÖôãÕòáÓóâÔöå×ÿíàÿïáýîáüïáüìÞùæØïÜÎïÜÎðÝÐóàÒöäÖùæ×úç×üêØ÷åÒôâÐùæÔøæÓòßÍúéÖûêØúèÖôáÎçÔÁéÕÇñßÑúçÙýëÝüêÜûèÛíÚÌéÕÇìÙËïÜÎîÛÍóàÒéÖÈìÙËîÛÍîÛÍòßÑúèÚûèÛöãÕïÛÍóàÒúèÚöãÖùçÙýëÝüêÜòÞÐìÙËëÙËòÞÐïÜÎìÙËê×ÉìÙËîÛÍôâÔóàÒñÞÐñÞÐñÞÐðÝÏðÜÎòßÑñÝÏëÙËéÖÈéÕÇíÛÍîÛÍðÝÏñÞÐðÝÏîÛÍþìÞÿíàûéÜñÝÏîÛÍòàÓíÚÌìÙËíÚÌóàÒõáÓóàÒüêÜ÷ä×ñÞÐðÝÏôáÔøæÙòßÒîÛÍïÜÎõâÔ÷å×õãÕòßÑïÜÎëÙËêØÊñÝÏøå×ÿïáûèÛõáÔòßÑóàÓóáÓîÛÍïÜÎõáÔüêÜÿîàýíß÷ä×ôáÓôáÓ÷ãÖõâÔïÜÎíÚÌðÝÏôáÔùæÙõâÕðÝÏôáÓòßÑðÝÏòÞÐôáÔ÷äÖöäÖòáÒïÞÏñàÒóâÔòáÓôâÔúéÛûëÜõäÖòàÒóâÔúèÛùçÙñÞÐìÙËñÞÐõáÓóàÒöâÕùæÙüêÜýëÝýêÛóàÏóáÎõãÐøåÓûéÖýëØõãÑñßÍíÛÈîÛÈôáÎ÷æÔùéÛúçÚøåØ÷äÖöäÖöãÕúçÚöãÕïÝÏìÙËðÝÏöäÖñÝÏîÛÍòÞÐõáÓòßÑòßÒðÞÐòßÑôáÓòßÑïÜÎëÙËêÖÈíÚÌñÞÑõáÔõâÕôáÓîÛÍìÚÌê×ÉèÕÇèÕÇèÕÇæÓÅéÕÇïÛÍõãÕ÷åØõâÔôáÓðÝÏëØÊê×ÉîÛÍñÞÐ÷ä×óßÑðÝÏóàÒöãÕøå×ûéÛüêÜùçÚòßÒðÝÐñÞÐëØÊèÕÇé×ÉõáÓúèÚûéÛõâÔíÚÌêØÊïÜÎôáÓôáÓñÞÐöäÖöãÖîÛÍêÖÈëØÊõâÓöãÕõãÕöãÕúèÚþîàúèÛûéÚùæ×òßÐñÞÏóàÒöãÕôàÒõáÓùæÙ÷äÖñÞÏñÞÐöãÕùæ×øå×öãÖöãÖòÞÐóßÑõâÕøä×óàÒìÚÌïÜÎòÞÐòÞÐîÛÍìÚÌîÜÎôãÕñàÐðßÏóâÔôãÔóâÒôãÕùèÙüëÛõäÕìÚËæÕÅêÖÈòàÒòÞÐïÜÎõâÔøæÖ÷å×ùæØúèØúçÚùçÙ÷åÖøåÔóàÎöãÑ÷åÔôâÐõãÑûè×õâÑôâÏõâÒ÷åÔþíÝýëÞõâÕíÛÍíÚÌðÝÏñÞÐõâÔúèÚõâÔíÚÌîÛÍîÜÎïÜÎïÜÎôàÒñÞÐæÓÅáοëØÊðÜÎ÷äÖðÜÎçÔÆé×ÉçÓÅæÒÄê×É÷ãÕüéÜûèÛõâÕ÷ä×øæØõãÖñßÒîÜÎçÔÆäÑÃåÒÄìØÊðÝÏðÜÎùæØöãÖôáÔõâÕòßÒîÜÎñßÑê×ÉæÒÄêÖÈòàÒöä×òßÑñÞÐõãÕþìÞýìÞøåØ÷å×ñÞÑðÝÏöâÔ÷å×õâÔèÕÇñÞÐóàÒíÛÍíÛÍôáÓ÷åØùçÚýìÞùæØðÝÏðÝÏðÜËóàÏúé×ýìÛ÷åÓìÚÈíÚÉòßÎòßÎ÷äÓþìÚþìÙýìÚúèÖóáÏéÖÆæÓÁæÓÀñßÎøæÔûéÖùçÖùæÕüéÙûèÛüêÜöâÔê×ÉëØÊóáÓðÝÏóàÒöä×÷ä×òßÑíÛÌïÜÌõâÑúèÖüéØùæÕõãÑøåÕúè×òàÍê×ÆïÜËòßÍìÙÇóáÏ÷äÒôáÐóáÏöãÒüéØõâÑðÞËïÜÌðÝËîÛËùæ×ýêÛþëÜùæÙöãÔõáÓöâÕúçÙúëÝúëÝøå×óßÑóáÓôàÒíÚÌîÛÍôâÔöãÕèÔÆæÒÄçÔÆïÜÎðÝÏíÚÌìÚÌïÜÎîÛÍé×ÉæÒÄäÑÃæÒÄíÛÍìÚÌâÏÁæÒÄñÝÏôáÓôâÕðÝÏéÖÈëØÊòßÒïÜÎñÞÐðÝÏê×ÉèÕÇçÔÆîÜÎíÚÌèÔÆäÑÃçÔÆíÚÌîÛÍìÚÌíÚÌðÝÏñÞÐïÜÎîÛÍëÙËêØÊìÚÌðÝÏóàÓèÖÈèÖÈëØÊòßÑöãÖõãÖ÷å×óáÓðÝÏðÝÏðÜÎíÚÌïÝÏöäÖùæÙôáÔòßÑóàÒóáÓùçÙûëÞûèÛ÷å×õâÓùæÖöãÐôâÐõãÑòàÎìÚÇïÜÉñÞËðÞË÷åÒüê×ùçÕöæÔôáÎíÛÈê×ÄîÜÉõãÑùçÔùçÔøæÔöäÑóáÎñßÌöãÕ÷äÖôàÒíÚÌîÛÍòßÑûéÛþìÞþìÞøåØõâÕõâÓóàÏõãÑõâÐóáÎôâÏ÷åÒøæÔúèÖ÷åÓ÷åÓûéÖúèÕüê×ùæÔóáÏðÝÊóáÎøæÓúèÕüê×ûê×öäÑöãÐøæÓüêÜøæØ÷äÖûêÝüêÜøä×öâÕïÜÎéÖÈêØÊïÜÎñÞÐëÙËíÚÌîÛÍîÛÍñÞÐôáÔïÛÍîÚÌòßÑ÷å×õâÕîÛÍôáÓóàÒðÝÏíÚÌïÜÎòßÒïÜÎíÚÌìÙËïÛÍòàÒôàÒïÜÎê×ÉäÑÃáÎÀáοáÍ¿åÓÅçÔÆèÕÇæÒÄãÏÁáÍ¿çÔÆìÙËïÜÎîÛÍíÚÌíÚÌëÙËëÙËìÚÌïÜÎîÛÍìÙËìÙËìÙËðÝÐöãÕóàÒìÙËåÑÃê×ÉïÜÎóàÒóßÑñÞÐôâÔôáÔôáÔöâÕôáÓñÞÐùçÚûèÛúçÚõãÕðÝÏìÚÌëÙËïÜÎîÛÎôáÓýìÞþïàÿðßýíÛøæÔòßÌóàÎ÷åÒóáÎôâÐöäÒúèÕõâÐëØÅåÓÀïÜÉøæÓûê×úèÕúèÕ÷äÒøåÓôâÐíÛÈé×Äé×ÄîÛÍñÞÐôáÔøåØûéÛýìÞøæØøåØ÷ãÖõáÔõâÕ÷äÕûéØüëÙùçÔôâÐóáÏöãÑñßÌîÜÉîÜÊõãÑ÷åÓòàÎüê×øæÔõãÑöãÑ÷äÒ÷åÒñßÌøæÔýëØúèÕùçÔúçÕùæÙïÜÏéÖÈíÛÍðÝÏîÜÎòßÑñÞÐóàÓúèÚûéÛøåØïÝÏïÜÎòßÑîÚÌê×ÉïÜÎúæÙüéÛýêÜüêÜúçÚùçÙùæÙùæÙöäÖóßÑôàÓ÷ä×øå×òÞÐñÞÐùæÙøä×ñÝÐêØÊé×ÉèÖÈæÔÆâÏÀÞ˽àÍ¿âÏÁæÒÄë×Éê×ÉçÓÅê×ÉêØÊêØÊéÕÇê×ÉêØÊðÝÏíÚÌêÖÈé×ÉëÙËìÚÌðÝÏøå×úèÛóàÒìÚÌê×ÉîÛÍóàÒõãÖóßÑñÞÐñÞÐúèÚûéÜüéÜùçÙôáÔïÜÎùçÙ÷ä×õâÕóáÔóàÒòßÑûèÛùçÙòÞÐóàÒúèÚûèØöãÓöäÑñßÌêØÅîÛÈóáÏùçÔõãÑöäÒøæÔóáÏíÛÈôáÎùçÔýëØûéÖúçÕùæÔðÝËñßÍòàÍóáÏöäÒ÷æÔõâÔöãÖùæÙüêÜýëÝýëÝúéÛõãÕõâÔûéÛûéÜ÷äÖ÷äÔüëØÿñßÿðÞÿïÜþîÜúèÕôâÐõãÑþìÙÿðÞÿïÝýëÙúèÕøæÔùçÔõâÐîÜÉòàÎòßÌòàÎñßÍêØÆâнòßÑöãÕôáÔíÛÍìÚÌðÝÏúçÚüéÜþìßýíßüéÛöãÕõâÔóàÒõãÖóßÒðÝÏöâÕûéÛýëÝöäÖèÕÇéÖÈôáÔñÞÐ÷äÖúèÚøåØôáÓòÞÐëØÊëÙËíÚÌïÜÎëØÊæÒÄê×ÉðÝÏñÞÐëÙËëØÊïÜÎòßÑñÞÐòßÑôàÒñÝÏìÚÌóßÑðÝÏíÚÌíÚÌïÜÎðÝÏïÜÎðÝÏïÜÎíÚÌëÙËëÙËôáÓõâÕðÝÏçÕÇçÓÅëØÊñÞÐòÞÐðÜÎîÛÍñÞÐöãÖøåØúçÚûéÜùæÙöäÖôâÔê×ÉëØÊëÙËîÛÍñÞÐôàÒóàÒòßÒóßÑöãÖ÷ä×õãÓöãÓõãÐôâÏôáÎöãÐöäÑúèÕôâÐôâÐøæÓùçÔûê×ùæÔûèÖúèÕøæÓøæÔûéÖõãÐòàÎôâÏýëÙÿðÞÿðÞüìÞýìßýìÞýëÝýëÝýëÝüìÞüêÜþìÞÿïáÿîàüéÙøåÕùçÔûé×ýìÙýëØøæÔóàÎñÞÌóáÏõãÐõäÑøèÖ÷åÓöäÒ÷åÓûéÖüêØúèÖöäÒõãÑöäÒøæÓõãÐïÝÊïÜÎöãÕõâÕëØÊíÚÌ÷ä×þíßüêÜøä×õâÔùæØþìÞýëÝûèÛùæÙúçÚ÷ä×óàÒ÷äÖ÷äÖñÞÐçÔÆçÔÆíÚÌòßÑöãÖøæÙôáÓíÛÍêØÊíÚÌïÜÎïÜÎïÜÎïÜÎðÞÐëØÊòßÑôàÒîÛÍëØÊìÙËïÜÎðÝÏñÝÏòßÑôàÒôáÔìÙËíÚÌîÛÍðÝÏîÛÍê×ÉæÒÄìÙËðÝÏðÝÏïÜÎíÛÍõáÔëØÊåÑÃèÕÇìØÊìÙËê×Éê×ÉêØÊìÚÌðÜÎòßÑôâÔõâÕòàÒïÛÍîÚÌðÝÏïÜÎóßÒõâÕôáÔöãÖøå×ïÜÎëØÊñÝÏúçÚüëÝýðáûéØýëØüêØüê×üê×þìÙ÷åÓ÷åÒüëØýëÙúçÕûéÖýìÙúèÕóàÎïÝÊóáÏúèÕþìÙúèÖ÷åÓ÷åÓöæÔõäÒþíßûêÜõãÕë×ÉçÔÆåÒÄìÙËøå×þìÞüêÜúçÚüéÚôàÐíÛÈëÙÆñßÌôâÐóàÎõâÐöãÑ÷åÒïÜÉçÔÁêØÅôâÐøæÓüëÙþîÛÿîÜþìÚõãÑøåÓøæÓöäÑ÷äÒúèÕóàÒ÷ä×ôáÔëÙËìÚÌôàÒöãÕùæÙöâÕíÚÌë×ÉîÜÎ÷ãÕúçÚúçÚþîáþîàõáÓåÒÄãÐÂæÒÄíÛÍìÚÌåÓÅçÔÆëØÊïÜÏñÞÐôáÔøåØúçÙôáÓîÛÍîÛÍñÞÐôáÓöãÖóáÓñÞÐíÚÌéÖÈäÑÃéÖÈêØÊéÖÈèÔÆëØÊïÜÏôáÔòßÑðÝÏñÞÐíÚÌèÔÆáÎÀäÑÃçÓÅê×ÉñßÑøæØùçÙôâÔïÜÎìÙËïÜÎòßÑêØÊíÚÌðÝÏòßÑíÛÍæÔÆèÕÇèÕÇæÓÅåÒÄê×ÉñÝÏôâÔíÛÍëØÊõáÓùæÙôáÓðÝÏë×ÉéÖÈìÙËìÙËçÕÅé×ÆòßÍöãÐòàÍòßÌöåÒüê×ýëÙûèÕýíÛÿòàþíÚüìÚøæÓõãÑ÷åÓ÷åÓóáÏúèÖ÷åÓñÞËé×ÅçÕÂçÔÁíÚÌïÜÎäÑÂåÑÃìÙËåÒÄæÓÄïÝÏïÜÎìÚÌòÞÐôáÒ÷äÔöãÑòàÍïÝÊóáÎøæÓøåÓòàÍðÝÊôáÏôâÐñÞËöäÒûé×ûê×ôâÏïÝËðÞËóáÎúèÕòßÌîÜÉ÷äÒõãÑøåØûèÛýëÝûéÛöãÖóßÑíÛÍðÝÏðÝÏéÕÇçÔÆéÖÈæÓÅðÝÏöãÕðÜÎëÙËëØÊäÑÃçÔÆñÞÐöâÔòßÑóßÑëÙËìÚÌðÝÏóàÒñÞÑíÛÍîÛÍòÞÐòßÑîÛÍíÚÌïÜÎñÞÐïÜÎîÛÍðÝÏïÝÏíÚÌïÜÎíÚÌêÖÈèÔÆéÕÇê×ÉñÝÏóáÔòßÑíÚÌê×ÉêÖÈðÝÏóàÒóàÓñÞÐôàÓ÷å×éÖÈê×ÉñÞÐóßÑòßÑøäÖôáÔõãÖóßÒìØÊçÕÇåÒÄëÙËñÞÐóßÑðÝÏñÞÐôáÓõãÕðÝÏïÜÎðÝÏïÜÎñÞÐñÝÏòßÑîÛÍæÓÅãÐÂäÑÁåÑÀèÖÃïÜÉ÷åÓúèÕúèÖ÷äÑñßÌéÖÃëÙÆóáÏõãÐóáÎõãÑøåÓùçÔùçÕùçÕ÷åÓôâÐôâÐøæÓúèÖùèÕõâÔøæØøèÚûîàþñãúëÞûëÞõâÔìÚÌîÛÍòßÑõáÒùæÕõãÑòßÍóàÎ÷åÓûèÖýëØúèÕøæÔùæÔ÷åÓôâÐ÷åÓõãÑïÝÊëÙÆñßÍúéÖöäÒôâÏñßÌôâÐøæÓóáÎðÝÏ÷ä×ûéÛýìÞüëÞøåØ÷äÖõâÕóàÓôáÔ÷ä×úçÚîÚÌæÒÄãÐÂéÖÈíÛÍìØÊðÞÑòàÓùæÙùæØóßÑðÝÏïÜÎèÕÇêÖÈõâÔöãÖîÜÎæÔÆçÔÆë×ÉðÝÏîÛÍéÖÈëØÊêÖÈéÖÈíÚÌóàÓ÷ä×ñÞÐóàÓöãÕóàÒïÜÎëØÊæÒÄæÓÅåÓÅéÕÇíÚÌðÝÏîÛÍéÖÈçÔÆêØÊìÚÌìÙËèÔÆæÒÄìÙËòßÑïÝÏîÛÍòßÑóßÑîÛÍèÕÇìÚÌõâÕñÞÑïÜÎòÞÐúçÚüéÜ÷åØñÞÐðÝÏïÜÎçÓÅåÒÄê×ÉìÙËòÞÑòßÑëØÊë×ÉïÜÌìÙÉïÝÊõâÐúèÕ÷åÓòßÍìÚÇê×ÅãнáλåÒ¿äѾíÛÈõâÐúçÕöãÑôáÎöäÒñßÌöäÒúèÖýëØþíÚÿîÜþñäÿîàÿòåÿôæÿñäÿóåýëÝñÞÐïÝÏõâÕõáÓöãÔýêÙ÷åÓôâÐõãÑøæÔùçÔýìÙýëØüê×ùçÔùçÔøæÓûèÖøæÔùçÔúé×úèÖ÷æÓøæÔòàÍóàÎóáÏîÜÉëÙÆïÜÎöãÖöä×ûéÜÿîáúçÚ÷ãÕõâÔ÷ãÖûéÛúçÚõâÔóàÒõãÕöäÖõâÔôàÒõâÔúèÚôâÔñÞÐïÜÏòßÑ÷ä×òßÑæÓÅãÏÁíÛÍòßÑíÚÌæÒÄäÐÂåÑÃëÙËíÚÌê×ÉêØÊèÕÇåÑÃáÎÀåÒÄë×ÉñÞÐñÞÐïÝÏïÜÎðÝÏðÜÎçÕÇäÐÂâÏÁæÓÅìÙËíÚÌê×ÉçÓÅèÔÆîÛÍòÞÐñÞÐðÜÎçÔÆæÓÅðÝÏñÞÐíÚÌìÚÌêØÊèÕÇëØÊóàÓüéÜõãÖðÝÏîÛÍñÞÐõâÔöä×úçÚþíßûéÛóàÓõâÔøå×ûéÜûèÛúçÚøæÙöãÕòßÏñÝÍóáÏôáÏóàÎöãÑúèÕûê×þíÚûéÖ÷åÓöåÓòàÎüëØÿïÝþíÚóáÏîÛÉîÛÉøçÕýìÚÿðÞþíÚøæÓóáÏöãÕòßÒ÷ãÖ÷ãÕòÞÐ÷ãÖðÝÏïÜÎóàÒóáÓòßÑøäÖõâÒóáÏôâÐûéÖþíÛþíÚÿíÛýëØûéÖüê×þíÚÿïÝþíÚýëØþìÙýëÙ÷åÓíÛÉöäÒöãÑüé×ùçÔõãÑüëÙþëÝúçÚôàÓóßÑóßÑíÚÌçÔÆê×ÉïÜÎõâÔõâÕóàÒóßÒøåØöãÕíÛÍíÛÍôáÓðÜÎê×ÉãÐÂåÒÄðÞÐøå×ûéÜ÷äÖðÝÏîÛÍóàÒøæØøåØûèÛúèÚóßÑíÚÌíÙËòÞÐóßÑñÞÐìÙËëØÊíÛÍóàÒðÝÏìÚÌíÚÌðÝÐôáÔõáÔòÞÐïÜÎïÜÎëÙËèÔÆìÙËñÞÐñÞÐë×ÉåÑÃãÏÁðÝÏóàÒòàÒòÞÐòÞÐðÝÏìÙËçÓÅçÔÆïÜÎîÛÍçÓÅïÜÎôàÒôàÒîÜÎíÛÍñÝÏðÝÐôãÕõãÕõâÕøæØùæØùèÚúçÙüèÚýìÞüêÜ÷äÖîÛÊìÚÇê×ÅèÕÃêØÅíÛÈöäÒúêØùé×úèÕýëÙýëØöåÒõäÑõãÑõãÑ÷åÓùæÔüêØûé×ûê×ûé×öäÒðÞËéÖÈëÙËñÞÐñÝÏîÛÍðÝÏõãÕöäÖõáÓñÞÐòßÑöãÔøæÕúèÖüêØûéÖøæÓõãÐüê×úèÕûéÖýìÙýìÙûêØüìÚûé×øæÔöäÒøåÓùçÕôâÐôâÐ÷äÒôâÐôâÐûé×øæØñÞÐñÞÐòßÑîÛÍëÙËóàÒ÷äÖ÷äÖôàÒõâÕùæÙùçÙðÝÏèÕÇê×ÉñÞÐõâÕìÚÌîÛÍìÙËìØÊîÜÎìÙËë×ÉîÛÍíÚÌåÒÄåÒÄèÕÇñßÑõãÕõãÕîÛÍèÔÆåÑÃéÕÇìØÊïÛÍðÝÏñÞÐñÝÏôáÓðÝÏê×ÉäÑÃà̾ÞʼáÍ¿äÑÃèÕÇëÙËìØÊë×ÉæÓÅìÚÌîÛÍéÕÇãÐÂá;ê×É÷äÖùæØòÞÐðÝÏðÝÏ÷ä×õâÔõâÕùæØôâÔíÙËïÜÎõâÔùæÙ÷ä×òßÑíÛÍãÐÂâÏÁèÖÈñÞÐóßÑõáÓóàÒ÷ä×úçÚûéÛúçÚøåØðÝÍñßÎ÷åÒúéÙôáÐçÔÂàÌ»ê×ÆðÝÊóàÏ÷åÔ÷åÓíÚÉçÓÂåÒ¿îÛÊôáÐõãÑïÝÌðÝÌðÝËðÝÌóàÎöãÓúçÙùæØóàÒíÚÌíÚÌïÜÎúçÚýëÝùæÙøåØùæÙôàÒ÷åÕýëÙÿîÜúèÖóáÏðÝËóàÎòÞÍõãÑùçÖõâÑíÚÉçÔÂê×ÅðÝÊöãÓ÷äÓõãÒñÞÍîÜÊïÝÊ÷åÔüëÚýêÚøæØîÛÍòàÓòßÒæÓÅâÏÁéÖÈõâÔùæÙðÜÎíÛÍóàÒóàÒîÛÍîÛÍ÷ä×÷ä×òàÒ÷ä×ûèÚ÷ä×òÞÐíÛÍãÑÃäÑÃíÚÌôáÔðÝÐèÕÇâÏÁãÐÂß̽ß̽çÓÅîÚÌñÞÐéÖÈèÕÇé×ÉìÚÌìÚÌêÖÈëØÊéÕÇæÒÄäÑÃæÒÄèÕÇãÎÀçÔÆê×ÉèÕÇçÔÆéÖÈë×ÉìÙËïÜÎóáÓòßÑîÚÌíÚÌñÞÐìÙËëØÊðÝÏïÜÎðÝÐôàÒõáÓõâÔøåØüêÜúçÙ÷ä×õâÔóàÒïÜÎêÖÈèÕÇðÝÏõâÔôâÔñßÑïÜÎüêÜýëÝøå×òßÒðÝÏê×ÉùæØúèÙùæ×õâÔ÷äÕúçÙôàÒîÛÍôâÓýëÝøæ×óßÐíÙËîÜÍõâÔõâÕîÛÌìÙÊîÛÍëØÊéÖÇìÚÌóßÐøåØýïáüêÝúèÚóàÒóßÒüéÛþíßþëÝýìÞýìÞøåØïÜÎóßÑõâÔôáÓïÜÎíÚËîÛÌçÓÄìÙÊóßÐóáÓïÜÎéÖÇïÜÎîÛÍîÛÌòßÑôáÔ÷äÖõãÕôáÒùæØÿðâþðâùçÚúçÚýêÝúçÚìÙËôâÕøåØõâÔóàÒôáÓùæÙôâÔíÙËöâÕúçÚúçÚôàÒôàÒøåØûèÛùçÚôáÓíÚÌë×ÉëØÊîÜÎóàÓöãÖõâÔôàÒõáÓôàÒïÜÎéÖÈèÔÆìÙËñÞÐïÜÎèÖÈãÑÃãÐÂäÑÃãÐÂâÏÁçÓÅðÝÏöä×õâÔïÜÎòÞÐôáÓôáÓïÜÎíÚÌíÚÌðÝÏñÞÐñÞÐïÜÎóàÒøå×øæÙõãÕóàÒñÞÐðÝÏðÝÏëÙËïÜÎñÞÐòÞÐõâÔúçÙôáÓòÞÐòßÑôâÕõáÔòßÑõâÕ÷äÖ÷åØ÷äÖôáÓòÞÐñßÑôáÓñÞÐïÛÍîÚÌèÔÆìÚÌñÞÐðÝÏèÕÇèÕÇîÛÍûèÛùçÚùæØùçÙöãÖòßÑýìÞúçÚúçÚöãÖòÞÐóßÒûéÜ÷å×óàÒôàÒùæÙýìÞùæÙ÷ä×úèÚýëÝüêÝþíßüêÜúèÚöãÖóßÑñÞÐóàÒñÞÐíÚÌê×Éë×ÉîÛÍðÝÏëØÊõâÔüêÜûéÛøæÙ÷ä×õâÔõáÔñÞÐíÛÍîÛÍñÞÐúçÚþëÞÿíßùèÛ÷äÖöãÕùçÚýëÝûéÛñßÑúèÛþíßùæÙõâÕôáÔùçÚûèÛùæØøåØøæÙ÷äÖôàÒôàÒöâÔóàÓòßÒðÞÐòÞÐõãÕøå×÷ä×õâÕðÝÏîÛÍñÞÐöâÕôáÔïÜÎéÖÈéÖÈíÚÌòßÑîÛÍðÝÐîÜÎèÕÇê×ÉðÝÏìØÊïÛÍòßÒóàÓðÞÐíÚÌñÞÐñÞÐðÝÏîÛÍìÚÌëØÊêÖÈìÙËïÜÎïÜÎíÚÌê×ÉñÝÐóàÓóáÓòÞÐôáÔùæÙñÞÐîÛÍìÙËìÚÌëÙËë×Éê×ÉóàÒöãÕïÝÏïÝÏôáÓúçÚöãÕôàÒôàÒóàÒñÞÐñßÑøæØúçÙúçÙøæØñÞÐíÚÌê×ÉëÙËòßÑôâÔóàÒúèÚýêÝõâÔðÜÎ÷ä×üéÛúèÛöãÕöãÖ÷ä×øå×ýëÝüéÜùæÙöãÖ÷ä×ûèÛþìÞþîàöãÕóàÒûèÛüêÝúèÛþìÞÿîáüëÝóßÑóáÓúèÛøåØôáÔïÜÎìÙËïÜÎóáÔôàÒ÷åØûèÚøåØôáÓòßÑòßÑ÷ãÕ÷äÖòÞÐñÞÑõâÕõâÔúèÛúçÚòßÑóßÑùæØûèÛÿìÞúçÚñÞÐõãÖøæÙðÞÐìÚÌëÙËðÞÐôáÔöâÔõâÔòßÑïÜÎðÝÏòÞÐñÞÐïÜÎñÞÐóàÓöãÖóàÒìÚÌðÝÐóàÒõâÔôáÓòßÑðÝÏëÙËíÛÍðÝÏðÝÏñÞÐñÞÐñÞÐöâÕôàÓëØÊëØÊðÝÏòßÑñÝÏìÙËèÔÆëØÊïÜÎïÜÎîÛÍîÛÍðÝÏðÝÏîÚÌê×ÉéÕÇê×ÉìÚÌêÖÈäÑÃâÏÁæÓÅéÕÇïÜÎóàÒ÷ä×õâÔõãÕóßÑîÛÍêØÊèÖÈãÐÂðÝÏõáÓíÚÌïÜÎùçÙóàÓñÞÐóàÒúçÚþëÝýëÝýíßùæØëÙËåÒÄëØÊìÚÌíÚÌéÕÇëØÊõâÔùæÙøäÖðÝÐúçÙøåØóáÓöãÖ÷ä×òßÒïÝÏðÝÐîÛÍê×ÉìÙË÷ä×øåØøåØ÷åØôâÔòßÑòßÑóàÓòßÒñÞÐïÜÎë×ÊöãÖøåØùæÙõãÖðÝÏëØÊóßÑúçÚüéÛñÞÐñÝÏ÷ãÕþìÞùæÙ÷åØûèÛøåØñÞÐñÞÑñÝÐëØÊãÏÁãÐÂèÖÈðÝÐõãÕùæÙùæÙøåØùæÙúèÛþíßøæÙõáÓ÷ãÖùæÙõâÕöä×øæÙûèÛúèÚøåØóàÒðÝÏðÜÎôáÓõâÔôàÒñÝÏôáÓûèÚýîàûéÜöâÕóàÒïÜÎìÙËðÝÏ÷ä×ýêÜþìßúçÙôàÒòÞÐõâÔùæÙøåØõâÕóßÑóàÒóàÓñÞÐæÓÅíÚÌóßÑôàÓõáÓöãÕîÛÍëØÊëØÊòßÑøæØüéÛöãÖíÚÌçÓÅêÖÈëØÊêÖÈóàÒïÜÎðÝÏøåØøåØóßÒîÛÎøæØúçÚñÞÐîÛÍóàÒïÝÏñÞÐðÝÏîÛÍðÝÏôáÔèÖÈëÙËðÝÏóáÓôâÔôâÔðÝÏñÞÐìÙËíÙËñßÑñÞÐõáÓôáÓñÞÐïÜÎòßÒ÷äÖñÞÐíÚÌçÔÆãÑÂçÔÆíÚÌöãÖõâÕùæÙ÷äÖñÞÐòßÑóàÓõâÕ÷ãÖõâÔðÝÏíÚÌîÜÎóàÓïÜÏìØÊóàÓúçÚùæØ÷ãÖøå×øåØðÞÐäÒÄë×ÉöãÕüéÛ÷äÖóàÓôàÒøæÙúèÚýìÞÿðâþîàùçÙèÕÇë×ÉíÚÌñßÑùçÙþïá÷ä×ùæÙúçÚøåØ÷ãÖ÷ãÖþîàÿòåúçÚ÷ä×õâÔõâÔ÷äÖúèÚþëÞüêÜöãÕðÝÏõáÓôàÒõâÔ÷ä×öãÕôàÒñÞÐóàÓöãÕöä×öãÕôáÓóàÒñÞÐòßÑöãÖøæØøå×öãÕõáÔóàÓöãÕúçÙýêÝúçÚóáÓòßÑøåØúçÚ÷åØöäÖõáÔóàÒóàÓõâÔöãÕóàÒõâÔôáÔòßÑðÜÎîÚÌðÝÐê×ÉéÖÈòßÑùçÚûêÜüéÜùæØöä×öãÕñßÑëÙËîÜÎóàÒôáÓïÜÎñßÑøåØýëÞ÷ä×òßÑòÞÐòßÑðÝÏòÞÐöãÖöãÖíÚÌåÑÃá;êÖÈðÝÏóàÒúçÙþìÞýêÜùå×ñÞÐëÙËìÙËîÛÍðÜÎöãÕêÖÈæÒÄæÓÅèÔÆîÛÍíÛÍìÚÌðÝÏïÜÎêÖÈéÕÇæÓÅêÖÈíÚÌðÜÎðÝÏîÛÍðÝÏñÞÐïÜÎôâÕüëÞüëÝúçÚûéÛùæÙòßÑìÚÌéÖÈñÞÐôáÓúçÚýêÝ÷ä×îÛÍèÕÇõãÕþíàüêÜöãÕôáÓôàÒùçÚýïáüêÝòàÒèÖÈïÝÏ÷äÖùæÙòßÑîÛÍïÜÎ÷å×üëÝõâÔöãÖôáÔôâÕûéÛþíßÿïáûéÜòàÒëÙËòßÑóàÒôàÓòßÑîÜÎê×ÉíÚÌôáÓøæÙöä×óßÑñÞÐôáÓöäÖúèÚûéÛõâÔíÚÌéÖÈñßÑúèÚþìßúèÛõâÕøåØóáÓðÝÏñÞÐóàÒóàÓñÞÑîÜÎîÛÍñÞÐóßÑñÞÐîÜÎõãÕøåØóàÒìÙËçÓÅîÛÍîÛÍñÝÏøåØûéÜûèÛõâÕûèÛùçÚñÝÏîÛÍðÝÏúçÙòßÑìÚÌñÞÐ÷ä×úçÚüéÜùæÙ÷ä×÷ä×öãÖóßÑïÝÏíÛÍèÕÇïÜÎóßÑìØÊèÔÆïÜÎðÝÏìÙËñÞÑúêÜùçÙë×ÉçÓÅé×Éé×ÉëØÊèÖÈê×ÉñÞÑùæÙóàÒèÔÆæÓÅëØÊðÝÏôàÒöãÕøåØõâÔíÚÌéÖÈðÝÏõâÕöãÕøæØñßÑñÝÏ÷ä×÷äÖðÜÎîÛÍôàÓøåØ÷å×÷äÖøå×÷åØòßÒíÙËëÙËê×ÉèÔÆðÞÐíÛÍëÙËîÛÍòßÑöãÕýìßþîàÿîàûéÛõâÔñÞÐøå×òÞÐïÜÎñÞÐñÞÐíÛÍõâÔõâÕôáÓõáÓ÷äÖøçÙòßÑïÜÎìÙËîÛÍóàÒ÷ä×ùçÚûèÛüéÛûèÛøåØõâÔøæÙûèÛùçÚóàÒóàÒ÷æØøçÚùæÙõâÔðÝÏòßÑ÷å×øçÚ÷å×ùæÙôáÔðÝÏõâÔðÝÏõâÔøæÙõâÕñÞÐïÜÎïÜÎïÜÎòÞÐñÞÐîÜÎïÜÎ÷ä×õãÕóàÒòàÒòßÑðÝÐõáÔûèÚýëÞúçÙöäÖôáÓùçÙùçÙõãÕöäÖ÷ä×ïÜÎóàÓøåØöäÖ÷åØüêÜøæØûèÛøåØóàÓîÛÍñßÑ÷äÖìÚÌôáÓõâÔñÞÐòßÑñÞÐîÛÎõâÔ÷å×òßÑîÛÍíÛÍõâÔôàÒòßÑé×ÉäÐÂæÒÄëØÊôáÓúçÙöãÕðÝÐìÚÌñÞÐðÝÏðÝÏóßÑôâÔõâÔûéÛùæÙøåØøåØõâÔðÝÏïÝÏìÚÌíÚÌñÝÏëØÊâοåÑÃìÙËóàÓùæØþëÞÿðâöãÖê×ÉäÐÂíÚÌóàÒòàÒüêÜöãÖóàÓöãÖûèÛýëÝóàÒôáÔøå×þíàÿíßüéÜùæÙóàÓðÞÑôáÔöãÖôáÔòàÒïÝÏðÝÏøæØýìÞþîàùçÙîÛÍæÒÄê×ÉõáÓüêÝþíàøåØóàÒõáÓøåØùæÙúçÚüêÝþíßþìÞÿïáÿñãÿîàûéÛøåØúèÚüêÜûéÛûìßúèÚôáÓîÛÍïÝÏóáÓôáÓöãÖõãÕñÞÐïÜÎðÝÏìØÊê×ÉêÖÈðÝÏõâÔóàÒïÜÎôâÔ÷äÖôâÔòàÒóàÓöä×÷ãÖòàÒìÚÌê×ÉéÖÈñÞÐñÞÐïÜÎêØÊëØÊïÜÎôâÔúèÚÿðâÿõçÿïáúçÙöãÕûèÛûèÛôáÓíÚÌéÕÇöäÖüêÜúçÚñÞÐðÝÏóàÒ÷ä×ùæÙûèÛøåØòàÒìÚÌìÚÌóáÓ÷åØðÜÎë×ÉîÚÌôâÔõãÕðÞÐæÓÅçÕÇîÜÎòßÑòßÑïÜÎëÙËïÜÎôáÔòßÑóàÒôáÓôáÓõâÔõâÔñÝÏíÚÌìÙËðÝÏðÝÏîÛÍíÚÌê×ÉçÓÅèÔÆîÛÍôâÔõãÕïÜÎìÙËòßÒöä×õáÓóàÒòßÒõãÖúèÚúèÚöãÕêØÊéÖÈë×ÉïÝÏóàÒõâÔðÝÐóàÒùçÙûéÛõâÕíÙËåÒÄéÖÈïÜÎóàÒòßÑïÝÏòàÒïÜÎðÜÎöäÖûèÚûèÛ÷äÖöä×öãÖ÷äÖ÷åØöãÖîÜÎðÝÏôáÓúçÚûéÜúèÛøæÙõâÔóàÒõâÔõâÔóàÒë×ÉñÞÐðÝÏìÙËéÖÈâοïÜÏñÞÑñÞÐîÛÍïÜÎðÝÏîÛÍîÛÍëØÊëÙËîÜÎíÛÍìÚÌéÖÈäÑÃäÑÃê×ÉòÞÐ÷ãÖóàÒðÝÏïÜÎóàÒ÷å×ûéÜùæØúçÙõâÕõãÕüíßüéÜ÷ä×úéÛþîàüêÝüêÜïÜÎôáÓøæØùæÙ÷ä×õâÕüêÜøåØôáÔôáÓöäÖùæÙðÝÏëÙËëØÊðÝÏòßÒñÞÑíÚÌðÝÏóàÒøåØùæÙ÷ä×õâÕîÛÍéÕÇíÙÌ÷äÖþìßôàÒïÜÎîÛÍóàÒöâÕõãÕõâÔ÷åØøåØùæÙúçÙúèÚòßÒñßÑòßÑõâÔøå×úçÚüêÜõãÕîÚÌèÔÆèÔÆçÓÅíÛÍñÞÐòßÑïÜÎòßÒúçÚîÜÎïÜÎðÝÏòßÑñÝÏîÛÍóàÒóàÒíÙËåÒÄê×ÉôáÓøçÙøæÙøä×÷ä×ôâÔòßÑòßÑùæØúçÚïÝÏê×Éê×ÉçÔÆïÝÏøåØûéÛòàÒèÔÆìÚÌ÷ä×ýëÝøåØõâÔ÷ãÕîÛÍíÚÌðÝÏõâÕõâÔñÞÐñÞÐõáÔõáÓñÞÐïÜÏñÞÑóàÒûèÛýëÝýëÝüêÜóàÒáÎÀçÕÇíÚÌñÞÐôáÓ÷ä×ýìßþïáÿîàôàÓíÛÍñÞÐúçÙóàÒñÞÐøæØüêÜûèÚòàÓïÜÎîÛÍòßÒøæØüêÜüíàøåØûèÚýíßüéÛüêÜüëÝòßÒíÚÌíÚÌîÛÍôáÓíÛÍðÝÏôáÓûèÚýëÝýêÜíÙËîÚÌ÷äÖþíßüéÜùæÙôáÔîÛÍëØÊñÞÐõâÔõâÕóàÓóàÓñÞÐôâÔ÷äÖòßÑôáÓòßÑóàÒøåØúçÙøå×÷ãÖñÞÐñÞÐùæÙøå×ðÝÏóàÓóàÒòàÒóàÓòÞÐîÛÍúçÚüêÜþëÝüéÜûèÛüéÛþëÝûèÛ÷åØöãÕôáÓñÞÐóáÓ÷äÖôàÓêØÊëØÊòàÒ÷ä×õáÓðÝÏíÚÌñÞÐöäÖýìÞýêÜ÷ä×óáÓ÷å×ýêÜýïâøçÙñÞÐïÝÏôâÔùçÙùæÙùæÙõâÔïÜÎðÝÏôáÓôáÔúèÚþìÞùæØòßÑîÚÌòÞÐöâÔ÷äÖöä×øå×ûéÛôáÓñÞÐñÞÐòßÑòßÑðÝÏñÞÐ÷å×úçÚùçÚùçÙûéÛñÞÑóàÓõãÕùçÙùçÙ÷äÖðÜÏòßÒóàÒñÞÐïÜÎðÝÏðÜÎóáÓøæØøåØøå×ýêÜ÷äÖ÷ãÖøå×÷å×ïÝÏçÔÆèÕÇéÕÇëØÊòßÑõáÔõâÕòßÑîÛÍìØÊïÜÏðÞÐïÜÎöãÕôáÔðÝÏëØÊê×ÉìÚÌ÷äÖøåØúçÚýëÝüêÜùæÙèÔÆëØÊöãÕûèÛùæÙüéÛöãÖóßÑðÝÏñÞÐðÝÏìØÊòßÑõâÔñÝÏïÜÎðÝÏíÚÌåÒÄé×ÉíÛÍîÜÎìÙËêÖÈíÙË÷ãÕùæØìÚÌçÔÆèÕÇê×ÉãÐÁáÏÀéÕÇðÝÏòßÑøåØùæÙ÷äÖóàÒöãÖûéÛþìßöãÖîÛÎîÛÎñÞÑóßÑöâÔúçÚûéÛ÷å×óàÒñÞÐñÞÐôáÓôàÒòßÑøå×þðâýëÝùå×øå×ýëÝýëÞøä×îÚÌñÞÐóáÓòßÒïÜÎìÙËóàÒîÜÎðÝÏúéÛýîàýëÞöãÖüéÜüéÜöãÖõâÔøæØøäÖñÝÏñÝÏùæÙýëÝûèÛüéÜúçÙ÷ä×õãÕõãÕõâÕêÖÈíÚÌóàÒüêÜþìÞûèÛñÞÐìÙËðÝÏõáÓôàÒöãÖúèÚúçÚöâÕñÞÐñÞÐóàÓòßÑïÜÎïÜÎøæØýëÝùçÚñÞÐòßÑîÛÍçÓÅéÖÈðÝÐóàÒôáÔöãÖöãÕðÝÏéÖÈðÝÏòÞÐêØÊæÓÅíÛÍñÞÐôáÓûéÛõâÕíÚÌïÜÎðÝÏïÜÏìÙËìØÊñÞÐôáÓôàÓôáÓïÜÎìÙËíÚÌíÚÌëØÊèÕÇëØÊîÛÍéÕÇæÒÄíÚÌíÚÌëØÊîÛÍôáÓòàÒìÚÌïÜÎíÚÌðÜÎõâÕòàÓëØÊìÚÌîÛÍíÚÌéÖÈêÖÈìØÊêÖÈíÚÌöãÖïÜÏê×É÷å×öâÔ÷ãÕöâÕôàÓòßÑðÝÏ÷ä×ùæÙøåØòàÒòßÒôáÔñÝÏôáÓøæØüéÛüêÜûéÛøåØóàÒóàÒûèÛþëÝûéÛëÙËéÖÈëØÊóàÒóàÒîÚÌéÖÈðÝÐùæÙþíßúèÚóàÒíÚÌðÝÏöãÖûéÛüêÜûèÛöãÕôáÓöä×úèÚúçÚúçÚÿïáûéÛöãÕõâÔùçÚýêÜûèÚùæÙöãÖ÷ä×úçÚüêÜ÷ä×ûéÛûèÚòßÑñÞÐôâÔôàÒñÞÐïÜÎíÚÌïÜÎñÞÐõâÕôâÔòßÑñÞÐòßÑóàÒòßÑñÞÑóßÑôáÔðÜÏé×ÉïÛÍðÜÎîÜÎðÝÏôáÓùæÙöãÖûèÚ÷äÖðÜÎðÜÎìÙËìÙËôáÔúçÚ÷ä×ñÞÑíÚÌðÝÏöãÖóàÒðÝÏøå×ûëÝúìÞïÜÎåÒÄáÎÀäÐÂïÛÍõãÖñÝÏìÙËêØÊé×ÉèÕÇóáÓøå×ôàÓîÛÍîÛÍê×ÉæÓÅìÚÌíÚÌæÒÄéÕÇñÞÑìÚÌçÔÆäÑÃéÖÈïÜÎóàÓðÝÏòÞÐôáÓúçÙûèÛúçÚóßÑòßÑõáÔõãÖôáÔ÷ä×ûèÛùæØõâÕñÞÑîÛÍìØÊñÞÐõáÔùçÙùçÙòßÑê×ÉðÝÏðÝÏñÞÐõáÔùçÚýëÝþíßþïáÿîàþìßøå×ðÝÏëÙËê×ÉëØÊòÞÑ÷å×úçÚõâÕøå×ûêÜþðâÿïáýëÞíÛÍîÛÍñÞÐøæÙüêÜýëÝÿíßýëÝøæÙùæØùçÚöãÕõãÕûêÜýìÞøå×óàÓóàÓóßÑòßÑòßÑóàÒõâÔõâÕóßÑîÛÍìØÊíÚÌíÚÌê×ÉðÝÏñÞÐïÜÎîÛÍñÞÐôáÓòßÒðÝÏïÜÎòßÑòßÑïÜÎøå×ùæÙõáÓèÔÆãÏÀãÐÂáÍ¿ê×ÉõãÕüéÜûéÛøæØêÖÈìØÊëØÊæÓÅäÑÃäÐÂéÖÈñÝÏ÷ä×ûèÛüêÜüëÝñÞÐóàÒóàÒñÝÏñÞÐóàÒõâÔôáÓòßÑïÝÐïÜÎîÛÍ÷ä×õâÕóàÒòÞÐñÝÏïÜÎùæÙõâÕë×ÉêÖÈïÜÎìØÊõâÔóáÓðÝÏìÙËíÚÌïÜÏîÛÍìÙËèÔÆáÎÀß̽à̾áÍ¿á;æÒÃðÞÐñÞÐëÙËíÛÍïÜÎîÛÍñÞÐ÷äÖöãÕ÷ä×öãÕôàÒñÞÐîÚÌê×ÉðÝÏôáÔùçÙüêÜúèÚ÷ä×÷ä×õãÖôâÔôàÒôáÓôâÔþìÞþíßûéÜôáÓïÜÏíÚÌ÷å×÷ä×õâÕôâÔøæØýêÜûéÛóáÔïÜÏõãÕýêÝÿñäüêÜøæØõâÕöä×øæØøæØÿîàüêÜöä×÷ä×ùæÙ÷äÖíÚÌòßÑóàÒîÛÍíÚÌðÝÏúçÙöâÕðÝÏîÛÍñÞÐôàÒôàÒìÚÌëÙËóàÒ÷äÖôáÔ÷ä×÷ä×õáÓðÝÏðÝÏôáÓùçÙöãÖôáÓòßÑðÝÏîÛÍìØËðÝÐìÙËáÎÀáÍ¿æÓÅæÔÆíÚÌõãÖúçÚõâÕïÜÎìÙËëØÊïÜÎîÛÍê×ÉíÚÌñÞÐòßÑóàÒôáÓ÷ãÖøæÙðÝÏíÚÌòßÑ÷å×öãÖøåØûéÜþìßúèÛøæÙùçÙôáÓñÞÐõâÕúçÚüéÜúçÚùæÙïÜÎçÔÆèÔÆîÜÎïÜÎôáÔòàÓîÛÍíÚÌñÞÐíÛÍæÓÅïÝÏ÷å×üéÜøå×óßÑðÜÏñÞÑîÜÎîÛÍïÛÍêÖÈãÏÁèÔÆïÜÎèÔÆáÎÀæÒÄæÒÄçÔÆéÖÈîÚÌóáÔñÞÐìØÊìÙËóßÑôáÔðÝÏòßÑ÷ãÖÿîàÿìßüéÛøåØõáÔóßÒîÚÌðÝÏðÝÏïÜÎóßÑøåØûèÛþìÞþëÝûèÛúèÚýëÝüéÛõâÔïÜÎïÜÎòßÑóàÓúçÙùæÙõãÖóàÒõâÕùæÙïÜÎëÙËìÚÌóßÑõâÕùæÙÿñäûèÛ÷ä×ûèÛüêÜûéÛùæÙúçÚúèÛüêÜþëÝÿíßõâÔõáÔôàÒõáÓøå×ûéÛõâÕôâÔñßÑïÜÎðÝÏóßÑôàÒõãÖòßÒê×Éê×ÉñÞÐé×ÉäÑÃáÎÀçÕÇòßÑøåØ÷ä×ñßÑëØÊê×ÉïÛÍõáÔóáÔòßÑ÷äÖùæÙöä×øåØ÷åØóàÓíÚÌéÖÈçÓÅæÒÄðÝÏïÜÏõãÖ÷å×íÛÍçÓÅìØÊñÝÏðÝÏòßÒöäÖôáÔîÜÎóàÓ÷ä×øä×÷äÖøåØ÷äÖôâÔøå×öãÖîÛÍê×ÉêØÊïÜÎóàÒóàÒñÞÐïÜÎîÜÎóßÑõâÔõâÔóáÓóáÓùçÙùæÙõáÔìÙËçÓÅäÒÄåÒÄëØÊêÖÈèÕÇëØÊìÙËß˽à̽äÑÂíÚÌíÛÍéÖÈâÏÁèÔÆíÚÌòßÑôáÔöâÕùçÙüêÜÿìÞýêÜøæÙôàÓèÔÆíÛÍòßÑõâÕöäÖøå×õâÔøå×øå×óáÓðÞÐîÛÎòàÒòßÑòßÑïÜÎêÖÈâÏÁëØÊòßÑôàÓðÝÏòßÑùæÙòßÒðÜÏòßÒøå×úçÙüêÜùéÛ÷äÖ÷ãÖúçÚ÷å×ñÞÐúçÚþëÝÿïáÿðãþìÞüéÛúèÚûéÛøå×òßÑñÞÐóàÒîÜÎìÙËëÙËïÜÎòßÑòßÑñÞÐôáÓõâÔóàÓõâÔøåØíÛÍêØÊìØÊõâÕùæØöãÕîÜÎê×ÉâÏÁÞʼæÓÅóàÒðÝÏñÞÐóàÒ÷ä×øåØöãÕôàÓðÝÏíÛÍîÛÍîÚÌìØÊôáÔöäÖúçÚúèÚõâÕîÛÎçÔÆê×ÉíÛÍïÜÎìÙËéÕÇöãÖ÷ä×öãÕòßÑóàÒõâÕùçÙþëÝúçÚöâÕôàÒìÙËîÛÍòÞÐõáÓõáÓóàÒòßÑôàÒõáÓôàÒñÞÐïÜÎìÚÌëØÊñÞÑðÝÏèÔÆèÕÇïÜÎðÜÎïÜÎòÞÐøå×øå×õáÓóàÓïÛÍïÜÎ÷ä×úèÚùçÙóàÒíÚÌïÜÎüëÝþðâýëÝöãÖøåØùæÙøåØõâÔòßÑíÚÌïÜÎðÝÏñÞÐñÞÐðÝÏìÙËïÜÎòßÑóàÓóáÔòàÓðÝÏòßÑôáÔ÷ä×õâÔñÝÏïÜÏúçÚûéÛîÚÌê×ÉïÜÏóàÒóàÓñßÑóàÒóàÒïÝÏòßÑöâÕùçÙüéÜûéÛúçÙöä×÷ãÕöãÕùçÚýëÞþîáÿòäÿïáþíßûèÚøæØõãÖõâÕîÜÎíÚÌôàÒöãÖôàÒñÞÐðÝÏõáÓûéÛøå×ðÝÏìÙËïÜÎôáÔöãÖòßÑëØÊðÞÐôáÔñÝÏåÒÄäÐÂëØÊòßÑôâÕóàÒøæØüêÜ÷ãÕñÞÐðÝÏôáÔúçÙüèÚúçÙúèÚöãÖíÚÌïÜÎúçÙýìÞòàÓñÞÐöãÕøå×õâÕøå×ÿïáúçÚòßÑðÝÏôáÓùçÙïÜÎöãÕüéÜòàÒê×ÉîÛÍèÕÇíÚÌñÞÐîÛÍíÚÌîÛÍðÝÏñÞÐðÝÏñÞÐõâÕõâÔîÜÎòÞÐõâÕøåØùæÙøæÙöãÕýêÜýëÝôàÓòßÒ÷åØûéÜûéÛúçÙöãÖóàÒñÞÐðÝÏôáÓóàÒ÷ãÕýëÞýëÝðÝÏñÞÐóàÒõâÕ÷ä×øåØùåØøå×ùæÙýêÜþëÝýëÝþìßûèÛøå×ùæØýëÝþîáþìßúèÛýìÞÿòäÿîàüéÜöãÕýìÞþìÞôàÒðÝÏóáÓíÚÌíÛÍõãÕ÷å×óßÒôáÔøåØ÷ä×ùæÙþìÞÿîàÿíàýîàýëÞüéÛöä×ôáÔóßÑôâÔ÷ä×ûéÛþîáýìÞùçÚøæÙýìÞüëÞöâÔ÷ãÕûìßõáÓõâÔõáÓõáÓòßÑïÜÎöãÖüéÜùçÙîÛÍîÛÍöãÖùçÙ÷ä×ôáÔóàÒôáÓöãÕöãÖøå×óàÒñÞÐóßÑðÝÏðÝÏóàÓ÷ä×÷ä×ôáÓðÝÏòÞÐìÚÌèÔÆéÕÇêØÊêØÊùçÚýëÞþîáþíàþíàÿíàöãÕõâÔóßÑñÝÏîÛÍìÙËìÙËê×ÉíÛÍñÞÐñÝÏóàÒøå×óàÒðÝÏóàÒõáÓóàÒòßÑïÜÎðÝÏðÝÏñÞÐôáÓüêÝöãÕîÜÎîÜÎöãÕüêÜüêÜüéÛùæØöãÖøæÙüéÜüêÝüêÝúèÚóáÓñÞÐñÞÐöäÖùëÝùéÛ÷äÖ÷äÖôâÔ÷ä×óàÓïÜÎíÚÌòßÑùçÙùæØ÷ãÖöãÕ÷äÖöäÖôâÔ÷äÖóàÓðÝÐôàÓ÷åØùæÙýìÞÿòäþïáùçÙùçÚüêÝþëÞûèÛùçÚûèÚ÷äÖñÞÐñÞÐöâÕúçÚûèÛ÷ä×ôàÒ÷ä×öä×÷ä×ùæÙûéÛýêÜ÷ä×÷åØõáÓðÝÏðÝÏñÞÐïÜÏöäÖûéÛûèÛüêÜþíßþëÝÿðãÿñäúèÚðÝÏê×ÉõâÔøæØøæØöä×öä×ùçÚþðâüêÝ÷äÖõáÓôàÒóáÓîÛÍïÜÎõâÕüéÜøå×îÜÎîÛÍðÝÏïÜÎîÛÍðÝÏóàÒóàÒöâÕùçÙûèÛøæØöãÕðÝÏñÞÐñßÑñßÑðÝÏîÜÎôâÔôáÔõãÕ÷å×ùæÙøå×ê×ÉòßÒùçÙøå×ðÝÏèÔÆæÒÄæÒÄíÚÌ÷ä×ùæÙ÷ä×úçÚôáÓïÜÎðÝÏñÞÐïÜÎîÛÍê×Éê×ÉêØÊíÚÌñÞÐùæÙôáÓíÛÍíÚÌòßÑöä×ùæÙôáÓòßÑôáÓõâÕòßÑôàÒöãÕõâÔñÞÐóßÑöãÕÿïâÿôçþïáóàÒîÜÎîÛÍóàÒôáÔóàÒðÝÏòßÑ÷ä×þìßùçÙóàÒïÜÎíÚÌêØÊðÝÏíÚÌíÚÌóàÒöãÖöâÕöãÕöäÖòàÒíÚÌïÜÎðÝÏóáÓìÙËíÚÌúçÙüêÜöâÔûèÚüéÜ÷ãÕõâÕúçÚøå×÷ä×øåØöä×óàÒõâÕùæÙùçÙúçÚ÷ä×ñÞÐñÞÐôáÔüêÝûèÛúçÚüêÜüéÛùæØ÷ä×òàÓðÞÑñßÑîÛÍéÖÈïÜÎôáÔúèÚüéÛüêÜüêÜûëÞõâÕðÝÏòßÑòßÑîÛÍíÚÌìÚÌïÜÏöãÕöãÕðÞÐðÝÏóàÒùçÙõâÔðÝÏôàÒýêÜþëÝýëÝûéÛøå×õâÔõáÔûéÜýîàüëÞøåØõãÕöãÖñÞÐðÝÏöãÖøåØöãÖùæÙûèÛüêÜøåØòßÑìÚÌíÚÌñÞÑñÞÑîÛÍðÝÏóßÑòßÑ÷å×øåØòÞÐîÛÍîÛÍíÚÌîÛÍìÙËíÛÍòßÒóàÒðÝÏóßÒöãÖøæØ÷åØöãÖõáÔóßÑôâÕùæÙôàÓéÕÇíÚÌîÛÍðÜÎóßÑ÷äÖûéÛûèÛôàÓðÝÏõâÔ÷å×úçÚñÞÐöâÕøä×÷ä×öãÕöâÔöâÔñÞÐîÛÍñÞÐöãÕ÷ä×ôàÒôàÓöâÕ÷åØ÷ä×õâÔðÝÏéÖÈëÙËóàÓöãÕ÷å×òàÒíÙÌëØÊòßÑ÷äÖöä×üêÜûèÛôáÔñßÑ÷äÖöäÖ÷ä×÷äÖòßÑìÙËêØÊëÙËïÜÎðÝÏïÜÎíÚÌïÜÎñÞÐõãÕñÞÐîÛÍëØÊéÕÇæÒÄèÕÇâÏÀáÎÀîÜÏøæÙüêÜöãÕïÜÎëØÊîÛÍìÙËæÒÄãÐÂê×ÉòÞÐôáÔñÞÐîÛÍòßÒóàÓïÜÎé×ÉíÛÍõâÕðÝÏðÝÏ÷äÖøåØöãÖûèÛöãÖõâÕòßÑîÛÍëÙËêØÊöäÖüëÝþïâýëÞùæØöâÕóàÒóàÒðÝÏìÙËîÛÍóßÑðÝÐòßÒõâÕöãÖöãÖõâÕõáÔ÷ä×îÛÎæÒÄêÖÈîÛÍìÚÌñÞÑóàÓïÜÎíÚÌíÚÌñÞÐóàÒòßÑóàÒõâÔôáÓóßÑöãÕúçÚüêÜúçÚ÷äÖîÛÍîÛÍðÜÎñÞÐîÛÍêÖÈãÐÂâÏÁåÑÃíÚÌôàÓ÷äÖôáÓê×ÉìÙËöãÕ÷å×öãÕîÛÍîÜÎðÝÏ÷äÖüéÜýëÝûéÛøå×õâÔóßÑðÝÏìØÊïÜÎõâÕúçÚûèÛúèÚùæÙüéÛøæØùæØúçÚûèÛýëÝýíßùæØòßÑòßÑõâÕùæØùæÙùæÙ÷ä×õâÔôàÒòßÑîÜÎðÝÏñÞÐñßÑñßÑðÞÐðÝÏðÝÏòßÑ÷äÖ÷äÖõâÔìÚÌðÝÏðÝÏëØÊëØÊïÝÏöãÕóàÓòßÒôáÔõâÕõâÔôàÒìÙËæÓÅçÔÆéÖÈê×ÉíÚÌïÜÎïÜÎîÛÍîÛÍîÛÍõâÕøåØôáÔíÚÌìÙËðÝÏõãÕòßÑðÝÏñÞÐòßÑñÞÑðÝÏïÜÎïÜÎðÜÎòßÑôáÓôáÓöãÕ÷ãÖ÷åØ÷ä×öãÕùçÚûéÜøåØðÝÏðÝÏöãÕçÓÅçÓÅèÔÆíÚÌñßÑõãÖòÞÐôáÓðÝÏîÛÍóàÒóàÒöãÕñÞÐðÝÏôáÓöãÖöãÖòßÑòßÑóßÑñÝÏíÚÌìÚÌñÞÐõâÕùæÙøåØñßÑê×ÉðÝÏïÜÎíÚÌìÚÌñÞÑøæØ÷åØðÝÐìÙËîÛÍïÜÎë×ÉâÏÁæÔÆñßÑôâÔòßÑöãÕõâÕòÞÐðÝÏôàÒóàÒíÚÌïÜÎòßÑöãÖùåØôáÓíÙËöãÕüêÜþëÞõâÕïÜÎîÜÎóàÒøå×øåØùæÙýìÞÿðâüêÝõâÕñÞÐöãÕüëÝþðâýêÝ÷ãÖöãÖôàÒóßÑ÷äÖúçÙúçÙûèÚýêÜùæÙóáÓüéÛùçÙúèÚþëÝúèÛóàÒðÝÏðÝÏóßÑøåØùçÙ÷ä×ùæÙûéÛûèÛ÷ä×õãÕõâÕóàÓùæØùçÙòÞÐðÝÏôáÔïÛÍèÕÇäÑÃê×ÉðÝÏôáÓúèÚøåØõáÓòßÑïÜÎíÚÌñÞÐóßÒóßÑ÷ä×ôáÔèÔÆìÚÌìÚÌíÚÌðÝÏõáÔøåØöâÕóßÑòÞÐøåØýëÞþíßþíàøåØôáÓôàÓñßÑíÙË÷åØöâÕðÝÏôáÓüêÝüêÜóáÓîÜÎîÜÎóàÒöâÔôáÓôáÔòàÒðÝÏñÞÐôáÓöãÖõâÔûéÛüéÜ÷äÖõâÔòßÑöâÕôáÓòßÑòßÑóàÓõâÔóáÔõáÔöâÔíÚÌèÔÆíÚÌöä×÷åØúçÚúçÙóàÒêÖÈ÷ä×ôáÓðÝÏïÜÎòßÑõâÔúçÚöãÖóàÒôáÓõâÔôáÓöäÖúæÙþíàÿ÷éÿ÷êÿñäÿñãþìÞûèÚôáÔëØÊãÏÁìÚÌíÚÍíÚÍðÝÐôâÕóàÒõâÔ÷ä×úçÙòßÒîÜÎ÷ä×üëÞøå×ôâÔøæÙýëÞýíßúçÚûèÛûêÜüìÞüëÝüêÜöãÖ÷åØ÷å×÷åØûéÛÿíàûéÜûèÛúèÚüéÜûèÛùæÙöãÖõâÕ÷ä×ûéÛüéÜúçÚùæØóàÒóßÑðÝÏíÚÌðÝÏôáÓøå×ùçÚöâÕóàÓóàÒóàÒøæØûéÜ÷ãÖñÞÐîÛÍéÕÇñÞÐôáÔöãÖõãÕïÜÎóàÒïÝÏñßÑøåØøåØòàÓñÝÏñßÑ÷å×ýìÞýìÞûéÛôáÓëØÊéÕÇòßÑõâÔòßÑøå×ñÞÐëØÊìÚÌñÞÐóáÓôáÔõâÔõâÕôáÔñßÑïÝÏîÛÍðÝÏïÜÎïÜÎòßÑõâÔýíßúèÚûèÚþìÞüéÜúçÚõâÔôáÓòßÑóàÓõâÕ÷äÖíÚÌïÜÎöãÕöâÕïÜÎíÚÌôâÔøå×ûèÛýëÝûèÛùæØïÜÎñÞÐñÞÐòßÑóàÒóàÒúèÚùæÙ÷åØúçÚüêÜþíßÿòäÿïáýëÞúíßüðãÿóæÿóåþìÞøå×òßÒñÞÑòÞÐöäÖúèÚûëÝôàÓìÙËíÛÍûéÜýìÞÿíßüêÜøå×õâÔ÷ãÖúçÚýëÝüêÜöäÖòÞÐýêÜÿíßÿðâÿðãýìßûéÛðÜÎ÷ãÖúèÚøæÙúæÙýìÞÿîàýëÝ÷ä×óàÓ÷ä×üéÛôàÒôàÒôàÒôáÔõâÕõâÕòßÑîÛÍðÝÏôàÒòÞÐòßÑöäÖøæØúèÚûèÚùæÙ÷ä×óàÒóàÓñßÑîÛÍïÜÎòßÑõâÔôàÓîÚÌîÜÎõâÕ÷åØøåØúçÚ÷åØðÝÏíÚÌíÙËîÚÌõâÔúèÚøæÙóàÓðÝÏðÝÏ÷äÖüêÝýìÞýëÝýìÞøå×òßÑóàÒôáÔòßÑöãÖùçÙóßÑëØÊæÓÅãÐÂà̽çÓÅíÚÌñÞÐôàÒøåØüêÜ÷åØïÝÏìÙËîÜÎîÜÎïÜÏòßÑôàÒõâÔõãÖôáÔóßÑìÚÌêØÊîÛÎ÷ãÕ÷ä×óàÒïÜÎòßÑóàÒñßÑñÞÑôáÓòÞÐôàÒôâÔõáÓòßÑðÝÏôáÓöäÖ÷ä×÷åØúçÙýìÞþíßýìÞ÷ãÕëÙËçÔÆèÕÇöå×ùçÚúçÚüéÛþîàÿõçþîàýëÝüëÝùçÙôáÔóáÓøå×þìÞüéÜùæÙöãÕîÜÎöãÖûéÛýëÝøåØóßÒðÝÏùæÙûèÛûéÜúçÚöãÖóàÒñÝÏòßÑñÞÐòßÑõâÕúçÚöãÕ÷åØôáÓìÚÌîÜÎöâÔúçÙüèÚùæÙóßÑïÜÎîÛÍæÓÅæÓÅìÙË÷ä×ùæØøå×òÞÐíÙËêÖÈíÙËïÜÎïÜÎôâÕôáÓòÞÐñÝÏõáÓúçÙöãÖöãÖóßÑðÞÐðÝÏîÜÎõáÔùæÙ÷åØòßÑ÷äÖüíßûéÜ÷äÖïÜÎéÖÈìÙËïÜÎíÚÌðÝÏóàÒøå×úçÚúçÚôáÔõâÕûèÚ÷äÖíÚÌë×ÉìÙËê×ÉéÖÈë×ÉîÛÎðÝÏæÓÅê×ÉíÛÍðÝÏóàÒöâÕóàÒóàÒíÙËäÑÃæÓÅèÔÆîÛÍìØÊéÖÈèÖÈê×ÉìÙËïÜÎìÚÌíÚÌõáÓùæÙõãÖðÜÎñÞÐðÝÏìÚÌîÛÍñÞÐùæÙøåØöä×õãÖ÷ãÕ÷äÖñÞÐöãÖùæÙöãÖóßÑòÞÐêØÊðÝÏñÝÏèÖÈçÔÆêÖÈà̽äÑÃèÖÈíÚÌôáÔûéÛÿóåøå×ïÜÎ÷å×ÿîáÿíßôáÓüêÜúçÚöâÔøåØùæÙõãÕøåØùæÙøåØ÷åØùæÙôáÓóßÑòÞÐôáÓøåØûèÛ÷åØðÞÐïÝÏøæØüêÜ÷å×öãÕüìÞþñäûéÜôâÔñÞÐúèÚüìÞýìÞøå×óßÑðÝÏïÝÏðÝÏñÞÐóàÒôáÓñÝÏóàÒðÝÏíÚÌíÚÌìÙËéÕÇé×ÉîÛÍòÞÐòÞÐñÝÏòÞÐîÛÍíÛÍïÝÏñÞÐóßÑõâÔúçÚùåØøä×øåØ÷ä×õâÕûèÚôáÔìØÊæÒÄê×ÉïÜÎíÚÌíÛÍíÚÍìÚÌîÛÍðÝÏèÕÇîÛÍòßÑðÝÏîÚÌìØÊïÛÎõâÕùçÙ÷ãÖøåØûéÛöäÖóáÓñÞÐòÞÐòÞÐðÝÏóßÒùæÙùæØõãÕôáÔóáÓêÖÈèÕÇæÓÅçÔÆéÖÈìØÊñÞÐôáÓòßÑñÞÐôáÓòßÑ÷ãÖöãÕöâÕ÷äÖùæÙûèÛùæÙ÷åØõãÖ÷åØúçÚýêÝøä×ùæÙùæÙöãÖòßÑïÜÎéÕÇìÙËìÚÌêØÊíÚÌòàÒóàÒóàÒòàÒôâÔ÷äÖùæÙøèÚöãÕñÝÏôàÒûéÜÿìÞþìßûéÛøå×öä×öâÕôáÔñÝÏôàÒ÷ä×úçÚúçÚùæÙñÞÐîÛÍëÙËðÜÎ÷äÖýìÞÿñäüëÝûéÛüéÜ÷å×ðÝÏëØÊîÜÎõâÔùçÚ÷ä×òÞÐê×ÉíÚÌðÝÏòÞÐñÞÐïÜÎûèÛýêÜ÷ä×ðÝÏîÜÎìØÊóàÒöâÕøä×õâÔïÜÎê×ÉæÓÅìÙËñÞÐñÝÏïÛÍïÛÍ÷ãÕðÝÏîÜÎïÜÎñÞÐøåØöãÖóàÒñÞÐôàÒôáÓòÞÐõáÓøå×ùçÙøå×öãÕöãÖòßÑúæÙûèÛóàÒïÜÎðÝÏñÞÐõâÕðÝÏîÛÍõâÕøåØøä×øä×öâÔóàÒõâÕøæÙüéÜôáÓïÜÎñÞÐðÝÏìÚÌåÒÄê×ÉõãÕþëÝùçÚôáÔñÞÐîÛÍëØÊîÛÍõâÔûèÚùæÙûèÛñÞÐèÕÇîÜÎóàÒøåØöâÕõáÓøåØùæÙ÷äÖùæÙøåØöä×õãÖöãÖ÷åØûèÛöãÖóàÒòßÒñÝÏîÛÍìÙËðÝÏôáÓóáÔôâÔöãÖûéÛýëÝþíßþîàùæØñÝÐéÖÈñÞÐùæØ÷ãÖõâÔøåØñÞÑäÑÂçÓÅóàÒñÞÐëÙËñÞÐïÜÎðÝÏöâÕúçÚúçÚüìÞùæØóáÔóàÒøåØüêÜùèÛúèÚøå×óàÓôâÔøæØøçÚîÜÏëØÊñÞÑôáÓðÜÎñÞÑðÜÎñÞÐöãÖúèÚûèÚõâÔûèÛ÷äÖòßÑöäÖùçÙüéÛþëÝýêÜùæÙøåØúçÙõâÕøå×øåØøåØúçÙýêÝðÝÐòßÒúèÛûéÛõâÔóàÓîÜÎòÞÐõáÔ÷äÖ÷ãÖ÷ä×ðÝÏìÙËìØËôáÔúçÚüéÜúçÙùæÙøæÙ÷å×óáÓîÛÍùçÚöãÖóàÒóàÒôàÓóßÑðÝÏóàÒøåØûéÛöãÕïÜÎïÜÎìÙËê×ÉãÏÁà̾çÕÇæÓÅéÕÇìÙÌòÞÐõáÔøä×ñÞÐîÚÌóàÒùæØöãÖõâÕòàÒñÞÐòßÑôáÓóßÒðÝÏîÛÍñÞÐöãÖùçÙùæÙ÷äÖøåØõâÔöãÕ÷ä×÷åØúèÚ÷ä×ôáÓõáÓúçÚýêÝüêÜþíß÷å×öäÖþîàÿòäþìÞüêÝýìßýîàýñäýîàòßÑêØÊäÑÃëØÊòàÓë×ÉâÎÀãÐÂèÕÇìÚÌõãÕùçÚõãÕñÞÐóàÒóáÓóáÓóàÒñÞÐöãÖ÷ä×÷åØ÷åØ÷ä×öãÖôáÓøä×ùæÙøæÙùçÚüéÜýëÝôâÔîÛÍñßÑøæÙýëÝüêÜúçÚøåØùåØ÷äÖôàÒôáÔúçÙúçÙóßÑóßÑ÷ä×ñÞÐîÛÍïÜÎøåØüéÛúèÚóßÑðÝÏôàÓõâÕôáÔøæØüêÝöãÖöä×öâÔòßÑóàÒóßÑöâÕúèÚýìÞûèÚõâÔíÚÌìÙËðÝÏ÷ä×øæØöãÕúçÚòàÒòßÑóàÓðÝÏñÞÐýêÝúçÚúçÚúçÚõâÕïÜÎøæÙûéÛýëÝùæÙñÞÐéÖÈäÑÃâÏÁãÐÂâÎÀâÎÀèÕÇóàÓôáÓóáÓóàÒóàÒóßÑýëÝûèÚ÷å×ïÜÎéÖÈíÚÌ÷ä×ùæÙúçÚøæÙõâÔòßÑìÚÌñÞÐñÞÐîÚÍñÞÑøæØûéÛúçÚ÷ãÖøæÙûèÛøåØôáÔóàÒòÞÐôáÔøå×úèÚþíßþíßþïáÿïáýìÞùçÚòßÒóàÓñÞÑõâÕøæÙôáÔôáÓóàÒòßÑòßÒòßÒòßÑôáÓùçÙùçÙüêÜÿîàþìÞýêÝÿïâÿóåÿïáúèÚóàÓõãÕùæÙýêÝüêÝøåØóàÒ÷åØûéÛþëÝþëÝþëÝÿíàúèÚõáÔðÝÏòßÒ÷åØúéÜùæÙôâÔñÞÑòÞÐóßÑòßÑùæÙôàÒðÜÎñÞÐòßÑðÝÏíÚÌîÛÍðÝÏóàÒòßÑîÛÍôàÒòßÑôáÓóàÒïÜÎïÜÎ÷ä×óáÓøåØûéÛ÷ä×óàÒîÛÍðÝÏðÞÑòßÒôáÔöãÕðÝÏùçÚûêÜðÝÏîÚÌôáÓïÜÎðÝÏðÝÏìÚÌíÛÍöãÖõáÓ÷äÖ÷åØ÷ãÕöãÖöãÕõáÓõáÓòßÑìÚÍíÛÍðÝÏíÚÌîÛÍðÜÎíÚÌæÓÅãÐÂãÐÂçÓÅîÚÌôáÓ÷ä×øåØòßÑïÜÎëÙËçÔÆìÙËõâÔôàÒöãÕ÷å×õáÓôàÒôâÔõâÕõãÖñÞÑêØÊìÙËòßÑøå×õâÔñÞÐ÷ãÕüêÜúçÚîÛÍðÝÏðÝÏðÝÏñÞÐõáÓøæÙþíàÿïâúçÙôáÓòßÒïÜÎðÝÏîÛÍðÜÏ÷ä×üéÜýëÝþðâýìÞýìÞþòåÿóåýëÝþìßøæÙôáÓ÷ãÕ÷ãÕûèÚûéÜûêÜüëÝýëÞüêÝúèÚûèÛûèÛøæÙõáÓòßÑõáÔ÷ãÕ÷äÖ÷äÖøåØùçÚûéÛûéÛúçÙ÷äÖôáÓðÝÐðÝÏíÚÌëÙËïÜÎòßÑóßÑïÜÏîÛÍòÞÐùçÙõâÔìÚÌìÚÌòÞÐöâÕöãÕôáÓóßÑïÜÎëØÊèÕÇéÖÈìÚÌñÝÏúèÚ÷ä×ôáÔóàÒôáÓ÷ä×ôâÔöäÖöäÖñÝÏîÛÍíÛÍøåØúçÚøå×ïÜÎëØÊë×ÉèÕÇóàÒùçÙôáÔïÜÎñÞÑäÑÃðÝÏõãÕïÜÎîÜÎôáÔòßÑñÝÏìÚÌèÔÆëØÊïÜÎùçÙùçÙôâÕîÜÎéÖÈäÑÃçÓÅê×ÉíÚÌíÚÌê×ÉçÔÆèÔÆìÚÌóàÒúçÙùæØñÝÏìÙËïÜÎñÞÐóàÒøä×ýëÝþëÝøæØ÷ä×üêÜýëÝúèÚïÜÎïÜÎôáÓöä×óàÒðÜÎõáÔúèÚþëÝýêÝúçÚúçÚïÛÍõáÔõâÕíÚÌìÙËïÜÎøåØ÷äÖòßÑêØÊçÔÆê×ÉöâÕùçÚùæÙùæÙøæØïÜÎøåØýëÞýëÝùæÙùæÙõâÕèÔÆèÔÆêÖÈðÝÏøå×ýíßýëÝöãÕìÚÌéÕÇíÚÌñÞÑôáÓðÝÏíÚÌìÙËîÛÍïÜÎûèÛüêÜüêÜøæÙõâÕóàÒôáÓñÞÐïÜÎïÜÎíÚÌêÖÈåÑÃíÙËòàÓòßÒíÚÌéÖÈðÝÏóàÒòÞÐíÚÌíÚÌðÝÏïÜÎðÝÏîÛÎîÜÎñÞÑóßÑíÙËëØÊåÒÄäÑÃé×ÉîÜÎòÞÐöãÕ÷äÖôàÓòßÑóàÒøæØòßÒîÛÍïÜÎîÜÎìØÊñÞÐöâÕúçÙúèÚóàÒèÔÆçÔÆîÛÍóàÒðÝÏíÚÌìÚÌòÞÐòÞÐðÝÏíÛÍêØÊèÔÆëØÊïÜÎîÛÍïÝÏ÷äÖùçÙ÷å×õãÕñÞÐëÙËçÔÆåÒÃòßÒñÞÑïÜÎñÝÏñÞÐê×ÉïÜÎòÞÐõáÓøå×ûéÛýëÞúèÚõáÔóàÒ÷äÖ÷äÖóßÑñÞÐöãÕûéÛ÷ä×ïÜÎìÙË÷ä×ùçÙüéÛüéÜúèÚøåØóàÓôàÓòÞÐïÜÎòßÑõâÕôàÒòÞÐóßÑíÚÌéÖÈìØÊ÷ä×øåØ÷äÖòÞÐìÚÌéÖÈòßÑõâÕôáÔøå×ýëÝüêÜõâÔõâÕôáÔóßÑñÞÐïÜÎüêÝùåØóàÓóàÓ÷äÖûèÚôáÓñÞÐïÜÎðÝÏñÝÏïÜÎïÜÎõâÔùæÙúçÚøåØøåØõáÓòßÑóßÑõâÔõâÔóàÒîÛÍïÜÎëØÊæÒÄçÓÅëØÊèÕÇê×Éé×Éë×ÉïÜÎôáÓöâÔûéÜüéÜúçÚõâÕíÙËçÓÅíÙËîÚÌñßÑóàÓðÝÏêÖÈìÙËïÜÎõâÔùæØüêÜòßÑöãÕ÷äÖõâÔ÷äÖúçÙûéÛöãÕðÝÏóàÓöãÖðÜÎöäÖëØÊèÔÆñÞÑõâÕòßÑèÔÆæÒÄçÔÆìÚÌîÛÍíÚÌôâÕûìÞûëÝúèÚüêÜûéÛøæØóàÒìÚÌëØÊîÛÍòßÑðÝÏõáÓñÝÏïÜÎôáÔöãÖòßÑôàÒøåØûèÛùåØôáÓöâÕõáÓôàÒõâÔùæØûêÜûèÛýìÞùå×òÞÐöãÕûéÜûèÛøåØ÷ä×úçÚûéÛúèÚýëÞúçÚ÷äÖùæÙüéÜýêÜûèÚùæØüèÚûéÜùçÙûêÜöä×÷åØ÷ãÕëØÊéÖÈõâÔöãÕöãÖóßÑøåØþíßýëÝùæÙùæÙøåØöãÖóáÓòÞÐëØÊñßÑøåØüêÜúèÚ÷äÖïÛÍïÜÎòÞÐõãÖôáÔðÝÏìÚÌðÝÏóàÒòßÒõáÓøåØúçÙöãÖõáÔøåØúçÚúçÚ÷ãÖðÝÏêØÊêØÊïÛÍóßÑñÝÏñÞÐòßÑõâÕùæÙüêÜöâÔýêÝüéÜùçÙôâÔëØÊìÙË÷äÖùæÙõãÖöä×ôàÒíÚÌðÝÏöãÖúèÚ÷ä×òßÑóàÒûèÛþðâþñãÿòäÿóåþëÝúçÚñÞÐôáÓýìÞýíàîÛÍîÛÍïÜÎïÜÏðÝÏîÛÎâοæÓÅïÜÎùæÙýêÜûèÚëØÊéÕÇíÚÌöãÖôáÔê×ÉìÙËíÚÌïÜÎïÜÎïÜÏïÜÎñÞÐóßÑñÞÐìÙËìÙËîÛÍõâÕúæÙýêÝøå×ñÞÐìÙËñÞÐøåØüèÚúèÚûèÛþîàüêÜøæØïÜÎðÞÐúèÚûéÛöäÖðßÐîÜÍôãÔöå×õãÕôâÓïÝÎóâÔùçÙúèÚüìÞþíßþìÞþëÝýëÝþëÝýëÝøæØôáÓòßÑ÷åØýêÜÿíßûèÛúçÚøæØ÷åØøåØùæÙøåØøå×úèÚüéÜùçÚôáÓëÙËñÝÏùçÙþìÞøæÙðÞÐòßÑõâÔõãÖóßÑóßÑõáÔóàÒõãÕðÞÐñÞÐ÷åØ÷å×õâÔ÷åØ÷åØòÞÐïÜÎïÝÏùæÙúçÚùæÙöãÕöâÔöãÖùçÙ÷ä×óàÒïÛÍñÝÐôáÔóßÑóßÑòÞÐðÝÏïÜÎñÞÐõâÔöâÕýêÝýêÜøåØøæÙüêÜöãÕïÝÏîÚÌðÝÏòßÒûêÜøå×øå×üêÝûêÜöãÕøåØýïáüðâ÷åØòàÒôáÔòßÑëØÊìÙË÷åØøæØðÝÏòàÒñÞÐñÞÐñÞÐóáÓõáÓóàÒñßÑõâÔüéÜûéÛöãÖíÚÌñÞÐñÞÐõãÖúèÛúèÚ÷ãÖôàÒòÞÐòßÑîÛÍèÕÇéÕÇôáÓöãÕçÔÆãÐÂéÖÈíÛÍðÝÏðÜÎíÚÌñÞÐ÷ä×øæØðÝÏíÚÌóàÒõâÔïÜÎñàÒîÝÎíÛÌïÝÎïÞÏîÝÎïÞÐîÝÏôâÔúéÚùèÚúêÜÿòäþëÝûèÛüéÜøå×ñÞÐñÝÏóßÑöâÔ÷ä×÷äÖ÷å×öãÕøæØùçÙ÷ãÖõâÕöäÖùæØ÷ãÖ÷ãÖøæØùæØ÷äÖñßÑòßÑôáÓ÷äÖõâÔñÞÐöãÕøå×÷ä×ôàÒóßÑôàÒõâÕõâÔòßÑöäÖúèÚõãÕøå×úçÙùçÙ÷ãÖ÷ãÖøæØôáÔøæØüêÜþìÞûèÛ÷äÖíÚÌîÛÍëÙËäÐÂçÔÆïÜÎòßÑðÝÏíÚÌîÛÍñÞÐôàÒôàÒðÝÏóàÓ÷äÖ÷ãÖøå×ÿîàûèÚñßÒìØÊñÝÏøæØøå×öãÕòßÑïÜÎðÝÏóàÒñÝÏóàÒòàÒïÝÏîÛÍîÜÎöä×òßÑðÝÏòßÑñÞÐíÚÌùæÙ÷ä×óàÒïÜÎòßÑ÷ä×ýíßýëÞûèÛùæÙ÷äÖõáÓôâÕùæØõâÔ÷åØýëÝûèÛóàÒóàÒ÷äÖüêÝüêÝ÷ä×îÚÌçÕÇäÑÃë×ÉòÞÑöãÖøæØ÷äÖñÞÑìØÊíÚÌñÞÑñÞÐðÜÎöãÕøå×óßÑóàÓûëÜùçØôãÕñàÒðßÑðßÐùèÙ÷å×øæØüëÜÿñâÿöçþìßøä×ôàÓöãÖõãÖòßÑôâÕúçÙýêÜùçÙõáÔòßÑñÝÏóßÑòßÒñÞÐôáÓùçÚøæØ÷åØöãÕ÷ä×ùæÙùæÙúèÚõâÔðÝÏñÝÏöãÕúçÙþìÞüéÜøåØõáÓõâÕ÷ä×þìßýêÜúçÙúçÚûèÛùçÙûèÛúçÚ÷ãÕñÞÐíÙÌê×ÉéÕÇñÞÐöãÕôáÓòßÑóàÓîÛÍòÞÐòßÑñÞÐôáÔøæØöä×ùçÙ÷ä×òÞÐòÞÐöâÕõâÔîÛÍìÚÌïÜÎðÝÏîÛÍòàÒôáÓõãÕ÷ä×øä×öãÖúçÚøåØòÞÑé×ÉçÔÆêØÊöãÖôáÓöâÕûèÚüéÛúçÙûéÛþìÞúèÚðÝÏïÜÎôáÓñÞÐóßÑòÞÐïÜÎîÜÎðÜÎöãÖöäÖôâÕòßÑòßÑóàÒöãÖ÷ä×õáÓõáÓ÷äÖôàÒøäÖüêÜýëÝúçÚúçÚüêÜòßÑðÞÐìÙËêÖÈñÞÑùçÙöãÕüéÛÿíßüéÛõãÕðÝÏêÖÈóáÔýëÝúçÚøå×þïâþñâýìÞúèÚøçØúéÛýìÞûéÛùèÚöäÖóâÔõäÖöäÖëØÊóàÒøåØùçÙüêÝÿðã÷åØûèÛûéÛùçÙøåØøæÙúçÚüéÜüêÜúçÚúçÙûèÚöä×øæÙùæÙùæÙ÷ä×÷ä×ûèÛóàÒëØÊëÙËõãÕþîàýëÞøæØñßÑñÞÐôáÓ÷å×üéÜüêÜøåØîÛÍïÜÎöãÖøåØøåØ÷åØôáÓðÞÐìØÊîÛÍîÛÍëÙËæÓÅçÓÅêØÊ÷ãÕöâÕùæÙýëÝùçÙòßÑóàÒòàÓïÜÎìÙËïÜÎõâÕöâÕóàÒòßÑöãÕöãÕðÝÏíÛÍïÜÎñÞÐõãÖùåØøåØôáÓóàÓõâÔ÷äÖõâÔðÝÏòàÒóßÑõâÕùæÙøåØõáÓûèÛýêÝûèÛõáÓöãÖýêÜòßÑôáÔôáÔñÞÐìÙËçÓÅéÖÈêØÊíÚÌñÞÐôáÓöâÕîÛÍîÜÎóßÑôáÓñÞÐòßÑúçÚúèÚøæØ÷äÖûèÛÿïáûèÛþëÝýêÜ÷äÖñÞÐîÛÍíÛÍóàÒøå×ûèÚúèÚøæØöãÖúçÚüêÝýêÝÿîàÿòäøçÙ÷å×øæØüëÜÿïàþîàúéÛþïáýìÞöå×òáÒìÛÌà̾ìØÊöâÕöãÕõâÕ÷ä×÷åØ÷äÖøå×úçÚüéÜýìßúèÚøæØ÷å×öäÖóàÒîÛÍöãÕ÷ä×öäÖôáÓóàÒóàÓõâÔóàÒðÝÏïÜÎóàÒùçÙøæÙõãÕòàÒõâÕ÷äÖ÷ä×ùåØ÷ãÖöä×òßÒïÜÎôáÓñßÑñßÑôáÓúçÙüêÝüêÜïÜÎê×ÉêÖÈðÝÏôáÔôáÓøæÙùæÙùçÙöäÖñÞÐêØÊîÛÍæÓÅãÐÂëØÊòßÑõáÓôáÓ÷åØøåØüêÜýëÝøåØóßÑôàÒóßÑïÜÎñÞÐôáÓõâÔøä×ûèÛûèÛ÷ãÖñÞÐëÙËðÝÏôàÒôáÔöäÖùçÙõãÕöäÖõâÔñÞÐôáÓùæÙûéÛûéÜûéÜúèÚóàÓëØÊîÛÍìÙËîÛÍïÜÎïÜÎíÚÌìÙËêÖÈóàÓôâÔëØÊíÚÌïÜÎçÔÆâÏÀçÓÆíÚÍñßÑòßÑôáÓ÷ä×÷åØñÝÐê×ÉëÙËîÛÍñÞÐ÷ä×úçÚûéÛþíßýëÝ÷ãÖøä×ýëÝüéÛ÷æØöå×ùèÙÿïàýíÞöå×øçÙýíÞûêÜ÷æØøçÙöäÖôâÔõáÔôàÓõáÔôáÔóàÒøåØôáÔòÞÐôàÓõáÔóàÓûèÚðÞÐêÖÈîÛÍòàÒóáÔõãÖõâÔðÝÏìÙËìÙËïÜÎöâÔûéÛýìÞúçÙöãÕôàÓùæÙúèÚýíßþòåþñäýëÝîÛÍéÕÇïÜÎõãÖðÝÏìØÊìÙËèÕÇçÓÅíÚÌóàÒöâÔðÝÏïÝÏòÞÐ÷ä×÷ãÖñÞÑëØÊòßÑñÞÐæÒÄåÑÃê×ÉðÝÏðÜÎóàÓúçÙúçÙöäÖñÞÐöãÖõâÔõâÔ÷åØôáÔ÷ä×õâÕôàÒóßÑñÞÐïÜÎîÛÍ÷äÖüêÜ÷ä×ôáÔöãÖ÷å×ûèÚøä×íÚÌíÚÌôáÓüéÛþìÞ÷åØðÝÏïÜÎìÙËôáÓìÚÌëØÊñÞÐôàÒñÞÑíÛÍïÜÎé×ÉáÎÀæÓÅñÞÐúçÚùæÙöãÖïÜÎíÚÌëØÊîÜÎðÝÏïÜÏìÙËèÕÇåÒÄæÒÄçÓÅæÒÄðÞÐûéÛýêÜûêÝöãÖ÷ä×øæØôáÓôàÓñÞÐñÞÐ÷å×÷ä×ìÙËæÓÅôãÕúéÛúèÚòáÓòáÒøæØõãÕñßÐöäÖùèÙöäÖõäÖýïáüëÝ÷äÖðÝÏñÞÐôáÔôáÓùæÙýêÝûêÜöä×ðÝÐïÜÎôáÓòßÑïÝÏòßÑòßÑ÷ä×õâÕîÜÎòßÑúçÚùæØüêÝýëÝþíßüêÜöãÕïÜÎìÙÌùéÜüíßúèÚøæÙôáÔöãÕóàÒôáÓøåØúçÚùæÙôâÔïÜÎðÝÏòßÑòßÑøå×÷ä×øåØ÷ä×óßÑíÛÍéÖÈèÕÇóàÓôáÔòàÒ÷ãÖ÷äÖòßÑñÞÐòÞÐóáÓðÝÏìÚÌðÝÏñÞÐñÞÐñÞÐñÞÐðÝÏïÝÏôáÔøæÙúèÚúçÚûèÚøä×ðÜÎíÙËõãÕüêÜþëÝüêÜÿîáþìÞõâÔóàÓöãÕñÞÐöãÕõâÔóáÓòßÑëØÊìÚÌðÝÏòßÑðÝÏòßÑõãÖ÷äÖïÛÎèÕÇéÖÈðÝÏöä×÷åØñÞÑìØÊîÛÍóàÒ÷äÖòßÑõâÔõâÕòÞÐîÛÍìÙËíÙËèÕÇèÕÇòàÓûèÛýëÝùëÝòßÑíÙËîÜÎòßÒùæÙðÝÏñÞÐòÞÐóàÓôáÓõâÔôãÕõäÖóâÔñàÒôãÕøæØüëÜúèÚøæØòàÒïÝÏóâÔðÞÑïÜÎîÛÍîÛÍñÞÐóàÒôáÔõâÕ÷äÖùèÚùæÙöä×ôáÓüéÜýìÞýêÜþëÝûéÛöãÕöãÖøæÙûèÚúèÚøä×õâÔûéÜüìÞùæÙöãÕ÷ä×ñÞÐîÛÍëØÊîÜÎóàÓöãÕüêÜûèÛùæØöãÕóàÓñßÑöâÕøå×üìÞûëÞ÷äÖôáÔõáÓòÞÐïÜÎìÚÌîÛÍðÝÏõâÔôáÔóàÒóáÓøåØýìÞöâÕóàÒðÝÏîÛÍîÛÍîÜÎïÝÏôâÔøå×õáÔñÞÐðÝÏóáÓøæØüéÜùçÙ÷äÖöãÕîÛÎçÔÆåÑÃïÝÏúèÚÿìÞ÷ä×öäÖúçÚÿìÞûèÛòÞÐêØÊìÙËíÛÍóàÓøä×÷ãÖòßÑúçÙúçÚòÞÐíÚÌïÜÎõâÔñÞÐïÜÎðÝÏîÜÎéÖÈïÜÏðÝÏîÛÍîÛÍñÞÐôáÓë×ÉíÚÌðÝÏïÜÎñÞÐóàÒøæØòÞÐöäÖüéÛ÷ä×ôáÓçÔÆæÒÄê×ÉðÝÐöãÖúèÚúçÙûéÛôáÓóàÒúçÚýêÜûëÝõäÖðßÐòáÓôãÕóâÔõäÖôãÕñßÐìÛÌîÝÎõäÖðÝÏïÝÏñÞÐøå×úèÚùæÙ÷ä×îÛÎéÕÇîÛÍöâÕúèÚöâÕüéÜþìÞûèÛøå×öâÔöãÕòßÑöäÖûèÛùçÙûéÛüêÝõâÔïÝÏñÞÐ÷äÖûèÛðÞÐêØÊêØÊìÙËëØÊíÚÌøåØ÷åØôàÓðÝÏôáÓøæØùæÙúçÚûêÜýíßýëÝýìÞýîàøæØïÜÎìÙËðÝÏôáÔôâÕëØÊéÕÇêÖÈéÖÈïÜÎöãÕøä×÷ä×ôâÔôâÕ÷ä×üëÞþíßýìÞõãÕðÝÏïÜÎûéÛøæØ÷åØùæÙöâÔïÜÎé×Éê×ÉïÛÍöãÕ÷ãÖôáÓòßÑëØÊìÙÌöãÕõãÖìÚÌìÙËêÖÉìÚÌòÞÐóßÑóßÑíÛÍïÜÎòßÑõâÔóáÓñÞÐðÞÐøæØüëÞúçÙõâÔóàÒòßÑôáÔöãÖöä×øäÖøæÙ÷äÖøå×ùçÙúèÚùæØõâÔöãÕòÞÐöãÕøä×ïÜÎëØÊïÜÎöãÖûèÛüêÜûèÛ÷åØþîàÿòåýìÞúçÚþëÝþëÝüíÞøæØôãÕõäÖõäÖóâÔóâÔïÞÐíÜÎõäÖûêÜüëÜþíßýëÝþëÝÿîàÿíßýëÝõãÕóàÓôàÒøå×üéÛýêÜùæÙúçÚûéÛúçÚûèÚþìßõâÔïÜÎòÞÐõâÔóàÒõâÕùçÙõãÕóàÒóàÒôàÒòßÑðÝÏôáÓûéÛøåØõâÔüëÝùæÙúçÚùçÙ÷åØøåØûéÛñÞÐîÛÍçÔÆèÕÇîÛÍòßÒñÝÏóàÓöä×ùæÙúçÚùåØîÛÍéÖÈíÚÌðÝÏê×ÉéÕÇëÙËóáÓûèÛüêÜûèÚùçÙùçÙõãÕñÝÏïÜÎòßÑøåØ÷å×òßÒñÞÐõâÕöãÖõâÕöãÕøåØúçÙöâÕëØÊâÏÁé×ÉêÖÈìØÊïÜÎñÞÐóàÒùçÙùæÙûéÜøæØñÞÐïÜÎöãÖôàÓôàÒ÷äÖ÷äÖõáÓûéÛýîàüíà÷äÖôâÔöäÖõâÔòßÑóàÒúçÙÿíßÿñãýíßôáÓíÚÌôáÔüéÜýëÝöä×öãÕöâÕöä×÷äÖ÷ãÖóàÒøæØ÷äÖöãÕøåØøåØøäÖúçÚüéÜüêÜùçÙ÷äÖõäÖùçÙúèÚ÷å×ôãÕôãÕûêÜûêÜùèÚþîàÿóåþïáÿðâÿîáþìßýêÜüéÛúçÚÿðãüêÝõãÕðÜÎóßÑøæØþìÞúçÚ÷ä×òßÒñÞÐ÷äÖïÜÎîÜÎðÝÏ÷äÖúèÚúèÚôàÓúçÚüéÜøåØ÷ä×úçÙýîáÿòäþïáøæØøä×úéÜúçÚüéÛüêÜûèÚ÷ä×ôáÔõâÕôáÔîÚÌê×ÉìÙËëØÊçÕÇïÛÍ÷ä×úçÙõâÕðÝÏëÙËîÛÍñÞÐõâÔòßÒîÛÍéÖÈìÚÌñÞÐóàÓòÞÑðÜÎèÕÇåÒÄåÑÃíÚÌôáÓøå×õâÔöãÕóàÒðÝÏðÝÏòßÒõâÕõâÔôáÓôàÒóàÓòßÑîÛÍôáÓöãÕôàÒöãÕûèÛøæØöãÕöãÕïÜÎêÖÈíÚÌóàÒðÝÏìØÊéÕÇë×ÉíÛÍðÝÏñßÑðÞÐîÛÍìÙËëÙËíÚÌîÛÍðÝÏóàÒøå×üëÝúèÚñÞÐðÜÎøåØöäÖìÙËñÞÑúèÚúçÚöä×÷åØôáÔõáÔøåØôáÓòßÒøåØùæÙòÞÐïÜÎôâÕöãÖïÜÎëÙËñßÐûêÜþîàôâÔîÜÍîÜÍùèÚÿñãÿñãþïáÿòãÿñâþìÞþìÞýêÜùæÙùæÙûèÛþíàÿîàûéÛöãÖùæÙþðâüêÜ÷äÖõáÓðÝÏîÛÍôáÔüñãúêÜðÝÐñßÑûèÚüéÛøä×÷åØùçÚþïáÿôçÿõçþíßýìÞöãÕòÞÐòÞÐíÙËîÛÍë×Êë×ÉðÞÐöãÖùæÙøåØøåØóàÒðÝÏñÞÐîÛÍòÞÐðÜÎïÜÎïÜÎñÞÐôáÓùçÙûéÜ÷ä×öãÖøå×óàÒñßÒíÚÌèÔÆèÔÆéÕÇèÔÆëØÊé×ÉëØÊñÞÐðÝÏéÖÈèÔÆíÙËñÞÐôáÓõãÕöä×úèÚùæÙ÷ä×ùæØûéÛþìßüïáýìÞøæØñÝÏôáÔüêÜèÔÆáÍ¿áÎÀíÙÌõâÕ÷ä×êØÊëÙËê×ÉèÔÆëØÊïÜÎîÛÍñÝÏôáÓ÷ãÖôáÔðÝÏéÕÇóàÓ÷äÖõâÕðÝÐåÒÄìÚÌöãÕøåØíÚÌêÖÈîÚÌøåØúçÚúçÚüéÜýêÝþíßÿîàýêÝùæÙôàÒïÜÎìÙËçÓÅéÕÇëØÊïÜÎöâÕúèÛýîàúèÛõâÔóàÒöâÔùåØýîàùæÙûéÛõâÕùçÚûéÛþðâûêÜöå×õäÖøæØúéÚöå×ôãÕøæØþîàüìÞöå×ñÝÐöâÔóáÓöãÕüéÜüéÜøä×þïáÿóåûéÛõâÔôáÓùçÚùæÙþìßÿðãþíàÿðãûéÛôàÒóàÒüéÜüéÜõâÕîÛÍë×ÉéÕÇíÙÌðÞÐðÝÏüéÜøåØôâÔôáÓóàÓðÝÏôáÓöä×ôáÔïÜÎïÝÏõâÔùæØúçÙùæØöãÖøåØüêÜõâÔõâÔðÜÎéÖÈíÙËôáÓúçÚùæÙöâÔïÜÎéÕÇãÐÂçÔÆòàÒøæÙõâÔóàÒõâÔüêÜüêÜöãÕõâÕúèÚúèÚùæÙöãÖõáÔ÷ä×öãÖóáÔéÕÇìØÊñÞÐõâÔôàÒïÜÎïÜÎôâÔøåØöãÖóàÒòÞÐëÙËðÝÏôáÓôàÒóàÒôáÔòßÑ÷ä×õâÕðÝÏíÙËèÕÇîÛÍëØÊíÚÌôáÓøå×÷äÖõáÓøæØøä×ôáÔ÷äÖûêÜûéÜüêÜùæÙòßÑñÞÐóàÒøå×ùæØøå×öâÕùæØüêÜôàÒòßÑóàÒùåØüêÜüêÜôáÓðÝÏóßÒíÚÌíÚÌìÙËïÝÎôãÕõäÖòáÒóâÓøæØ÷å×øæØûéÛþïàþîßüêÜûèÛøåØøæÙýëÞþíßýìÞûèÛúçÙøæÙúèÚûèÚùçÚ÷ä×÷åØýêÜýëÝùçÙúçÚüêÝýêÝýëÝþíßÿíßþíßùèÛúêÝûíàüíàøæÙòÞÑíÙËóàÒ÷ä×óàÒêÖÈáÍ¿ìÙÌòàÓ÷ä×öãÖóßÑðÝÏðÝÏôáÓ÷ãÖöãÕ÷ãÖùåØôáÓöãÖõâÕñÝÏõáÓúèÚüêÜùæØöãÕ÷ãÖ÷äÖõãÕøæÙúçÙûéÛüéÜûèÚøåØøæÙûèÛýëÝùçÙòàÓìÙÌìÙËòßÑõâÔðÝÏìÙËê×ÉöãÕ÷ä×öãÖóàÒñÞÐñÝÏóàÒôàÒòßÑðÝÏîÛÍîÛÍñÞÐîÛÍîÛÍñÞÐ÷ãÖúçÚüéÛýêÜøæØóßÑõáÔøåØôâÔíÛÍíÚÌõâÔúèÚúçÚòßÑïÜÎïÜÎóàÒóáÓïÝÏóáÓ÷äÖúçÚùçÙøåØöãÖúçÚúçÚüêÜþìÞùæØñÞÐöäÖôâÕøå×þìÞþìÞøæØìÙËïÜÎðÝÏîÛÍîÛÍéÕÇâÐÁëÚËòáÓòáÓõãÕûéÛóâÔóâÔóáÓòàÑóâÓöå×ôáÓðÝÏôàÒ÷åØ÷äÖûêÜùåØñÞÐíÚÌïÜÎðÝÐðÝÏúèÚùæÙùçÙ÷ä×õâÔ÷äÖòßÒõãÖùçÙûèÛýëÝÿíàþíßýìßûëÞúéÜ÷å×óàÒæÓÅîÛÍóàÒòßÑïÜÎíÚËíÙËíÚÌïÜÎòßÑñÞÐïÜÎ÷ä×ùæÙøåØóßÒðÜÎíÚÌïÜÎõâÔøæÙ÷ä×öä×øæÙôáÓñÞÐòßÑøåØüêÜüêÜþìÞüêÜûéÛýêÜüéÛ÷åØöãÖòßÒöâÔóàÒìÙËê×ÉðÝÏöãÖùæÙ÷ä×öãÖ÷ä×úçÚùæÙóáÔðÝÏôáÔüéÛöãÖóàÓñÞÐòßÑôáÓöäÖõâÔìØÊãÐÂæÓÅðÞÐùçÚþíßûèÚõáÓðÝÏðÝÏõáÓùçÙþìÞúèÛìÚÌë×ÉòàÓïÜÎîÜÎóàÒùçÙøæØóàÒîÛÍëÙËîÛÍùçÙüëÝùèÛöäÖõâÔ÷äÖûèÚùæØóàÒöãÖõâÔøåØýêÜúçÚóàÒñÞÐùçÚøæÙûéÛÿíßùçÚøçÙ÷æØùçÙûéÛûêÜûéÛþíÞûêÛóáÒìÚÌìÛÌñßÐîÛÍîÜÎïÛÍåÑÃáÎÀé×Éöä×÷åØöãÕóàÓöâÕùæÙùçÙùæÙóàÓíÚÌîÜÎñßÒúçÙúçÚûéÛþëÞýëÝûèÚøåØ÷ä×öâÔõâÔöäÖùæÙøçÙùçÚøæÙ÷äÖúèÚþíßûéÛ÷äÖóàÓ÷ãÖ÷åØõâÔíÚÌìÙËìÙËíÚÌíÚÌìÚÌëÙËòßÒ÷åØöä×ñÞÐíÛÍîÛÍïÜÎòßÑøåØùæÙøåØòßÑöãÖ÷ä×ôáÔóßÑôàÒøå×òßÑöãÖûèÛúçÚûèÛøåØ÷äÖøæÙûéÛúçÚõáÔüéÜûèÛ÷åØòßÑðÝÏòßÑíÚÌîÛÍñÞÐ÷äÖøå×öãÕòßÑðÝÏëØÊèÕÇìÙËñßÑöãÕñÞÑóßÑöãÕöâÕøä×øæÙüìßùçÙìÙËéÖÈðÜÎ÷ãÖûéÛûéÛôáÓòÞÐôàÒôáÔñÞÐñÞÐùçÚþîàÿñãüêÝúçÚôáÔóßÑúçÙÿðâýìßûéÜùæÙöä×òßÒíÛÍùåØüêÜøæÙüêÜûéÜüéÜûëÜûéÛüëÜýíßþîàÿïáûêÜûêÜúéÚøèÚûëÜþîßöâÕ÷ä×öãÕòßÒóàÒöäÖúçÚûèÛúçÚ÷ä×õãÕöãÕñÞÐùæÙøå×ðÝÏíÚÌéÖÈúçÙûéÛûèÛöäÖòßÒðÝÏöãÕøæØùçÙøå×øæØûèÚÿïáþíßüêÜúçÚùæÙùçÙøåØ÷ä×÷ä×÷å×ôáÓïÜÎðÜÎðÝÏòßÑôáÔõâÕóàÓòßÑôàÒõâÔôáÓñÞÐïÜÎòßÑ÷å×ûéÛûèÛùæÙøåØòßÑóàÒóßÑòßÑòßÑóßÑóßÑòßÑöãÕþëÝþìßúèÛþíàúèÚ÷ä×ùæÙúçÚøæØñÞÐóàÒôàÓõáÔöãÕöãÖòßÑðÝÏñÞÐôáÓõáÓóßÑ÷ãÖúæÙüêÜúçÙóàÒëÙËëØÊæÒÄìÙËóàÓïÜÏìÙÌõãÖðÝÏíÛÍòßÑôáÔòàÒòßÑðÞÐîÜÎïÜÎòÞÐõáÓôáÓûéÜüîáýêÜýêÜÿîáÿñãüéÛôáÓòßÑøä×þíàÿðâÿíßýêÜúèÚúçÙùçÙüéÜöãÕñßÑóßÑêÖÈñÞÐñàÒ÷æØøæØñàÑðßÐóãÕöäÖøæØûéÛüëÜùèÚ÷æØúçÚ÷äÖòßÑøæÙüéÜôáÓøåØôàÒôáÓüêÜüêÜ÷ä×ùæÙþíàûèÛóßÑóàÒòàÒðÝÏùæØúçÚïÝÏìÙËðÝÏ÷äÖöãÕóàÓïÛÍðÝÏôâÕõâÔòàÒòßÑ÷ãÖúèÚûéÛùæÙùæÙøåØ÷ä×ôâÕòàÒïÛÍñÝÏöãÖûéÛûèÛöâÕúèÚ÷ãÖóàÒóàÒ÷ãÖúçÙõâÔüéÜÿìÞúçÚùæÙûèÛüêÜõâÔðÝÏõãÖøä×öâÔøåØøå×öâÔûêÜÿðãûéÛóàÒ÷äÖøåØöä×ùçÙýêÜôáÓ÷ãÖûéÛýìß÷äÖîÛÍðÞÐôáÔõâÕñÝÏîÛÍíÛÍöä×øæÙùæÙ÷ä×óàÒðÝÏæÓÅíÛÍñÞÐîÛÍîÛÍðÝÐîÛÍóàÓúèÚþîàÿðãÿïâýëÝùçÙöä×÷ä×øå×öãÕøæÙùçÚþíàûéÛõáÓöãÖþíßýìßýìßüêÜ÷äÖðÝÐøæØûéÜþñäþîàúçÚüêÜòßÑõáÓôáÓîÜÎðÞÐõãÕôãÕòàÑòáÒõäÖöå×ôãÕôå×öæØùçÙùçÙõäÖòàÑúçÚüéÜýëÝüéÜùæÙ÷ä×øå×ýëÞýëÝüìÞûïáúêÜúçÙõâÔôâÔúçÚüêÜùæÙüêÜ÷ä×ùæÙúçÚõâÔõâÔùæÙúèÚóàÒïÜÎõãÕ÷åØìÙÌéÕÇîÚÌñÞÐòÞÐ÷ä×ïÝÏíÛÍîÜÎôáÓ÷ä×öãÖ÷ä×öãÖôâÔôáÔöãÕ÷äÖõáÔøåØóàÓóàÒûèÛýëÝúçÚ÷ä×õâÕøä×ùåØøå×øåØúçÚóàÒðÜÎöãÕøæØûèÛýêÝüéÛöãÖôáÓôàÒñÞÐóàÒøæØüêÝùçÙòßÒýìÞûèÛøå×öäÖôàÒðÝÏùçÙõâÔñÞÐîÛÍðÝÏóßÑúçÚøä×÷ãÖöãÖôàÒðÝÏîÛÍðÝÏñÞÐñÞÐóàÒ÷ä×îÛÍíÛÍïÜÎöäÖûéÜüêÝüéÛøåØõâÔ÷ãÖüéÜþîáþìÞýêÜûèÚùæØ÷äÖöãÕúçÚýíàÿñäüìÞùåØöãÖöãÕòßÒóàÓûéÛÿíßþëÝôáÓ÷ä×ùçÙùæÙûéÜýìßüëÝúéÚöå×ôãÕøçÙýîàÿóåüíß÷æØöäÖùçÙýíÞûéÛÿìßþíßùçÙ÷ä×ùçÚùçÚùçÚôâÕìÚÌìÙËðÝÏòßÑðÝÏñÞÐöãÕúèÚüéÛýêÜøæÙúçÚûèÚøæØøå×ñÞÐóßÑõâÔùæØûèÛüéÜûéÛùæØùæØöâÕòßÑóàÒùæÙøåØùçÙúçÚöãÕñÞÐïÛÍìØÊéÕÇêÖÈïÜÎóáÓ÷ä×öãÕõáÓöäÖøåØùæØõâÔïÜÎìØÊðÝÏóàÒòßÑõâÔøå×øåØôáÔðÝÏïÜÎúçÚôâÔíÚÌìØÊïÜÎôàÒðÜÎéÖÈìØÊìØÊëÙËõãÕ÷äÖóàÒðÝÏîÛÍðÝÏóßÑùæÙöãÖôáÔôâÔóßÑðÜÎîÜÎíÚÍîÜÎöãÕúèÚúçÙõâÕòßÑïÜÎìÚÌîÛÍïÜÎæÓÅçÔÆìÙËóàÒõâÔòßÒóàÒôáÓóßÑóàÒ÷ä×üëÞùæÙôâÔíÙËðÝÐúçÚúçÚùçÙõâÔùæÙÿóæýïáóàÒèÕÇé×ÉëÙËøçÚÿïáûèÛýìÞýêÜûèÛõâÔïÜÎë×ÉñßÐôãÕõäÖôãÕõäÖõæØîÞÏé×Éé×ÈòàÑùçÙûéÛóàÒùçÚùçÚïÝÏïÝÏõãÕïÛÍåÑÃåÒÄíÚÌðÜÎõâÔöãÖõâÕôâÔ÷ä×üéÛÿíßûéÛ÷äÖøå×üéÜþìßÿïâóßÑñÞÐùçÙþíßüêÜýëÝÿîáÿïáÿðâúèÚòßÒíÛÍñÞÐóàÒöäÖøåØöâÕòßÑæÒÄçÓÅéÖÈïÛÍõâÔúèÛñÞÐëØÊïÜÎóßÒîÛÍëØÊê×ÉèÖÈëØÊóàÒóàÓíÛÍêØÊéÕÇìÚÌíÛÍëØÊïÜÎíÚÌçÓÅäÐÂéÕÇðÝÏõáÓõâÔëØÊê×ÉèÕÇèÕÇñÞÐâÎÀæÓÅíÚÌõâÕûéÛÿíßöä×õãÕ÷äÖ÷ä×óáÓîÛÍëØÊêÖÈìÙËñÞÑ÷äÖùçÙõáÔòßÑïÜÎíÚÌíÚÌìÚÌóàÓòßÑñÞÐðÜÎîÛÍëÙËòßÑ÷ä×úçÚ÷å×óàÒñÞÐîÛÍñÞÐðÞÐöãÕüêÜøåØõâÕöãÖøä×ùæÙ÷äÖóàÒöäÖûêÜùæÙøæÙýëÞýëÞûéÛüéÜûèÛøåØóàÒîÜÎôâÔòáÓõäÖüìÝøèÚîÝÏðÞÏïÞÏñßÐøæØüëÜûêÛùéÛþîàüêÝóàÒîÛÍñÞÐñÝÏêÖÈíÚÍõáÓôàÒõáÓþëÝûéÛùæÙöãÖ÷ä×ùæØ÷ãÖñÞÐê×ÉëÙËðÝÏñÞÐøåØôáÓùçÙþíßþëÝÿíßýëÝûéÛ÷ä×ôâÔõáÓóàÓðÝÏñÞÐðÝÏðÝÏñÞÐñÞÐøåØúçÚûéÛøä×óßÑîÛÍëÙËíÛÍòßÑïÜÎèÔÆéÖÈöâÔôàÒõáÔùæØ÷åØòßÒîÛÍèÕÇêÖÈëÙËêÖÈïÜÎëØÊîÜÎôáÓøçÚøæØôàÓöäÖøåØöâÔûéÜüëÝñÞÐðÝÏóàÓôàÓôáÔõâÕ÷å×õâÔóàÒòÞÐñÞÐòßÑóßÑöä×öãÕôàÒïÜÎîÛÍðÝÏõâÕõâÕóàÒñÞÐôáÓùå×øæÙôâÔîÛÍçÓÅçÓÅéÕÇöãÖøæÙûèÛûèÛøåØöâÕñÞÐøæØýìÞþìÞøæØòßÑòÞÐïÜÎðÝÏöäÖûéÜýëÞÿðâÿðâúèÛðÞÐðÞÐöãÕýêÝÿíßÿîáüêÜùçÙùæÙöäÖòáÓõäÖþðáÿõæýïàýíÞþîßûêÛôãÕóâÔöå×ýíßýïáþîàûéÛõâÔðÝÏòßÑùåØûéÛ÷ä×öãÕøå×ùæØöâÕóáÓôàÒòßÑðÝÏïÜÎîÛÍëØÊðÝÏõâÕõâÔøåØ÷åØøåØùæØùæØùæØùçÙ÷ä×ñÞÐñÞÐøå×úçÚøåØ÷ãÖòßÑíÚÌíÚÌïÜÎòàÒôáÓóàÒïÜÎê×ÉæÓÅñÞÐøåØúèÚôáÔñßÑóàÒøæÙôáÔïÜÎíÙËîÛÍðÝÏòÞÑóàÓ÷äÖúéÜúèÚøå×÷äÖúçÚýëÝüêÜøæÙõâÕóàÒûéÛúçÚüêÝýíàöä×üêÜùçÚóßÑëÙËíÚÌðÝÏïÜÎñÞÐñÞÐðÝÏðÝÏóßÑöä×úèÚùæÙñÞÐðÝÏôâÔøæÙ÷åØòàÒîÛÍôáÓýêÝôáÔùæØøå×òßÑòÞÑöäÖõâÕñßÑñÞÐöâÕûèÛýêÜ÷ä×÷åØûèÛøåØóàÒöãÖúçÙõâÕðÝÏñÞÐøå×ýëÝýëÞüêÜýêÝöäÖðÝÏñÞÐùçÚýêÝüéÜóáÓñÞÐóàÒõäÖôãÕõäÖ÷æØöçÙõå×÷æØýëÝýìÝ÷å×òáÓñàÒëØÊìØÊòÞÐùæÙõâÔìÚÌôàÒûèÛûèÛüéÜüêÜ÷äÖòßÑðÝÏñÞÐöãÖôáÔîÛÍèÕÇîÛÍïÜÎôáÓ÷äÖñÞÐùæØýêÜ÷åØðÝÏîÛÍêÖÈóàÒùæÙùçÚúèÚûèÛôáÔîÜÎðÝÏïÜÎíÚÌðÝÏôâÔöãÖóàÓðÝÏïÜÎòßÒõâÔøåØúçÚøæØüëÝüìÞôáÓóàÒôáÔóàÒðÜÎñÞÐôáÔüëÞþîáýìÞþíßÿîàøæÙøåØ÷ä×óáÓðÝÏòßÒ÷ä×÷äÖûéÛøæØíÛÍîÚÍ÷ä×øæØõâÕôâÔøåØùæÙøåØòßÑïÜÎðÝÏ÷äÖøå×õãÕñÞÐòßÑñÞÐðÝÏíÚÌë×ÉíÚÌëØÊíÚÌóàÒòÞÐëØÊöãÖûéÛûéÛýëÝÿîàûéÜùæÙòÞÑñÞÑùæÙûèÚõáÓúçÚùæØîÛÍñßÑúçÚôâÔúçÚüéÜûêÜþíàþíßùçÙîÛÍïÜÎ÷å×üëÝüéÛüîàÿòäþíßùçÚ÷ãÕûéÛÿíßûêÜúçÙõâÔçÓÅÞʼâÎÀïÜÎóàÒøåØúèÚùçÚ÷äÖðÞÐðÝÏòßÑúçÚûèÛùæÙõâÔ÷ãÕöâÔõáÓöãÖùçÚûéÛùæÙöâÔòßÑñÞÐôàÒ÷åØüéÛüéÛöãÖöä×üêÜûéÜúçÚôáÔïÜÎðÝÏóàÒñÞÐóßÑøå×ûèÚõáÔêÖÈíÚÌçÔÆäÐÂèÕÇïÜÎôáÔõâÕôáÓöä×ýëÝúèÚóàÒëØËîÜÎòßÑõâÕöãÖöãÖñÝÏôáÓ÷äÖùçÙúèÚøæØüéÛüéÛ÷å×ïÜÎëÙËêØÊñÞÐõáÔñÞÐèÔÆëØÊöãÖ÷äÖñÝÏïÛÍõâÔùæÙ÷ä×éÕÇêÖÈìÚÌðÝÏïÝÏíÙËõâÕóàÒòßÑóßÑðÝÏíÚÌê×ÉíÛÍñÞÐôáÓòßÑïÜÎìØÊïÝÏôáÔöä×òßÑëØÊïÜÎøå×úèÚûèÛýëÝýêÜôâÔùçÙúèÚôâÕòÞÐñßÑúçÚþìÞûéÛùçÚýêÝþìßýëÝüêÜýìßýëÞûéÜüéÜøæØíÛÍìÙËõáÓöãÕõâÔÿïáüêÜýêÝÿðâÿðãýêÝþïâúçÙöä×óàÒïÜÎñÞÐöãÕöãÖ÷ãÖùçÚýêÜÿíßýëÝþëÝúçÚöâÕùæÙþëÝûéÛÿíßþíßúçÚúèÚþíàõâÕ÷ä×÷ä×òßÑóàÓøå×ùçÚ÷åØóàÒòßÑöãÖüéÛöãÖöãÖóàÒïÜÎîÛÍðÝÏðÝÏîÛÍïÜÎóßÑôáÓóàÒïÜÎìÙËîÛÍ÷äÖúæØ÷äÖñÞÐøå×úèÚöãÕðÝÐîÛÍõâÔïÜÎëØÊìÙËîÛÍîÛÍîÚÌðÝÏóàÒõáÓóàÒñÞÐôáÓöäÖùæØøå×öãÕóàÓõâÕ÷äÖøå×øæØùèÚûéÛùæØíÚÌéÖÈòßÑóàÒë×ÉéÖÈëØÊíÚÌìÚÌèÕÇãÐÂéÖÈñÝÏ÷äÖøå×óàÒîÛÍæÒÄçÔÆëØÊòÞÑùåØýëÞúçÙúçÚøåØôáÓóàÒôâÔðÝÏ÷ãÖúçÚùåØõâÔðÞÐêÖÈòßÑòßÑìÚÌñÞÑûèÚøåØùæÙûèÛ÷ä×ôáÓùæÙôáÔñÞÑïÝÏîÛÍòßÑúèÚüêÜøæØöãÖ÷ä×úèÛýíßóàÒñÞÐôáÓýìÞÿïâýëÝöãÕöãÕúèÚþíàþïáþñã÷ä×öãÖõâÕöä×ùæÙûèÛøå×úçÚúçÚ÷ä×øåØûéÛöâÔøæØùçÚøæØøæØùçÚñÞÐóßÑöãÖúæÙüêÜýëÝþìßúèÚõãÖ÷äÖùæÙúçÚ÷ä×øåØ÷ä×ñÞÐîÛÍîÛÍîÛÍíÚÌîÛÍòßÒùæÙþìÞùæØõâÕöãÖûèÛþëÝýëÝ÷å×üêÜûéÛñÞÐïÛÍñßÒôàÒòßÑôáÓúçÙúèÛøåØüéÛøäÖóàÒòßÑöâÕùçÙûèÚûéÜþìÞÿðâÿîàüêÜûèÛüêÜÿíßÿîàûéÛôáÔë×ÊîÜÎôáÔöãÖòßÑìÙËöãÖøåØùæÙøæÙøåØøåØìÚÌðÝÏõâÔøä×÷ä×õâÔúçÚöãÖñÞÑïÜÎïÜÎñÞÐõâÔõâÔòßÑîÛÍðÞÐ÷ä×öä×íÛÍé×ÉíÚÌíÙËéÕÇîÜÎïÜÏïÜÎñÞÑ÷äÖûèÛóàÓìÙËïÝÏôáÓòßÑóàÒôáÓöâÔòßÑîÜÎñÞÐòÞÐíÚÌñÞÐôáÔõâÔõáÓñÞÐäÑÃìØÊóàÒøåØúèÚûèÚôáÔýíàÿñãûéÛöãÖôáÔüêÜþìÞÿîàýêÜøåØóßÑ÷ä×ôáÓôáÓùçÙûéÜúèÛóàÒëØÊéÕÇòßÑ÷ä×öâÔüêÜüêÜýëÝþëÝüéÜ÷åØùæÙùæÙúçÙùæÙóáÓìÙËñßÑõâÔöãÖôàÒòÞÐñßÑñÞÐòßÑôàÒôàÓôáÔôâÔúèÛþïáþñãùçÚóàÓðÝÏøå×óáÓïÜÎôáÔûéÜÿñãûéÛüéÜüìÞüïáüíßûéÛíÛÍê×ÉéÕÇîÜÎ÷äÖþëÝûèÛùæÙùæÙüêÜýëÝüéÛûèÛùæÙóàÒîÛÍîÛÍðÞÐîÛÍõãÕûèÛüéÜùæÙöãÖùæÙúçÚøå×óàÒñÞÐòßÑîÜÎìÙËìÙËôáÓüéÛÿíßøæÙùæØøå×õãÖòßÑðÝÏðÝÏöãÕúçÙúçÙùæØùæÙúçÙîÛÍê×ÉîÜÎòàÒùå×øå×õâÔõâÔ÷äÖ÷äÖóáÓôáÔñÞÑõãÕûèÛøæÙøåØûéÛÿîàÿïâýëÞøåØñÞÐðÞÑòßÒôáÔúèÚöäÖéÖÈóàÓöãÖ÷ãÖôáÓñÞÐïÜÎöâÕýìßüëÝ÷ãÖõâÕõâÔùçÙûèÚúèÚ÷äÖñÞÐëÙËôáÓìÙËèÕÇìÙËòßÑóáÓõâÔñßÑòàÒùçÙùçÙôáÓôáÔøæØýëÝÿíàþíßýëÞûéÛýêÝÿíßþìÞøæØñÞÑïÝÏóàÒöãÕõâÔöãÕøåØ÷ãÕôàÒñÞÐñÞÐïÜÎëÙËïÜÎðÝÏðÝÏòßÑõâÔùåØçÔÆäÐÂäÑÃîÛÍ÷äÖûéÛñÝÏðÝÏíÚÌëØÊïÛÍóßÑ÷æØøçÙùçÙûéÜýêÝýëÝ÷åØøåØúçÚüêÜþìÞÿíàÿïáûéÛõâÕõâÔøåØûéÜûèÛöãÖóàÓôáÔõâÕôáÓ÷ãÖùæÙøåØóàÒñÞÐñÞÐðÝÏíÚÌîÛÍôáÓöãÖóáÓôàÒõáÓõãÕøæÙûéÜüìÞôàÒøåØüêÜûéÛ÷äÖòßÒéÖÈíÙËñÞÐíÚÌëØÊòßÒñÞÑîÛÍìÚÌðÝÏöâÕùæÙùçÚýíßþïáüêÜøä×õáÔùçÚøæÙûëÝþìÞúèÚ÷ä×øåØýìÞýëÞþëÝþëÝùæØöãÖìÙËçÓÅïÝÏøå×ûéÛûéÛùçÚóàÒöãÕýíßþîàýêÜúçÚõâÔòÞÐñÞÐðÝÏëØÊìÙËìÙËëØÊïÜÎôâÔ÷ä×üêÝþìßûéÛ÷åØöãÖïÜÎòßÑøåØÿðâÿñãüêÝúçÚûèÚûèÛúçÚùçÙøåØüêÝýìÞýìßüéÜûéÛýëÝùæÙñÞÐíÚÌòßÑöãÖõâÕéÖÈãÏÁäÐÂñÞÐõâÔñßÑìÙËïÜÎóßÒôâÔôàÓóàÒöãÖöäÖóßÑíÙËðÝÏøå×þìÞüêÝúèÛùçÚùçÙùæÙñÞÐöãÖúçÚøæØøäÖøæØûèÛùæÙýëÞþôæûìÞðÝÏòßÑóàÒïÜÎèÕÇê×ÉñÞÐùçÚôáÔôàÒûèÛþìÞýëÝûèÛþíßÿîáõâÔîÛÍóàÒöãÕ÷ãÖóßÑïÜÎôáÓüéÜÿìÞýëÝøåØøåØúèÚõâÔýêÝüéÛøå×ôáÓøåØþíàüêÜüêÜþëÝöäÖïÜÎóßÑùæØýìßøæØïÜÎòßÑôáÔ÷ä×øåØôáÓñÝÏöâÕþíßüìßÿðãýíàøæØøåØüêÜûëÝõãÕ÷æØüêÜúèÚüéÜóàÓìØÊíÚÌúèÚþìÞùæØöãÕýëÝùçÙôáÓøåØûéÛöãÕûéÛûéÜõâÔôáÓøåØÿðãýìß÷ä×ñÞÐõáÔüéÛøåØõãÕøæØùçÙöãÖùçÙþðâûéÛ÷åØúèÚüìÞüïáúèÚùæÙøåØúçÚüêÜýìÞóàÒóàÒóàÒõáÓ÷äÖúçÚòßÑïÝÏïÜÎóàÒõâÔôáÓúçÚüêÜúçÚôàÒïÜÎîÛÍðÝÏñÞÐñÞÐóàÒõâÕ÷ä×õãÕóàÓñÞÐïÜÎîÜÎîÜÎôáÓõâÕóàÓíÛÍëÙËìÚÌïÜÎòßÑüêÝÿïáüéÜûèÛþìßýëÞ÷äÖöãÕùçÙ÷ä×ðÞÐðÝÏóàÓûèÛþíßþíßýëÝüëÝøçÙîÛÍîÛÍúèÚÿíßýëÞúæØöãÕôáÓóáÓøåØùæÙîÚÌëØÊøå×ýëÝõâÕôàÓòßÑõáÔúçÚþìÞøåØúçÚûèÛûèÛøå×õâÔòßÑñÞÐîÛÍñÞÐôáÓïÜÎíÙËòßÑôáÔõâÔùæØþìßÿôçüëÝ÷ãÖøå×ûéÛýëÝûíàþîáÿñãûèÚñÝÏïÜÎñÞÐôâÔõâÕôáÓ÷åØüêÜùæÙöãÕûéÛþëÝùæÙ÷ä×þïâÿðâÿïáÿíßýíßýìßúçÚñÞÐê×ÉìÚÌñÞÐóáÓõâÔïÜÎïÜÎñÞÐóàÒöä×ùæÙùçÙøæØöâÔóàÒñÞÐñÞÐñÞÐñÞÑñßÑòàÒóàÒûèÛýêÝüêÝüéÛüêÜýìßûéÛýêÜÿìÞýìÞûéÜùçÙóàÓôáÓôáÔôáÓõâÔõâÕôáÓ÷åØúçÚûéÛùçÙ÷åØòßÑðÝÏîÛÍëÙËëØÊêØÊïÜÎéÖÈãÐÂæÒÄîÛÍöãÕ÷ãÖöãÕõâÔöãÕøå×ùçÚõâÕøæØûèÛþíßüëÝòßÑìÚÌðÝÏõâÕùæÙúçÚùçÙøåØïÜÎê×ÉïÜÎôáÓ÷ãÕõãÕøå×üêÜþìßùæØðÝÏéÖÈñÞÐéÕÇçÓÅòßÑòßÑóàÒõãÖõâÕòßÑõáÓøæØûéÛöãÖïÝÏôáÔûéÛ÷å×ôàÒôáÓ÷å×ýíàüëÞôáÓé×ÉñÞÑùçÙúçÚ÷äÖôáÓùèÛöâÔôàÒùæÙùæÙõâÔæÓÅîÛÍõãÕôáÓñÞÐðÝÏ÷äÖûéÛüêÜùæÙøåØûéÛùæÙöãÖ÷åØôáÓóàÓûêÝÿïâÿðâÿîàûéÜúèÛûéÜòßÑðÝÏñÞÐ÷ä×ùçÙøåØôáÓíÚÌëÙËïÜÎóàÒöãÖ÷åØüéÜýëÝûèÚùåØøæØòÞÐíÚÌæÔÆåÒÄéÖÈíÛÍ÷åØûéÜûéÜøåØ÷äÖøæØ÷å×õâÔðÞÐë×ÉìÙËïÜÎóàÒðÝÏðÝÏôàÒöâÔõáÓñÞÐñÞÐñÞÐõâÔøæØûéÛúçÙúèÚùçÙøå×õâÕóáÓóáÓíÛÍê×ÉîÛÍñÞÐóàÒðÝÐïÜÏçÔÆèÔÆñÞÐòßÒòßÑõáÓóßÒóàÒõáÔñÞÐøåØûèÛüêÜúèÚõâÔðÝÏóßÑñÞÐñÞÐ÷ä×õâÔíÚÌçÔÆéÖÈìÚÌíÚÌéÕÇãÏÁäÒÄíÛÍðÝÏùæÙüéÛñÞÐöãÖùçÙùçÙôâÔòàÒôàÒùçÙõãÕðÝÏ÷äÖÿíàüêÝøåØùçÙüêÝüêÜüéÛþëÝúéÛøåØõâÕôáÓñÞÐïÛÍéÖÈðÝÏòßÑíÚÌê×ÉêÖÉíÚÌìØÊìÙËóàÒ÷äÖõâÔúçÙûéÛþìÞþïáþíàüéÛøåØùæÙñÞÐðÝÏøå×ùçÙóßÑûéÛüéÛîÚÌåÑÃäÐÂðÝÏ÷äÖüéÜùæÙøåØúçÙùçÙ÷åØõâÔõáÓõâÔóàÒöãÖ÷åØõãÖóßÑöãÕúèÛ÷ãÕ÷ãÕöâÔóàÒñÞÐïÜÎîÛÍñÞÐñÞÐîÜÎìÚÌìÙËñÞÐðÝÏîÜÎîÜÎõâÕýêÜýíßùçÙôàÓñÞÐîÛÍë×ÉðÜÎîÛÍìÚÌîÛÍñÞÐôáÓûèÚýêÜýìßýëÞûèÚøåØøæÙ÷åØøåØùæÙõâÕïÜÎêÖÉíÚÍê×ÉïÝÐùçÚûéÛùåØõáÔíÚÌðÝÏúçÙýëÝøåØ÷ä×÷äÖôáÔíÚÌåÒÄïÛÍúçÙýêÜöãÖñÞÐìÚÌîÜÎóàÓóàÓëÙËæÔÆæÓÅëØÊíÚÌðÝÏõâÕôâÔîÜÎóàÒöãÖùæÙøæÙõâÕóßÑôáÓ÷ä×úçÚýëÝûéÜúèÛõâÕóàÒóàÒñÞÐôáÓüêÜÿòäùæØñÞÐòßÑõâÕöãÕíÙËöäÖùæÙõâÔöãÕûëÞþëÝûèÚöãÖúéÛþíßýêÜÿíßýêÜùæØóáÓðÞÑïÜÏñÞÐñÞÐïÜÎöãÕöäÖìÙËë×ÉïÜÏñÝÐïÛÍîÚÌðÝÏðÜÎøä×ýêÝøæØñßÑîÛÍñÞÐ÷ä×øåØøæÙüéÜûèÛûèÛùæÙöãÕóàÓóßÑòàÒúçÚùæÙ÷äÖøåØúèÚüêÝùèÚùæØùæØùæØùæØ÷äÖõâÔ÷ä×úçÚûèÛùæÙ÷äÖõâÔõâÕõâÕöâÕ÷äÖ÷äÖøå×÷äÖõâÔòßÑïÜÎíÚÌðÝÏðÞÐðÞÐðÞÑòßÑóßÑôáÔóáÓóàÓóáÓõâÔõâÕúçÙúèÚúèÚøå×õãÕóáÓñÝÏíÛÍêØÊôáÓýêÝüêÜüéÜùçÙúçÙúçÙóàÒê×ÉçÓÅñÞÐôáÓóàÒòßÑíÚÌðÝÏ÷äÖöâÕîÛÍðÝÐùéÛûèÚúçÙüéÛñÞÐæÓÅæÔÆðÜÎöãÖúçÚöä×ñßÑðÝÏ÷äÖøåØúçÚòßÑë×ÊðÜÎòßÑñÞÐ÷äÖùçÙ÷ä×úçÚøæÙõáÓõâÔüéÛýëÞùçÚøåØýëÞÿìßøåØõâÔôãÕûéÛÿïâýìÞúçÚûèÛúçÚöãÕñßÑêÖÈäÒÄèÖÈïÜÎùæØùæØüîáýïáùçÙøå×øæØòßÒòÞÐúçÙüéÛùæÙ÷ä×øåØúçÚþëÝüéÜ÷ä×òàÒúèÚøæØóàÒõâÔöâÔöãÕöãÖøåØöä×ñÝÏéÖÈèÕÈíÚÌòÞÐ÷ä×øæÙøåØýìÞøå×öãÕûèÛüêÜùæÙóàÒõáÔ÷å×úçÚõâÔîÛÍðÝÏõâÔøæÙùæÙúèÚýëÝþìßúçÚóáÔïÜÎðÝÏñÞÐïÜÎë×ÉæÓÅèÕÇðÜÎ÷ãÖðÝÏòßÑñÞÐðÝÏóáÓøåØöãÕôáÓöä×òßÑéÖÈèÔÆóàÒóáÓðÝÏôáÓýêÜþëÝûéÛùæØòßÑðÞÐ÷å×ûéÛõâÔìØÊãÐÂäÑÃëØÊðÝÏùçÙðÝÏë×ÉñÞÐ÷ä×÷å×ýêÜûèÚúçÙôáÔîÛÍñÞÐ÷ä×úçÙúçÙöãÕôàÓôáÓøåØõãÕöâÕøåØøåØöâÔøçØóáÒòàÒ÷å×öå×ðßÐîÝÎôãÕúéÚüëÜúèÚõäÖþðâúêÛùèÙýíÞþïáüëÝûëÝüïáüîß÷æØòàÒðÞÏîÝÎêØÊè×ÉòàÒúèÚùèÚùçÙùèÙþóäÿøéýîßúèÚùéÜýíàÿðâþìÞýëÝþëÝ÷åØñßÑêÖÈëØÊôâÔýìßÿðáþðáúéÛòáÓðÞÏòàÒóâÔõäÖøæØúèÚøéÛ÷çÙúçÚýêÜþìÞùæÙñÞÐéÖÈìØÊíÚÌóàÒõâÕôàÓ÷ä×øåØûéÛûèÛõãÖòßÑóßÑôàÒòÞÐïÜÎðÝÏõâÕûèÛôáÔíÛÍîÛÎúèÛýïâûëÝñÞÐóáÔóàÒìØÊæÒÄäÐÂòÞÐùæØþíàþíßüêÜúèÚûêÜõáÔîÜÎïÝÏóáÓöâÔùçÙüêÜþñãûêÜòßÑñÞÑîÛÎöãÕúçÚóßÑðÝÏöâÕöãÕíÚÌèÕÇëØÊóàÓøå×øä×÷ä×÷ãÖøå×üéÜÿíßöäÖðÝÏêÖÈëØÊóàÒûéÛ÷ä×ôàÒðÝÏòßÑøå×üêÜøåØúçÚûéÛûéÛûèÛúçÚþíßýîàûëÝöå×õäÖ÷çÙùéÛùçÙøæØøæØøæØøæØ÷å×ñßÑòáÓþîßÿóåþïáóâÔîÝÏîÝÏ÷çØûìÝúëÜùéÛ÷æ×øçØùèÙ÷æ×öäÕ÷æØöå×úéÛüìÞýíÞÿðáýîàûïáùëÝ÷å×ùåØüêÜÿîáýîáøçÙðÝÏñÞÐøå×ýíÞøçØõäÖøçØùèÙøæØôãÕðÞÐðÞÐùéÛþñãÿòãúçÚýëÝÿíàþìÞûèÚ÷äÖïÛÎóàÓ÷å×òßÑìÙËîÛÍñÞÐôáÓõâÔôáÓóßÑôàÒðÝÏíÚÌïÜÎ÷äÖøæÙõâÔìÚÌòßÑõãÖóàÓîÜÎë×ÉèÔÆìÚÌðÝÏóßÑñÞÑîÛÍöãÕúèÚúèÛõâÔôáÓ÷ä×þïáþìÞùæÙöâÕùæØýêÜþëÝþëÝûèÛõâÔîÛÍéÖÈãÐÂçÓÅîÚÍóàÓõâÕùæÙ÷ä×ôâÕôáÔøåØüêÜýêÜðÝÏôáÓøä×ùæÙùçÙúèÚøåØóàÒêØÊðÝÏüëÝÿîáõâÔòßÑñÞÐõâÕöä×õãÕõáÔúçÚýëÝüêÜüêÜþëÝÿôæÿ÷èÿôæûêÛüêÜÿòäÿòäýìÝöå×óâÔôãÕöå×úéÚøæ×øæØúéÛûêÜúèÚùéÛñßÐïÝÎøçÙþíÞýíÞýìÞþïàÿòãúéÛîÝÎèÖÈñàÑôãÕøæØøæØöå×øçÙôàÒîÜÎíÛÍõáÓûèÚüêÜûéÛÿñãÿöèýòåýîàþíß÷æØ÷å×ùçÙúèÚõãÕîÜÍóâÔôãÕòáÓïÝÏõãÕýìÞüêÜûèÛùçÚûèÛþìßþïáýóåýìÞ÷å×òßÑñÞÐôáÓóàÒóàÒòÞÐñÞÐòßÑôàÒöãÖóáÔöãÖüêÜûéÛôáÓöãÖ÷ä×óàÒêÖÈêÖÈîÛÍõâÔóàÓôàÒùæÙûéÛûèÚóßÑôàÓóßÒòÞÐõáÓøåØôáÓùåØùæÙóàÒóàÒùæÙýêÜýëÝùæÙùçÙùæØðÞÐõâÔðÝÏíÛÍ÷ãÕùæÙñÞÐîÛÍòßÑøåØûèÛöãÕîÛÍîÜÎíÚÌñÞÐøåØöãÕïÛÍûéÛýëÝûèÛýëÝýëÞ÷ä×ðÝÏðÝÏóßÑùæÙùçÚöä×üêÜýëÝüéÛôâÕòßÑñÞÐúéÚùçØúéÚýìÝþïàþïáùèÙ÷æØõäÖöå×øçÙúèÚýîßþîßöå×ëÙÊïÝÎùéÛýóåÿñâûêÜóâÔïÞÏîÜÎûêÜþïáýìÞøçØùçÙûéÛ÷æØüêÜûêÜöäÖòáÓïÞÐðÝÏóàÒôáÓñÞÐðÝÏòßÑóßÑóàÒöäÖûìÞüîàûéÛøçÙþîßÿïàøæØòáÒðßÐôâÔúéÚüìÝùéÛûìÞÿòäüéÛ÷ãÖðÜÎðÝÏöâÔúéÛôáÓñÝÏìÚÌîÛÍøä×þìßùæÙõâÔòÞÐóàÓ÷ä×úçÚýìßþíßýìÞùçÙ÷ä×÷ä×ýëÞûèÛøäÖöãÕùåØúèÚüéÛúçÚúçÚüêÜûéÛøåØøæØñßÒñÞÐøåØöãÖïÜÎëÙËôáÓúçÙùæÙ÷åØøæÙ÷ä×óàÒê×ÉìÙËóßÒòßÑøåØùæÙøåØúçÚùæØòßÑòàÒôâÔ÷ä×úçÚöãÖñÞÐöãÕòàÒóàÓøåØõâÕîÛÍôáÔ÷ä×ûèÚûéÛ÷å×ôáÔüìÞúèÚ÷ãÖôàÒôáÔôáÔõâÔôáÔóáÓôáÓöãÖ÷äÖóáÓñßÑóâÔøçÙøçÙõãÔóâÔõäÖøæØüëÜþîßÿðáÿðáÿñâúéÚëÚËé×ÈîÝÏóâÓúéÚûêÜöäÖôâÔöåÖþîßûêÛóâÔïÞÏ÷æ×üìÝùçÙùçÙòáÒðÞÏòàÒðßÐðÞÐüêÜþíßôáÓðÝÏôáÓòßÑîÜÎëÙËëÙËíÚÌîÛÍúéÛûëÜúéÛ÷å×úéÛþîßÿòäýìÝûëÜüïáýðáûëÝôâÔöãÖ÷ãÖôáÔðÝÏìØÊîÛÍöãÕ÷äÖõâÕùåØûèÚøåØöãÖöãÕúèÚüêÜüéÛòßÒóàÓòßÑïÜÎîÛÍïÜÎóàÓöãÖûèÚüêÝùæÙôâÔðÝÏóàÒöãÖ÷äÖôáÓòÞÐòßÑïÝÏðÞÐ÷ä×öãÖðÞÑìÙËîÛÍòßÑöäÖöäÖôáÓñÞÐîÛÍëØÊíÚÌôáÔúçÚõâÕõáÓõâÔñÞÑïÜÎñÞÐöãÖñÞÐîÛÍñÞÐôâÔöãÖùæÙùæÙ÷ä×óàÓòßÑðÝÏïÜÎîÛÍôàÒõâÔöãÕüìÞÿîàÿíàûéÛôâÕòßÑóàÒñÞÐîÛÍïÜÎõáÓûèÛýëÝ÷å×ùèÙúéÛ÷æØôãÕñàÒûêÛüêÜüëÜýìÝþíÞþíÞþîàýíÞûëÜúéÚ÷æ×öäÖöäÖúéÚþíßýìÝúéÚúèÚüêÜùèÚúéÚùèÙúéÛýíßþíßýìÝøæØúêÛýðâüìÞ÷ä×øå×úçÚúèÚóáÓë×ÉìÙË÷äÖúçÙòßÒîÛÍðÝÏóâÔðßÐñàÑ÷æØûêÜûêÜúëÝõäÖîÜÍêÙÊíÜÍñßÑøåØùæÙøåØôàÓðÝÏìÙËòßÑúçÚüêÜýêÜýêÜ÷å×÷ä×øæÙûéÛþìÞúèÚóáÓñÞÐïÜÎñÞÐúèÚúèÚõâÕïÜÎðÝÏîÜÎêÖÉíÙÌòßÑðÝÏðÝÏîÛÍëÙËîÜÎóáÓóàÒôáÓóàÒîÛÍíÚÌïÜÏôáÓìÙËê×ÉóàÒõâÕðÝÏïÜÎôáÓûëÝúçÙðÝÏîÜÎ \ No newline at end of file
diff --git a/examples/scrollview/scrollview.cpp b/examples/scrollview/scrollview.cpp
new file mode 100644
index 000000000..994cd292c
--- /dev/null
+++ b/examples/scrollview/scrollview.cpp
@@ -0,0 +1,441 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qscrollview.h>
+#include <qapplication.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qmessagebox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qmultilineedit.h>
+#include <qsizegrip.h>
+#include <stdlib.h>
+
+
+static const int style_id = 0x1000;
+static const int lw_id = 0x2000;
+static const int mlw_id = 0x4000;
+static const int mw_id = 0x8000;
+static const int max_lw = 16;
+static const int max_mlw = 5;
+static const int max_mw = 10;
+
+
+class BigShrinker : public TQFrame {
+ Q_OBJECT
+public:
+ BigShrinker(TQWidget* parent) :
+ TQFrame(parent)
+ {
+ setFrameStyle(TQFrame::Box|TQFrame::Sunken);
+ int h=35;
+ int b=0;
+ for (int y=0; y<2000-h; y+=h+10) {
+ if (y == 0) {
+ TQButton* q=new TQPushButton("Quit", this);
+ connect(q, SIGNAL(clicked()), qApp, SLOT(tquit()));
+ } else {
+ TQString str;
+ if ( b > 0 ) {
+ str.sprintf("Button %d", b++);
+ } else {
+ str = "I'm shrinking!";
+ ++b;
+ }
+ (new TQPushButton(str, this))->move(y/2,y);
+ }
+ }
+ resize(1000,2000);
+
+ startTimer(250);
+ }
+
+ void timerEvent(TQTimerEvent*)
+ {
+ int w=width();
+ int h=height();
+ if ( w > 50 ) w -= 1;
+ if ( h > 50 ) h -= 2;
+ resize(w,h);
+ }
+
+ void mouseReleaseEvent(TQMouseEvent* e)
+ {
+ emit clicked(e->x(), e->y());
+ }
+
+signals:
+ void clicked(int,int);
+};
+
+class BigMatrix : public TQScrollView {
+ TQMultiLineEdit *dragging;
+public:
+ BigMatrix(TQWidget* parent) :
+ TQScrollView(parent,"matrix", WStaticContents),
+ bg("bg.ppm")
+ {
+ bg.load("bg.ppm");
+ resizeContents(400000,300000);
+
+ dragging = 0;
+ }
+
+ void viewportMousePressEvent(TQMouseEvent* e)
+ {
+ int x, y;
+ viewportToContents( e->x(), e->y(), x, y );
+ dragging = new TQMultiLineEdit(viewport(),"Another");
+ dragging->setText("Thanks!");
+ dragging->resize(100,100);
+ addChild(dragging, x, y);
+ showChild(dragging);
+ }
+
+ void viewportMouseReleaseEvent(TQMouseEvent*)
+ {
+ dragging = 0;
+ }
+
+ void viewportMouseMoveEvent(TQMouseEvent* e)
+ {
+ if ( dragging ) {
+ int mx, my;
+ viewportToContents( e->x(), e->y(), mx, my );
+ int cx = childX(dragging);
+ int cy = childY(dragging);
+ int w = mx - cx + 1;
+ int h = my - cy + 1;
+ TQString msg;
+ msg.sprintf("at (%d,%d) %d by %d",cx,cy,w,h);
+ dragging->setText(msg);
+ dragging->resize(w,h);
+ }
+ }
+
+protected:
+ void drawContents(TQPainter* p, int cx, int cy, int cw, int ch)
+ {
+ // The Background
+ if ( !bg.isNull() ) {
+ int rowheight=bg.height();
+ int toprow=cy/rowheight;
+ int bottomrow=(cy+ch+rowheight-1)/rowheight;
+ int colwidth=bg.width();
+ int leftcol=cx/colwidth;
+ int rightcol=(cx+cw+colwidth-1)/colwidth;
+ for (int r=toprow; r<=bottomrow; r++) {
+ int py=r*rowheight;
+ for (int c=leftcol; c<=rightcol; c++) {
+ int px=c*colwidth;
+ p->drawPixmap(px, py, bg);
+ }
+ }
+ } else {
+ p->fillRect(cx, cy, cw, ch, TQColor(240,222,208));
+ }
+
+ // The Numbers
+ {
+ TQFontMetrics fm=p->fontMetrics();
+ int rowheight=fm.lineSpacing();
+ int toprow=cy/rowheight;
+ int bottomrow=(cy+ch+rowheight-1)/rowheight;
+ int colwidth=fm.width("00000,000000 ")+3;
+ int leftcol=cx/colwidth;
+ int rightcol=(cx+cw+colwidth-1)/colwidth;
+ TQString str;
+ for (int r=toprow; r<=bottomrow; r++) {
+ int py=r*rowheight;
+ for (int c=leftcol; c<=rightcol; c++) {
+ int px=c*colwidth;
+ str.sprintf("%d,%d",c,r);
+ p->drawText(px+3, py+fm.ascent(), str);
+ }
+ }
+
+ // The Big Hint
+ if (leftcol<10 && toprow<5) {
+ p->setFont(TQFont("Charter",30));
+ p->setPen(red);
+ TQString text;
+ text.sprintf("HINT: Look at %d,%d",215000/colwidth,115000/rowheight);
+ p->drawText(100,50,text);
+ }
+ }
+
+ // The Big X
+ {
+ if (cx+cw>200000 && cy+ch>100000 && cx<230000 && cy<130000) {
+ // Note that some X server cannot even handle co-ordinates
+ // beyond about 4000, so you might not see this.
+ p->drawLine(200000,100000,229999,129999);
+ p->drawLine(229999,100000,200000,129999);
+
+ // X marks the spot!
+ p->setFont(TQFont("Charter",100));
+ p->setPen(blue);
+ p->drawText(215000-500,115000-100,1000,200,AlignCenter,"YOU WIN!!!!!");
+ }
+ }
+ }
+
+private:
+ TQPixmap bg;
+};
+
+class ScrollViewExample : public TQWidget {
+ Q_OBJECT
+
+public:
+ ScrollViewExample(int technique, TQWidget* parent=0, const char* name=0) :
+ TQWidget(parent,name)
+ {
+ TQMenuBar* menubar = new TQMenuBar(this);
+ Q_CHECK_PTR( menubar );
+
+ TQPopupMenu* file = new TQPopupMenu( menubar );
+ Q_CHECK_PTR( file );
+ menubar->insertItem( "&File", file );
+ file->insertItem( "Quit", qApp, SLOT(tquit()) );
+
+ vp_options = new TQPopupMenu( menubar );
+ Q_CHECK_PTR( vp_options );
+ vp_options->setCheckable( TRUE );
+ menubar->insertItem( "&ScrollView", vp_options );
+ connect( vp_options, SIGNAL(activated(int)),
+ this, SLOT(doVPMenuItem(int)) );
+
+ vauto_id = vp_options->insertItem( "Vertical Auto" );
+ vaoff_id = vp_options->insertItem( "Vertical AlwaysOff" );
+ vaon_id = vp_options->insertItem( "Vertical AlwaysOn" );
+ vp_options->insertSeparator();
+ hauto_id = vp_options->insertItem( "Horizontal Auto" );
+ haoff_id = vp_options->insertItem( "Horizontal AlwaysOff" );
+ haon_id = vp_options->insertItem( "Horizontal AlwaysOn" );
+ vp_options->insertSeparator();
+ corn_id = vp_options->insertItem( "cornerWidget" );
+
+ if (technique == 1) {
+ vp = new TQScrollView(this);
+ BigShrinker *bs = new BigShrinker(0);//(vp->viewport());
+ vp->addChild(bs);
+ bs->setAcceptDrops(TRUE);
+ TQObject::connect(bs, SIGNAL(clicked(int,int)),
+ vp, SLOT(center(int,int)));
+ } else {
+ vp = new BigMatrix(this);
+ if ( technique == 3 )
+ vp->enableClipper(TRUE);
+ srand(1);
+ for (int i=0; i<30; i++) {
+ TQMultiLineEdit *l = new TQMultiLineEdit(vp->viewport(),"First");
+ l->setText("Drag out more of these.");
+ l->resize(100,100);
+ vp->addChild(l, rand()%800, rand()%10000);
+ }
+ vp->viewport()->setBackgroundMode(NoBackground);
+ }
+
+ f_options = new TQPopupMenu( menubar );
+ Q_CHECK_PTR( f_options );
+ f_options->setCheckable( TRUE );
+ menubar->insertItem( "F&rame", f_options );
+ connect( f_options, SIGNAL(activated(int)),
+ this, SLOT(doFMenuItem(int)) );
+
+ f_options->insertItem( "No Frame", style_id );
+ f_options->insertItem( "Box", style_id|TQFrame::Box );
+ f_options->insertItem( "Panel", style_id|TQFrame::Panel );
+ f_options->insertItem( "WinPanel", style_id|TQFrame::WinPanel );
+ f_options->insertSeparator();
+ f_options->insertItem( "Plain", style_id|TQFrame::Plain );
+ f_options->insertItem( "Raised", style_id|TQFrame::Raised );
+ f_laststyle = f_options->indexOf(
+ f_options->insertItem( "Sunken", style_id|TQFrame::Sunken ));
+ f_options->insertSeparator();
+ lw_options = new TQPopupMenu( menubar );
+ Q_CHECK_PTR( lw_options );
+ lw_options->setCheckable( TRUE );
+ for (int lw = 1; lw <= max_lw; lw++) {
+ TQString str;
+ str.sprintf("%d Pixels", lw);
+ lw_options->insertItem( str, lw_id | lw );
+ }
+ f_options->insertItem( "Line Width", lw_options );
+ connect( lw_options, SIGNAL(activated(int)),
+ this, SLOT(doFMenuItem(int)) );
+ mlw_options = new TQPopupMenu( menubar );
+ Q_CHECK_PTR( mlw_options );
+ mlw_options->setCheckable( TRUE );
+ for (int mlw = 0; mlw <= max_mlw; mlw++) {
+ TQString str;
+ str.sprintf("%d Pixels", mlw);
+ mlw_options->insertItem( str, mlw_id | mlw );
+ }
+ f_options->insertItem( "Midline Width", mlw_options );
+ connect( mlw_options, SIGNAL(activated(int)),
+ this, SLOT(doFMenuItem(int)) );
+ mw_options = new TQPopupMenu( menubar );
+ Q_CHECK_PTR( mw_options );
+ mw_options->setCheckable( TRUE );
+ for (int mw = 0; mw <= max_mw; mw++) {
+ TQString str;
+ str.sprintf("%d Pixels", mw);
+ mw_options->insertItem( str, mw_id | mw );
+ }
+ f_options->insertItem( "Margin Width", mw_options );
+ connect( mw_options, SIGNAL(activated(int)),
+ this, SLOT(doFMenuItem(int)) );
+
+ setVPMenuItems();
+ setFMenuItems();
+
+ TQVBoxLayout* vbox = new TQVBoxLayout(this);
+ vbox->setMenuBar(menubar);
+ menubar->setSeparator(TQMenuBar::InWindowsStyle);
+ vbox->addWidget(vp);
+ vbox->activate();
+
+ corner = new TQSizeGrip(this);
+ corner->hide();
+ }
+
+private slots:
+ void doVPMenuItem(int id)
+ {
+ if (id == vauto_id ) {
+ vp->setVScrollBarMode(TQScrollView::Auto);
+ } else if (id == vaoff_id) {
+ vp->setVScrollBarMode(TQScrollView::AlwaysOff);
+ } else if (id == vaon_id) {
+ vp->setVScrollBarMode(TQScrollView::AlwaysOn);
+ } else if (id == hauto_id) {
+ vp->setHScrollBarMode(TQScrollView::Auto);
+ } else if (id == haoff_id) {
+ vp->setHScrollBarMode(TQScrollView::AlwaysOff);
+ } else if (id == haon_id) {
+ vp->setHScrollBarMode(TQScrollView::AlwaysOn);
+ } else if (id == corn_id) {
+ bool corn = !vp->cornerWidget();
+ vp->setCornerWidget(corn ? corner : 0);
+ } else {
+ return; // Not for us to process.
+ }
+ setVPMenuItems();
+ }
+
+ void setVPMenuItems()
+ {
+ TQScrollView::ScrollBarMode vm = vp->vScrollBarMode();
+ vp_options->setItemChecked( vauto_id, vm == TQScrollView::Auto );
+ vp_options->setItemChecked( vaoff_id, vm == TQScrollView::AlwaysOff );
+ vp_options->setItemChecked( vaon_id, vm == TQScrollView::AlwaysOn );
+
+ TQScrollView::ScrollBarMode hm = vp->hScrollBarMode();
+ vp_options->setItemChecked( hauto_id, hm == TQScrollView::Auto );
+ vp_options->setItemChecked( haoff_id, hm == TQScrollView::AlwaysOff );
+ vp_options->setItemChecked( haon_id, hm == TQScrollView::AlwaysOn );
+
+ vp_options->setItemChecked( corn_id, !!vp->cornerWidget() );
+ }
+
+ void doFMenuItem(int id)
+ {
+ if (id & style_id) {
+ int sty;
+
+ if (id == style_id) {
+ sty = 0;
+ } else if (id & TQFrame::MShape) {
+ sty = vp->frameStyle()&TQFrame::MShadow;
+ sty = (sty ? sty : TQFrame::Plain) | (id&TQFrame::MShape);
+ } else {
+ sty = vp->frameStyle()&TQFrame::MShape;
+ sty = (sty ? sty : TQFrame::Box) | (id&TQFrame::MShadow);
+ }
+ vp->setFrameStyle(sty);
+ } else if (id & lw_id) {
+ vp->setLineWidth(id&~lw_id);
+ } else if (id & mlw_id) {
+ vp->setMidLineWidth(id&~mlw_id);
+ } else {
+ vp->setMargin(id&~mw_id);
+ }
+
+ vp->update();
+ setFMenuItems();
+ }
+
+ void setFMenuItems()
+ {
+ int sty = vp->frameStyle();
+
+ f_options->setItemChecked( style_id, !sty );
+
+ for (int i=1; i <= f_laststyle; i++) {
+ int id = f_options->idAt(i);
+ if (id & TQFrame::MShape)
+ f_options->setItemChecked( id,
+ ((id&TQFrame::MShape) == (sty&TQFrame::MShape)) );
+ else
+ f_options->setItemChecked( id,
+ ((id&TQFrame::MShadow) == (sty&TQFrame::MShadow)) );
+ }
+
+ for (int lw=1; lw<=max_lw; lw++)
+ lw_options->setItemChecked( lw_id|lw, vp->lineWidth() == lw );
+
+ for (int mlw=0; mlw<=max_mlw; mlw++)
+ mlw_options->setItemChecked( mlw_id|mlw, vp->midLineWidth() == mlw );
+
+ for (int mw=0; mw<=max_mw; mw++)
+ mw_options->setItemChecked( mw_id|mw, vp->margin() == mw );
+ }
+
+private:
+ TQScrollView* vp;
+ TQPopupMenu* vp_options;
+ TQPopupMenu* f_options;
+ TQPopupMenu* lw_options;
+ TQPopupMenu* mlw_options;
+ TQPopupMenu* mw_options;
+ TQSizeGrip* corner;
+
+ int vauto_id, vaoff_id, vaon_id,
+ hauto_id, haoff_id, haon_id,
+ corn_id;
+
+ int f_laststyle;
+};
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ ScrollViewExample ve1(1,0,"ve1");
+ ScrollViewExample ve2(2,0,"ve2");
+ ScrollViewExample ve3(3,0,"ve3");
+ ve1.setCaption("TQt Example - Scrollviews");
+ ve1.show();
+ ve2.setCaption("TQt Example - Scrollviews");
+ ve2.show();
+ ve3.setCaption("TQt Example - Scrollviews");
+ ve3.show();
+
+ TQObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit()));
+
+ return a.exec();
+}
+
+#include "scrollview.moc"
diff --git a/examples/scrollview/scrollview.doc b/examples/scrollview/scrollview.doc
new file mode 100644
index 000000000..48989f42e
--- /dev/null
+++ b/examples/scrollview/scrollview.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page scrollview-example.html
+
+ \ingroup examples
+ \title Scrollview
+
+ This example shows how to use Qt's scrollview. This is a widget
+ optimized for very large contents.
+
+ <hr>
+
+ Implementation:
+
+ \include scrollview/scrollview.cpp
+*/
+
diff --git a/examples/scrollview/scrollview.pro b/examples/scrollview/scrollview.pro
new file mode 100644
index 000000000..2203f4b0f
--- /dev/null
+++ b/examples/scrollview/scrollview.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = scrollview
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS =
+SOURCES = scrollview.cpp
diff --git a/examples/showimg/README b/examples/showimg/README
new file mode 100644
index 000000000..a6c9ca982
--- /dev/null
+++ b/examples/showimg/README
@@ -0,0 +1,14 @@
+This example demonstrates how to read in and display images, and the
+conversion facilities available. The CuteWidget can read a file into
+a pixmap and resizes the displayed pixmap when the widget is resized.
+
+Note that the function CuteWidget::paintEvent uses the drawPixmap function
+of QPainter to display the pixmap, the bitBlt function can also be used to
+display pixmaps.
+
+If you have installed the Qt imageio extension (see extensions/imageio
+in your Qt directory), you can build using that extension.
+
+Some of the conversion options will have no effect, depending on the
+display hardware used. Generally, these are disabled.
+
diff --git a/examples/showimg/imagefip.cpp b/examples/showimg/imagefip.cpp
new file mode 100644
index 000000000..418b612c2
--- /dev/null
+++ b/examples/showimg/imagefip.cpp
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "imagefip.h"
+#include <qimage.h>
+
+/* XPM */
+static const char *image_xpm[] = {
+"17 15 9 1",
+" c #7F7F7F",
+". c #FFFFFF",
+"X c #00B6FF",
+"o c #BFBFBF",
+"O c #FF6C00",
+"+ c #000000",
+"@ c #0000FF",
+"# c #6CFF00",
+"$ c #FFB691",
+" ..XX",
+" ........o .XXX",
+" .OOOOOOOo. XXX+",
+" .O@@@@@@+++XXX++",
+" .O@@@@@@O.XXX+++",
+" .O@@@@@@OXXX+++.",
+" .O######XXX++...",
+" .O#####XXX++....",
+" .O##$#$XX+o+....",
+" .O#$$$$$+.o+....",
+" .O##$$##O.o+....",
+" .OOOOOOOO.o+....",
+" ..........o+....",
+" ooooooooooo+....",
+"+++++++++++++...."
+};
+
+ImageIconProvider::ImageIconProvider( TQWidget *parent, const char *name ) :
+ TQFileIconProvider( parent, name ),
+ imagepm(image_xpm)
+{
+ fmts = TQImage::inputFormats();
+}
+
+ImageIconProvider::~ImageIconProvider()
+{
+}
+
+const TQPixmap * ImageIconProvider::pixmap( const TQFileInfo &fi )
+{
+ TQString ext = fi.extension().upper();
+ if ( fmts.contains(ext) ) {
+ return &imagepm;
+ } else {
+ return TQFileIconProvider::pixmap(fi);
+ }
+}
diff --git a/examples/showimg/imagefip.h b/examples/showimg/imagefip.h
new file mode 100644
index 000000000..3537f9420
--- /dev/null
+++ b/examples/showimg/imagefip.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef IMAGEFIP_H
+#define IMAGEFIP_H
+
+#include <qfiledialog.h>
+#include <qstrlist.h>
+#include <qpixmap.h>
+
+class ImageIconProvider : public TQFileIconProvider
+{
+ Q_OBJECT
+ TQStrList fmts;
+ TQPixmap imagepm;
+
+public:
+ ImageIconProvider( TQWidget *parent=0, const char *name=0 );
+ ~ImageIconProvider();
+
+ const TQPixmap * pixmap( const TQFileInfo &fi );
+};
+
+
+#endif // IMAGEFIP_H
diff --git a/examples/showimg/imagetexteditor.cpp b/examples/showimg/imagetexteditor.cpp
new file mode 100644
index 000000000..464f85d9c
--- /dev/null
+++ b/examples/showimg/imagetexteditor.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "imagetexteditor.h"
+#include <qimage.h>
+#include <qlayout.h>
+#include <qgrid.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qcombobox.h>
+#include <qmultilineedit.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+
+
+ImageTextEditor::ImageTextEditor( TQImage& i, TQWidget *parent, const char *name, WFlags f ) :
+ TQDialog(parent,name,TRUE,f),
+ image(i)
+{
+ TQVBoxLayout* vbox = new TQVBoxLayout(this,8);
+ vbox->setAutoAdd(TRUE);
+
+ TQGrid* controls = new TQGrid(3,TQGrid::Horizontal,this);
+ controls->setSpacing(8);
+ TQLabel* l;
+ l=new TQLabel("Language",controls); l->setAlignment(AlignCenter);
+ l=new TQLabel("Key",controls); l->setAlignment(AlignCenter);
+ (void)new TQLabel("",controls); // dummy
+ languages = new TQComboBox(controls);
+ keys = new TQComboBox(controls);
+ TQPushButton* remove = new TQPushButton("Remove",controls);
+
+ newlang = new TQLineEdit(controls);
+ newkey = new TQLineEdit(controls);
+ TQPushButton* add = new TQPushButton("Add",controls);
+
+ text = new TQMultiLineEdit(this);
+
+ TQHBox* hbox = new TQHBox(this);
+ TQPushButton* cancel = new TQPushButton("Cancel",hbox);
+ TQPushButton* ok = new TQPushButton("OK",hbox);
+
+ connect(add,SIGNAL(clicked()),
+ this,SLOT(addText()));
+
+ connect(remove,SIGNAL(clicked()),
+ this,SLOT(removeText()));
+
+ connect(ok,SIGNAL(clicked()),
+ this,SLOT(accept()));
+
+ connect(cancel,SIGNAL(clicked()),
+ this,SLOT(reject()));
+
+ connect(languages,SIGNAL(activated(int)),
+ this,SLOT(updateText()));
+
+ connect(keys,SIGNAL(activated(int)),
+ this,SLOT(updateText()));
+
+ imageChanged();
+}
+
+ImageTextEditor::~ImageTextEditor()
+{
+}
+
+void ImageTextEditor::imageChanged()
+{
+ languages->clear();
+ keys->clear();
+ text->clear();
+ languages->insertItem("<any>");
+
+ languages->insertStringList(image.textLanguages());
+ keys->insertStringList(image.textKeys());
+
+ updateText();
+}
+
+void ImageTextEditor::accept()
+{
+ storeText();
+ TQDialog::accept();
+}
+
+void ImageTextEditor::updateText()
+{
+ storeText();
+ newlang->setText(languages->currentText());
+ newkey->setText(keys->currentText());
+ TQString t = image.text(currKey(),currLang());
+
+ text->setText(t);
+}
+
+TQString ImageTextEditor::currKey()
+{
+ return newkey->text();
+}
+
+TQString ImageTextEditor::currLang()
+{
+ TQString l = newlang->text();
+ if ( l=="<any>" )
+ l = TQString::null;
+ return l;
+}
+
+TQString ImageTextEditor::currText()
+{
+ TQString t = text->text();
+ if ( t.isNull() ) t = "";
+ return t;
+}
+
+
+void ImageTextEditor::removeText()
+{
+ image.setText(currKey(),currLang(),TQString::null);
+}
+
+void ImageTextEditor::addText()
+{
+ storeText();
+}
+
+void ImageTextEditor::storeText()
+{
+ if ( currKey().length() > 0 ) {
+ image.setText(currKey(),currLang(),currText());
+ }
+}
diff --git a/examples/showimg/imagetexteditor.h b/examples/showimg/imagetexteditor.h
new file mode 100644
index 000000000..e33b6e70f
--- /dev/null
+++ b/examples/showimg/imagetexteditor.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef IMAGETEXTEDITOR_H
+#define IMAGETEXTEDITOR_H
+
+#include <qdialog.h>
+
+class TQImage;
+class TQComboBox;
+class TQListBox;
+class TQLineEdit;
+class TQMultiLineEdit;
+
+class ImageTextEditor : public TQDialog
+{
+ Q_OBJECT
+public:
+ ImageTextEditor( TQImage& i, TQWidget *parent=0, const char *name=0, WFlags f=0 );
+ ~ImageTextEditor();
+ void accept();
+public slots:
+ void imageChanged();
+ void updateText();
+ void addText();
+ void removeText();
+private:
+ void storeText();
+ TQImage& image;
+ TQComboBox* languages;
+ TQComboBox* keys;
+ TQMultiLineEdit* text;
+ TQLineEdit* newlang;
+ TQLineEdit* newkey;
+ TQString currKey();
+ TQString currLang();
+ TQString currText();
+};
+
+#endif // IMAGETEXTEDITOR_H
diff --git a/examples/showimg/main.cpp b/examples/showimg/main.cpp
new file mode 100644
index 000000000..213b91216
--- /dev/null
+++ b/examples/showimg/main.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "showimg.h"
+#include "imagefip.h"
+#include <qapplication.h>
+#include <qimage.h>
+
+int main( int argc, char **argv )
+{
+ if ( argc > 1 && TQString(argv[1]) == "-m" ) {
+ TQApplication::setColorSpec( TQApplication::ManyColor );
+ argc--;
+ argv++;
+ }
+ else if ( argc > 1 && TQString(argv[1]) == "-n" ) {
+ TQApplication::setColorSpec( TQApplication::NormalColor );
+ argc--;
+ argv++;
+ }
+ else {
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ }
+
+ TQApplication a( argc, argv );
+
+ ImageIconProvider iip;
+ TQFileDialog::setIconProvider( &iip );
+
+ if ( argc <= 1 ) {
+ // Create a window which looks after its own existence.
+ ImageViewer *w =
+ new ImageViewer(0, "new window", TQt::WDestructiveClose | TQt::WResizeNoErase );
+ w->setCaption("TQt Example - Image Viewer");
+ w->show();
+ } else {
+ for ( int i=1; i<argc; i++ ) {
+ // Create a window which looks after its own existence.
+ ImageViewer *w =
+ new ImageViewer(0, argv[i], TQt::WDestructiveClose | TQt::WResizeNoErase );
+ w->setCaption("TQt Example - Image Viewer");
+ w->loadImage( argv[i] );
+ w->show();
+ }
+ }
+
+ TQObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(tquit()));
+
+ return a.exec();
+}
diff --git a/examples/showimg/showimg.cpp b/examples/showimg/showimg.cpp
new file mode 100644
index 000000000..905f8184a
--- /dev/null
+++ b/examples/showimg/showimg.cpp
@@ -0,0 +1,672 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "showimg.h"
+#include "imagetexteditor.h"
+#include <qmenubar.h>
+#include <qfiledialog.h>
+#include <qmessagebox.h>
+#include <qpopupmenu.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qapplication.h>
+#include <qclipboard.h>
+
+
+/*
+ In the constructor, we just pass the standard parameters on to
+ TQWidget.
+
+ The menu uses a single slot to simplify the process of adding
+ more items to the options menu.
+*/
+ImageViewer::ImageViewer( TQWidget *parent, const char *name, int wFlags )
+ : TQWidget( parent, name, wFlags ),
+ conversion_flags( PreferDither ),
+ helpmsg( 0 )
+{
+ pickx = -1;
+ picky = -1;
+ clickx = -1;
+ clicky = -1;
+ alloc_context = 0;
+
+ menubar = new TQMenuBar(this);
+ menubar->setSeparator( TQMenuBar::InWindowsStyle );
+
+ TQStrList fmt = TQImage::outputFormats();
+ saveimage = new TQPopupMenu( menubar );
+ savepixmap = new TQPopupMenu( menubar );
+ for (const char* f = fmt.first(); f; f = fmt.next()) {
+ saveimage->insertItem( f );
+ savepixmap->insertItem( f );
+ }
+ connect( saveimage, SIGNAL(activated(int)), this, SLOT(saveImage(int)) );
+ connect( savepixmap, SIGNAL(activated(int)), this, SLOT(savePixmap(int)) );
+
+ file = new TQPopupMenu( menubar );
+ menubar->insertItem( "&File", file );
+ file->insertItem( "&New window", this, SLOT(newWindow()), CTRL+Key_N );
+ file->insertItem( "&Open...", this, SLOT(openFile()), CTRL+Key_O );
+ si = file->insertItem( "Save image", saveimage );
+ sp = file->insertItem( "Save pixmap", savepixmap );
+ file->insertSeparator();
+ file->insertItem( "E&xit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ edit = new TQPopupMenu( menubar );
+ menubar->insertItem( "&Edit", edit );
+ edit->insertItem("&Copy", this, SLOT(copy()), CTRL+Key_C);
+ edit->insertItem("&Paste", this, SLOT(paste()), CTRL+Key_V);
+ edit->insertSeparator();
+ edit->insertItem("&Horizontal flip", this, SLOT(hFlip()), ALT+Key_H);
+ edit->insertItem("&Vertical flip", this, SLOT(vFlip()), ALT+Key_V);
+ edit->insertItem("&Rotate 180", this, SLOT(rot180()), ALT+Key_R);
+ edit->insertSeparator();
+ edit->insertItem("&Text...", this, SLOT(editText()));
+ edit->insertSeparator();
+ t1 = edit->insertItem( "Convert to &1 bit", this, SLOT(to1Bit()) );
+ t8 = edit->insertItem( "Convert to &8 bit", this, SLOT(to8Bit()) );
+ t32 = edit->insertItem( "Convert to &32 bit", this, SLOT(to32Bit()) );
+
+ options = new TQPopupMenu( menubar );
+ menubar->insertItem( "&Options", options );
+ ac = options->insertItem( "AutoColor" );
+ co = options->insertItem( "ColorOnly" );
+ mo = options->insertItem( "MonoOnly" );
+ options->insertSeparator();
+ fd = options->insertItem( "DiffuseDither" );
+ bd = options->insertItem( "OrderedDither" );
+ td = options->insertItem( "ThresholdDither" );
+ options->insertSeparator();
+ ta = options->insertItem( "ThresholdAlphaDither" );
+ ba = options->insertItem( "OrderedAlphaDither" );
+ fa = options->insertItem( "DiffuseAlphaDither" );
+ options->insertSeparator();
+ ad = options->insertItem( "PreferDither" );
+ dd = options->insertItem( "AvoidDither" );
+ options->insertSeparator();
+ ss = options->insertItem( "Smooth scaling" );
+ cc = options->insertItem( "Use color context" );
+ if ( TQApplication::colorSpec() == TQApplication::ManyColor )
+ options->setItemEnabled( cc, FALSE );
+ options->setCheckable( TRUE );
+ setMenuItemFlags();
+
+ menubar->insertSeparator();
+
+ TQPopupMenu* help = new TQPopupMenu( menubar );
+ menubar->insertItem( "&Help", help );
+ help->insertItem( "Help!", this, SLOT(giveHelp()), CTRL+Key_H );
+
+ connect( options, SIGNAL(activated(int)), this, SLOT(doOption(int)) );
+
+ status = new TQLabel(this);
+ status->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken );
+ status->setFixedHeight( fontMetrics().height() + 4 );
+
+ setMouseTracking( TRUE );
+}
+
+ImageViewer::~ImageViewer()
+{
+ if ( alloc_context )
+ TQColor::destroyAllocContext( alloc_context );
+ if ( other == this )
+ other = 0;
+}
+
+/*
+ This function modifies the conversion_flags when an options menu item
+ is selected, then ensures all menu items are up to date, and reconverts
+ the image if possibly necessary.
+*/
+void ImageViewer::doOption(int item)
+{
+ if ( item == ss || item == cc ) {
+ // Toggle
+ bool newbool = !options->isItemChecked(item);
+ options->setItemChecked(item, newbool);
+ // And reconvert...
+ reconvertImage();
+ repaint(image.hasAlphaBuffer()); // show image in widget
+ return;
+ }
+
+ if ( options->isItemChecked( item ) ) return; // They are all radio buttons
+
+ int ocf = conversion_flags;
+
+ if ( item == ac ) {
+ conversion_flags = ( conversion_flags & ~ColorMode_Mask ) | AutoColor;
+ } else if ( item == co ) {
+ conversion_flags = ( conversion_flags & ~ColorMode_Mask ) | ColorOnly;
+ } else if ( item == mo ) {
+ conversion_flags = ( conversion_flags & ~ColorMode_Mask ) | MonoOnly;
+ } else if ( item == fd ) {
+ conversion_flags = ( conversion_flags & ~Dither_Mask ) | DiffuseDither;
+ } else if ( item == bd ) {
+ conversion_flags = ( conversion_flags & ~Dither_Mask ) | OrderedDither;
+ } else if ( item == td ) {
+ conversion_flags = ( conversion_flags & ~Dither_Mask ) | ThresholdDither;
+ } else if ( item == ta ) {
+ conversion_flags = ( conversion_flags & ~AlphaDither_Mask ) | ThresholdAlphaDither;
+ } else if ( item == fa ) {
+ conversion_flags = ( conversion_flags & ~AlphaDither_Mask ) | DiffuseAlphaDither;
+ } else if ( item == ba ) {
+ conversion_flags = ( conversion_flags & ~AlphaDither_Mask ) | OrderedAlphaDither;
+ } else if ( item == ad ) {
+ conversion_flags = ( conversion_flags & ~DitherMode_Mask ) | PreferDither;
+ } else if ( item == dd ) {
+ conversion_flags = ( conversion_flags & ~DitherMode_Mask ) | AvoidDither;
+ }
+
+ if ( ocf != conversion_flags ) {
+ setMenuItemFlags();
+ // And reconvert...
+ reconvertImage();
+ repaint(image.hasAlphaBuffer()); // show image in widget
+ }
+}
+
+/*
+ Set the options menu to reflect the conversion_flags value.
+*/
+void ImageViewer::setMenuItemFlags()
+{
+ // File
+ bool valid_image = pm.size() != TQSize( 0, 0 );
+ file->setItemEnabled( si, valid_image );
+ file->setItemEnabled( sp, valid_image );
+
+ // Edit
+ edit->setItemEnabled( t1, image.depth() != 1 );
+ edit->setItemEnabled( t8, image.depth() != 8 );
+ edit->setItemEnabled( t32, image.depth() != 32 );
+
+ // Options
+ bool may_need_color_dithering =
+ !valid_image
+ || image.depth() == 32 && TQPixmap::defaultDepth() < 24;
+ bool may_need_dithering = may_need_color_dithering
+ || image.depth() > 1 && options->isItemChecked(mo)
+ || image.depth() > 1 && TQPixmap::defaultDepth() == 1;
+ bool has_alpha_mask = !valid_image || image.hasAlphaBuffer();
+
+ options->setItemEnabled( fd, may_need_dithering );
+ options->setItemEnabled( bd, may_need_dithering );
+ options->setItemEnabled( td, may_need_dithering );
+
+ options->setItemEnabled( ta, has_alpha_mask );
+ options->setItemEnabled( fa, has_alpha_mask );
+ options->setItemEnabled( ba, has_alpha_mask );
+
+ options->setItemEnabled( ad, may_need_color_dithering );
+ options->setItemEnabled( dd, may_need_color_dithering );
+
+ options->setItemChecked( ac, (conversion_flags & ColorMode_Mask) == AutoColor );
+ options->setItemChecked( co, (conversion_flags & ColorMode_Mask) == ColorOnly );
+ options->setItemChecked( mo, (conversion_flags & ColorMode_Mask) == MonoOnly );
+ options->setItemChecked( fd, (conversion_flags & Dither_Mask) == DiffuseDither );
+ options->setItemChecked( bd, (conversion_flags & Dither_Mask) == OrderedDither );
+ options->setItemChecked( td, (conversion_flags & Dither_Mask) == ThresholdDither );
+ options->setItemChecked( ta, (conversion_flags & AlphaDither_Mask) == ThresholdAlphaDither );
+ options->setItemChecked( fa, (conversion_flags & AlphaDither_Mask) == DiffuseAlphaDither );
+ options->setItemChecked( ba, (conversion_flags & AlphaDither_Mask) == OrderedAlphaDither );
+ options->setItemChecked( ad, (conversion_flags & DitherMode_Mask) == PreferDither );
+ options->setItemChecked( dd, (conversion_flags & DitherMode_Mask) == AvoidDither );
+}
+
+void ImageViewer::updateStatus()
+{
+ if ( pm.size() == TQSize( 0, 0 ) ) {
+ if ( !filename.isEmpty() )
+ status->setText("Could not load image");
+ else
+ status->setText("No image - select Open from File menu.");
+ } else {
+ TQString message, moremsg;
+ message.sprintf("%dx%d", image.width(), image.height());
+ if ( pm.size() != pmScaled.size() ) {
+ moremsg.sprintf(" [%dx%d]", pmScaled.width(),
+ pmScaled.height());
+ message += moremsg;
+ }
+ moremsg.sprintf(", %d bits ", image.depth());
+ message += moremsg;
+ if (image.valid(pickx,picky)) {
+ moremsg.sprintf("(%d,%d)=#%0*x ",
+ pickx, picky,
+ image.hasAlphaBuffer() ? 8 : 6,
+ image.pixel(pickx,picky));
+ message += moremsg;
+ }
+ if ( image.numColors() > 0 ) {
+ if (image.valid(pickx,picky)) {
+ moremsg.sprintf(", %d/%d colors", image.pixelIndex(pickx,picky),
+ image.numColors());
+ } else {
+ moremsg.sprintf(", %d colors", image.numColors());
+ }
+ message += moremsg;
+ }
+ if ( image.hasAlphaBuffer() ) {
+ if ( image.depth() == 8 ) {
+ int i;
+ bool alpha[256];
+ int nalpha=0;
+
+ for (i=0; i<256; i++)
+ alpha[i] = FALSE;
+
+ for (i=0; i<image.numColors(); i++) {
+ int alevel = image.color(i) >> 24;
+ if (!alpha[alevel]) {
+ alpha[alevel] = TRUE;
+ nalpha++;
+ }
+ }
+ moremsg.sprintf(", %d alpha levels", nalpha);
+ } else {
+ // Too many pixels to bother counting.
+ moremsg = ", 8-bit alpha channel";
+ }
+ message += moremsg;
+ }
+ status->setText(message);
+ }
+}
+
+/*
+ This function saves the image.
+*/
+void ImageViewer::saveImage( int item )
+{
+ const char* fmt = saveimage->text(item);
+ TQString savefilename = TQFileDialog::getSaveFileName(TQString::null, TQString::null,
+ this, filename);
+ if ( !savefilename.isEmpty() )
+ if ( !image.save( savefilename, fmt ) )
+ TQMessageBox::warning( this, "Save failed", "Error saving file" );
+}
+
+/*
+ This function saves the converted image.
+*/
+void ImageViewer::savePixmap( int item )
+{
+ const char* fmt = savepixmap->text(item);
+ TQString savefilename = TQFileDialog::getSaveFileName(TQString::null,
+ TQString::null, this, filename);
+ if ( !savefilename.isEmpty() )
+ if ( !pmScaled.save( savefilename, fmt ) )
+ TQMessageBox::warning( this, "Save failed", "Error saving file" );
+}
+
+
+void ImageViewer::newWindow()
+{
+ ImageViewer* that = new ImageViewer(0, "new window", WDestructiveClose);
+ that->options->setItemChecked( that->cc, useColorContext() );
+ that->show();
+}
+
+/*
+ This function is the slot for processing the Open menu item.
+*/
+void ImageViewer::openFile()
+{
+ TQString newfilename = TQFileDialog::getOpenFileName( TQString::null,
+ TQString::null,
+ this );
+ if ( !newfilename.isEmpty() ) {
+ loadImage( newfilename ) ;
+ repaint(); // show image in widget
+ }
+}
+
+/*
+ This function loads an image from a file and resizes the widget to
+ exactly fit the image size. If the file was not found or the image
+ format was unknown it will resize the widget to fit the errorText
+ message (see above) displayed in the current font.
+
+ Returns TRUE if the image was successfully loaded.
+*/
+
+bool ImageViewer::loadImage( const TQString& fileName )
+{
+ filename = fileName;
+ bool ok = FALSE;
+ if ( !filename.isEmpty() ) {
+ TQApplication::setOverrideCursor( waitCursor ); // this might take time
+ ok = image.load(filename, 0);
+ pickx = -1;
+ clickx = -1;
+ if ( ok )
+ ok = reconvertImage();
+ if ( ok ) {
+ setCaption( filename ); // set window caption
+ int w = pm.width();
+ int h = pm.height();
+
+ const int reasonable_width = 128;
+ if ( w < reasonable_width ) {
+ // Integer scale up to something reasonable
+ int multiply = ( reasonable_width + w - 1 ) / w;
+ w *= multiply;
+ h *= multiply;
+ }
+
+ h += menubar->heightForWidth(w) + status->height();
+ resize( w, h ); // we resize to fit image
+ } else {
+ pm.resize(0,0); // couldn't load image
+ update();
+ }
+ TQApplication::restoreOverrideCursor(); // restore original cursor
+ }
+ updateStatus();
+ setMenuItemFlags();
+ return ok;
+}
+
+bool ImageViewer::reconvertImage()
+{
+ bool success = FALSE;
+
+ if ( image.isNull() ) return FALSE;
+
+ if ( alloc_context ) {
+ TQColor::destroyAllocContext( alloc_context );
+ alloc_context = 0;
+ }
+ if ( useColorContext() ) {
+ alloc_context = TQColor::enterAllocContext();
+ // Clear the image to hide flickering palette
+ TQPainter painter(this);
+ painter.eraseRect(0, menubar->heightForWidth( width() ), width(), height());
+ }
+
+ TQApplication::setOverrideCursor( waitCursor ); // this might take time
+ if ( pm.convertFromImage(image, conversion_flags) )
+ {
+ pmScaled = TQPixmap();
+ scale();
+ resize( width(), height() );
+ success = TRUE; // load successful
+ } else {
+ pm.resize(0,0); // couldn't load image
+ }
+ updateStatus();
+ setMenuItemFlags();
+ TQApplication::restoreOverrideCursor(); // restore original cursor
+
+ if ( useColorContext() )
+ TQColor::leaveAllocContext();
+
+ return success; // TRUE if loaded OK
+}
+
+bool ImageViewer::smooth() const
+{
+ return options->isItemChecked(ss);
+}
+
+bool ImageViewer::useColorContext() const
+{
+ return options->isItemChecked(cc);
+}
+
+/*
+ This functions scales the pixmap in the member variable "pm" to fit the
+ widget size and puts the resulting pixmap in the member variable "pmScaled".
+*/
+
+void ImageViewer::scale()
+{
+ int h = height() - menubar->heightForWidth( width() ) - status->height();
+
+ if ( image.isNull() ) return;
+
+ TQApplication::setOverrideCursor( waitCursor ); // this might take time
+ if ( width() == pm.width() && h == pm.height() )
+ { // no need to scale if widget
+ pmScaled = pm; // size equals pixmap size
+ } else {
+ if (smooth()) {
+ pmScaled.convertFromImage(image.smoothScale(width(), h),
+ conversion_flags);
+ } else {
+ TQWMatrix m; // transformation matrix
+ m.scale(((double)width())/pm.width(),// define scale factors
+ ((double)h)/pm.height());
+ pmScaled = pm.xForm( m ); // create scaled pixmap
+ }
+ }
+ TQApplication::restoreOverrideCursor(); // restore original cursor
+}
+
+/*
+ The resize event handler, if a valid pixmap was loaded it will call
+ scale() to fit the pixmap to the new widget size.
+*/
+
+void ImageViewer::resizeEvent( TQResizeEvent * )
+{
+ status->setGeometry(0, height() - status->height(),
+ width(), status->height());
+
+ if ( pm.size() == TQSize( 0, 0 ) ) // we couldn't load the image
+ return;
+
+ int h = height() - menubar->heightForWidth( width() ) - status->height();
+ if ( width() != pmScaled.width() || h != pmScaled.height())
+ { // if new size,
+ scale(); // scale pmScaled to window
+ updateStatus();
+ }
+ if ( image.hasAlphaBuffer() )
+ erase();
+}
+
+bool ImageViewer::convertEvent( TQMouseEvent* e, int& x, int& y)
+{
+ if ( pm.size() != TQSize( 0, 0 ) ) {
+ int h = height() - menubar->heightForWidth( width() ) - status->height();
+ int nx = e->x() * image.width() / width();
+ int ny = (e->y()-menubar->heightForWidth( width() )) * image.height() / h;
+ if (nx != x || ny != y ) {
+ x = nx;
+ y = ny;
+ updateStatus();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void ImageViewer::mousePressEvent( TQMouseEvent *e )
+{
+ may_be_other = convertEvent(e, clickx, clicky);
+}
+
+void ImageViewer::mouseReleaseEvent( TQMouseEvent * )
+{
+ if ( may_be_other )
+ other = this;
+}
+
+/*
+ Record the pixel position of interest.
+*/
+void ImageViewer::mouseMoveEvent( TQMouseEvent *e )
+{
+ if (convertEvent(e,pickx,picky)) {
+ updateStatus();
+ if ((e->state()&LeftButton)) {
+ may_be_other = FALSE;
+ if ( clickx >= 0 && other) {
+ copyFrom(other);
+ }
+ }
+ }
+}
+
+/*
+ Draws the portion of the scaled pixmap that needs to be updated or prints
+ an error message if no legal pixmap has been loaded.
+*/
+
+void ImageViewer::paintEvent( TQPaintEvent *e )
+{
+ if ( pm.size() != TQSize( 0, 0 ) ) { // is an image loaded?
+ TQPainter painter(this);
+ painter.setClipRect(e->rect());
+ painter.drawPixmap(0, menubar->heightForWidth( width() ), pmScaled);
+ }
+}
+
+
+/*
+ Explain anything that might be confusing.
+*/
+void ImageViewer::giveHelp()
+{
+ if (!helpmsg) {
+ TQString helptext =
+ "<b>Usage:</b> <tt>showimg [-m] <i>filename ...</i></tt>"
+ "<blockquote>"
+ "<tt>-m</tt> - use <i>ManyColor</i> color spec"
+ "</blockquote>"
+ "<p>Supported input formats:"
+ "<blockquote>";
+ helptext += TQImage::inputFormatList().join(", ");
+ helptext += "</blockquote>";
+
+ helpmsg = new TQMessageBox( "Help", helptext,
+ TQMessageBox::Information, TQMessageBox::Ok, 0, 0, 0, 0, FALSE );
+ }
+ helpmsg->show();
+ helpmsg->raise();
+}
+
+void ImageViewer::copyFrom(ImageViewer* s)
+{
+ if ( clickx >= 0 ) {
+ int dx = clickx;
+ int dy = clicky;
+ int sx = s->clickx;
+ int sy = s->clicky;
+ int sw = TQABS(clickx - pickx)+1;
+ int sh = TQABS(clicky - picky)+1;
+ if ( clickx > pickx ) {
+ dx = pickx;
+ sx -= sw-1;
+ }
+ if ( clicky > picky ) {
+ dy = picky;
+ sy -= sh-1;
+ }
+ bitBlt( &image, dx, dy, &s->image, sx, sy, sw, sh );
+ reconvertImage();
+ repaint( image.hasAlphaBuffer() );
+ }
+}
+ImageViewer* ImageViewer::other = 0;
+
+void ImageViewer::hFlip()
+{
+ setImage(image.mirror(TRUE,FALSE));
+}
+
+void ImageViewer::vFlip()
+{
+ setImage(image.mirror(FALSE,TRUE));
+}
+
+void ImageViewer::rot180()
+{
+ setImage(image.mirror(TRUE,TRUE));
+}
+
+void ImageViewer::copy()
+{
+#ifndef QT_NO_MIMECLIPBOARD
+ TQApplication::clipboard()->setImage(image); // Less information loss
+#endif
+}
+
+void ImageViewer::paste()
+{
+#ifndef QT_NO_MIMECLIPBOARD
+ TQImage p = TQApplication::clipboard()->image();
+ if ( !p.isNull() ) {
+ filename = "pasted";
+ setImage(p);
+ }
+#endif
+}
+
+void ImageViewer::setImage(const TQImage& newimage)
+{
+ image = newimage;
+
+ pickx = -1;
+ clickx = -1;
+ setCaption( filename ); // set window caption
+ int w = image.width();
+ int h = image.height();
+ if ( !w )
+ return;
+
+ const int reasonable_width = 128;
+ if ( w < reasonable_width ) {
+ // Integer scale up to something reasonable
+ int multiply = ( reasonable_width + w - 1 ) / w;
+ w *= multiply;
+ h *= multiply;
+ }
+
+ h += menubar->heightForWidth(w) + status->height();
+ resize( w, h ); // we resize to fit image
+
+ reconvertImage();
+ repaint( image.hasAlphaBuffer() );
+
+ updateStatus();
+ setMenuItemFlags();
+}
+
+void ImageViewer::editText()
+{
+ ImageTextEditor editor(image,this);
+ editor.exec();
+}
+
+void ImageViewer::to1Bit()
+{
+ toBitDepth(1);
+}
+
+void ImageViewer::to8Bit()
+{
+ toBitDepth(8);
+}
+
+void ImageViewer::to32Bit()
+{
+ toBitDepth(32);
+}
+
+void ImageViewer::toBitDepth(int d)
+{
+ image = image.convertDepth(d);
+ reconvertImage();
+ repaint( image.hasAlphaBuffer() );
+}
diff --git a/examples/showimg/showimg.doc b/examples/showimg/showimg.doc
new file mode 100644
index 000000000..d501bb8fe
--- /dev/null
+++ b/examples/showimg/showimg.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page showimg-example.html
+
+ \ingroup examples
+ \title Show Image
+
+ This example reads and displays an image in any supported image
+ format (GIF, BMP, PPM, XMP, etc.).
+
+ <hr>
+
+ Header file:
+
+ \include showimg/showimg.h
+
+ <hr>
+
+ Implementation:
+
+ \include showimg/showimg.cpp
+
+ <hr>
+
+ Main:
+
+ \include showimg/main.cpp
+*/
+
diff --git a/examples/showimg/showimg.h b/examples/showimg/showimg.h
new file mode 100644
index 000000000..020c910be
--- /dev/null
+++ b/examples/showimg/showimg.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SHOWIMG_H
+#define SHOWIMG_H
+
+#include <qwidget.h>
+#include <qimage.h>
+
+
+class TQLabel;
+class TQMenuBar;
+class TQPopupMenu;
+
+class ImageViewer : public TQWidget
+{
+ Q_OBJECT
+public:
+ ImageViewer( TQWidget *parent=0, const char *name=0, int wFlags=0 );
+ ~ImageViewer();
+ bool loadImage( const TQString& );
+protected:
+ void paintEvent( TQPaintEvent * );
+ void resizeEvent( TQResizeEvent * );
+ void mousePressEvent( TQMouseEvent * );
+ void mouseReleaseEvent( TQMouseEvent * );
+ void mouseMoveEvent( TQMouseEvent * );
+
+private:
+ void scale();
+ int conversion_flags;
+ bool smooth() const;
+ bool useColorContext() const;
+ int alloc_context;
+ bool convertEvent( TQMouseEvent* e, int& x, int& y );
+ TQString filename;
+ TQImage image; // the loaded image
+ TQPixmap pm; // the converted pixmap
+ TQPixmap pmScaled; // the scaled pixmap
+
+ TQMenuBar *menubar;
+ TQPopupMenu *file;
+ TQPopupMenu *saveimage;
+ TQPopupMenu *savepixmap;
+ TQPopupMenu *edit;
+ TQPopupMenu *options;
+
+ TQWidget *helpmsg;
+ TQLabel *status;
+ int si, sp, ac, co, mo, fd, bd, // Menu item ids
+ td, ta, ba, fa, au, ad, dd,
+ ss, cc, t1, t8, t32;
+ void updateStatus();
+ void setMenuItemFlags();
+ bool reconvertImage();
+ int pickx, picky;
+ int clickx, clicky;
+ bool may_be_other;
+ static ImageViewer* other;
+ void setImage(const TQImage& newimage);
+
+private slots:
+ void to1Bit();
+ void to8Bit();
+ void to32Bit();
+ void toBitDepth(int);
+
+ void copy();
+ void paste();
+
+ void hFlip();
+ void vFlip();
+ void rot180();
+
+ void editText();
+
+ void newWindow();
+ void openFile();
+ void saveImage(int);
+ void savePixmap(int);
+ void giveHelp();
+ void doOption(int);
+ void copyFrom(ImageViewer*);
+};
+
+
+#endif // SHOWIMG_H
diff --git a/examples/showimg/showimg.pro b/examples/showimg/showimg.pro
new file mode 100644
index 000000000..b2df09493
--- /dev/null
+++ b/examples/showimg/showimg.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = showimg
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = showimg.h imagetexteditor.h \
+ imagefip.h
+SOURCES = main.cpp \
+ imagetexteditor.cpp \
+ showimg.cpp \
+ imagefip.cpp
diff --git a/examples/sound/sound.cpp b/examples/sound/sound.cpp
new file mode 100644
index 000000000..45ce61563
--- /dev/null
+++ b/examples/sound/sound.cpp
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+//
+// Very simple example of TQSound::play(filename)
+//
+// 99% of this program is just boilerplate TQt code to put up a nice
+// window so you think something special is happening.
+//
+
+#include "sound.h"
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include <qmenubar.h>
+
+SoundPlayer::SoundPlayer() :
+ TQMainWindow(),
+ bucket3("sounds/3.wav"),
+ bucket4("sounds/4.wav")
+{
+ if (!TQSound::isAvailable()) {
+ // Bail out. Programs in which sound is not critical
+ // could just silently (hehe) ignore the lack of a server.
+ //
+ TQMessageBox::warning(this,"No Sound",
+ "<p><b>Sorry, you are not running the Network Audio System.</b>"
+ "<p>If you have the `au' command, run it in the background before this program. "
+ "The latest release of the Network Audio System can be obtained from:"
+ "<pre>\n"
+ " &nbsp;\n"
+ " ftp.ncd.com:/pub/ncd/technology/src/nas\n"
+ " ftp.x.org:/contrib/audio/nas\n"
+ "</pre>"
+ "<p>Release 1.2 of NAS is also included with the X11R6"
+ "contrib distribution."
+ "<p>After installing NAS, you will then need to reconfigure TQt with NAS sound support");
+ }
+
+ TQPopupMenu *file = new TQPopupMenu;
+ file->insertItem("Play &1", this, SLOT(doPlay1()), CTRL+Key_1);
+ file->insertItem("Play &2", this, SLOT(doPlay2()), CTRL+Key_2);
+ file->insertItem("Play from bucket &3", this, SLOT(doPlay3()), CTRL+Key_3);
+ file->insertItem("Play from bucket &4", this, SLOT(doPlay4()), CTRL+Key_4);
+ file->insertSeparator();
+ file->insertItem("Play 3 and 4 together", this, SLOT(doPlay34()));
+ file->insertItem("Play all together", this, SLOT(doPlay1234()));
+ file->insertSeparator();
+ file->insertItem("E&xit", qApp, SLOT(tquit()));
+ menuBar()->insertItem("&File", file);
+}
+
+void SoundPlayer::doPlay1()
+{
+ TQSound::play("sounds/1.wav");
+}
+
+void SoundPlayer::doPlay2()
+{
+ TQSound::play("sounds/2.wav");
+}
+
+void SoundPlayer::doPlay3()
+{
+ bucket3.play();
+}
+
+void SoundPlayer::doPlay4()
+{
+ bucket4.play();
+}
+
+void SoundPlayer::doPlay34()
+{
+ // Some sound platforms will only play one sound at a time
+ bucket3.play();
+ bucket4.play();
+}
+
+void SoundPlayer::doPlay1234()
+{
+ // Some sound platforms will only play one sound at a time
+ TQSound::play("sounds/1.wav");
+ TQSound::play("sounds/2.wav");
+ bucket3.play();
+ bucket4.play();
+}
+
+int main(int argc, char** argv)
+{
+ TQApplication app(argc,argv);
+ SoundPlayer sp;
+ app.setMainWidget(&sp);
+ sp.setCaption("TQt Example - Sounds");
+ sp.show();
+ return app.exec();
+}
+
diff --git a/examples/sound/sound.doc b/examples/sound/sound.doc
new file mode 100644
index 000000000..031c97e66
--- /dev/null
+++ b/examples/sound/sound.doc
@@ -0,0 +1,24 @@
+/*! \page sound-example.html
+
+ \ingroup examples
+ \title Sound Example
+
+ This example shows how easy it is to play sounds, e.g. .WAV files,
+ if your machine is set up to play audio.
+
+ <hr>
+
+ Header file:
+
+ \include sound/sound.h
+
+ <hr>
+
+ Implementation:
+
+ \include sound/sound.cpp
+
+
+*/
+
+
diff --git a/examples/sound/sound.h b/examples/sound/sound.h
new file mode 100644
index 000000000..9c3e5d7b3
--- /dev/null
+++ b/examples/sound/sound.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+#ifndef PLAY_H
+#define PLAY_H
+
+#include "qsound.h"
+#include <qmainwindow.h>
+
+class SoundPlayer : public TQMainWindow {
+ Q_OBJECT
+public:
+ SoundPlayer();
+
+public slots:
+ void doPlay1();
+ void doPlay2();
+ void doPlay3();
+ void doPlay4();
+ void doPlay34();
+ void doPlay1234();
+
+private:
+ TQSound bucket3;
+ TQSound bucket4;
+};
+
+#endif
diff --git a/examples/sound/sound.pro b/examples/sound/sound.pro
new file mode 100644
index 000000000..38ab30a8f
--- /dev/null
+++ b/examples/sound/sound.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = sound
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+x11:REQUIRES = nas
+
+HEADERS = sound.h
+SOURCES = sound.cpp
diff --git a/examples/sound/sounds/1.wav b/examples/sound/sounds/1.wav
new file mode 100644
index 000000000..30b84e30b
--- /dev/null
+++ b/examples/sound/sounds/1.wav
Binary files differ
diff --git a/examples/sound/sounds/2.wav b/examples/sound/sounds/2.wav
new file mode 100644
index 000000000..dd32e3455
--- /dev/null
+++ b/examples/sound/sounds/2.wav
Binary files differ
diff --git a/examples/sound/sounds/3.wav b/examples/sound/sounds/3.wav
new file mode 100644
index 000000000..5213eb55d
--- /dev/null
+++ b/examples/sound/sounds/3.wav
Binary files differ
diff --git a/examples/sound/sounds/4.wav b/examples/sound/sounds/4.wav
new file mode 100644
index 000000000..e31b06090
--- /dev/null
+++ b/examples/sound/sounds/4.wav
Binary files differ
diff --git a/examples/splitter/splitter.cpp b/examples/splitter/splitter.cpp
new file mode 100644
index 000000000..684818a30
--- /dev/null
+++ b/examples/splitter/splitter.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qsplitter.h>
+#include <qmultilineedit.h>
+
+#include <qpainter.h>
+
+
+class Test : public TQWidget {
+public:
+ Test(TQWidget* parent=0, const char* name=0, int f=0);
+ void paintEvent(TQPaintEvent* e);
+private:
+};
+
+
+
+Test::Test(TQWidget* parent, const char* name, int f) :
+ TQWidget(parent, name, f)
+{
+
+}
+
+void Test::paintEvent(TQPaintEvent* e)
+{
+ TQPainter p(this);
+ p.setClipRect(e->rect());
+ const int d = 1000; //large number
+ int x1 = 0;
+ int x2 = width()-1;
+ int y1 = 0;
+ int y2 = height()-1;
+
+ int x = (x1+x2)/2;
+ p.drawLine( x, y1, x+d, y1+d );
+ p.drawLine( x, y1, x-d, y1+d );
+ p.drawLine( x, y2, x+d, y2-d );
+ p.drawLine( x, y2, x-d, y2-d );
+
+ int y = (y1+y2)/2;
+ p.drawLine( x1, y, x1+d, y+d );
+ p.drawLine( x1, y, x1+d, y-d );
+ p.drawLine( x2, y, x2-d, y+d );
+ p.drawLine( x2, y, x2-d, y-d );
+}
+
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+
+ TQSplitter *s1 = new TQSplitter( TQSplitter::Vertical, 0 , "main" );
+
+ TQSplitter *s2 = new TQSplitter( TQSplitter::Horizontal, s1, "top" );
+
+ Test *t1 = new Test( s2, "topLeft" );
+ t1->setBackgroundColor( TQt::blue.light( 180 ) );
+ t1->setMinimumSize( 50, 0 );
+
+ Test *t2 = new Test( s2, "topRight" );
+ t2->setBackgroundColor( TQt::green.light( 180 ) );
+ s2->setResizeMode( t2, TQSplitter::KeepSize );
+ s2->moveToFirst( t2 );
+
+ TQSplitter *s3 = new TQSplitter( TQSplitter::Horizontal, s1, "bottom" );
+
+ Test *t3 = new Test( s3, "bottomLeft" );
+ t3->setBackgroundColor( TQt::red );
+ Test *t4 = new Test( s3, "bottomMiddle" );
+ t4->setBackgroundColor( TQt::white );
+
+ Test *t5 = new Test( s3, "bottomRight" );
+ t5->setMaximumHeight( 250 );
+ t5->setMinimumSize( 80, 50 );
+ t5->setBackgroundColor( TQt::yellow );
+
+#ifdef Q_WS_QWS
+ // TQt/Embedded XOR drawing not yet implemented.
+ s1->setOpaqueResize( TRUE );
+#endif
+ s2->setOpaqueResize( TRUE );
+ s3->setOpaqueResize( TRUE );
+
+ a.setMainWidget( s1 );
+ s1->setCaption("TQt Example - Splitters");
+ s1->show();
+ int result = a.exec();
+ delete s1;
+ return result;
+}
diff --git a/examples/splitter/splitter.doc b/examples/splitter/splitter.doc
new file mode 100644
index 000000000..ddee7692b
--- /dev/null
+++ b/examples/splitter/splitter.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page splitter-example.html
+
+ \ingroup examples
+ \title Splitter
+
+ This example shows how to use splitters. With their help users can
+ decide for themselves how much space each child item should get.
+
+ <hr>
+
+ Implementation:
+
+ \include splitter/splitter.cpp
+*/
+
diff --git a/examples/splitter/splitter.pro b/examples/splitter/splitter.pro
new file mode 100644
index 000000000..439d8fec4
--- /dev/null
+++ b/examples/splitter/splitter.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = splitter
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = medium-config
+
+HEADERS =
+SOURCES = splitter.cpp
diff --git a/examples/sql/blob/blob.pro b/examples/sql/blob/blob.pro
new file mode 100644
index 000000000..9240f2e42
--- /dev/null
+++ b/examples/sql/blob/blob.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = blob
+
+CONFIG += qt warn_on release
+win32:CONFIG += console
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp
+INTERFACES =
diff --git a/examples/sql/blob/main.cpp b/examples/sql/blob/main.cpp
new file mode 100644
index 000000000..e66e9aaf5
--- /dev/null
+++ b/examples/sql/blob/main.cpp
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlquery.h>
+#include <qsqlcursor.h>
+#include <qfile.h>
+
+#define DRIVER "TQPSQL7" /* see the TQt SQL documentation for a list of available drivers */
+#define DATABASE "" /* the name of your database */
+#define USER "" /* user name with appropriate rights */
+#define PASSWORD "" /* password for USER */
+#define HOST "" /* host on which the database is running */
+
+int main( int argc, char ** argv )
+{
+
+ TQApplication a( argc, argv, FALSE );
+ TQSqlDatabase * db = TQSqlDatabase::addDatabase( DRIVER );
+ db->setDatabaseName( DATABASE );
+ db->setUserName( USER );
+ db->setPassword( PASSWORD );
+ db->setHostName( HOST );
+ if ( !db->open() ) {
+ qWarning( db->lastError().databaseText() );
+ return 1;
+ }
+
+ if ( argc < 2 ) {
+ qWarning( "Usage: %s <filename>", argv[0] );
+ return 1;
+ }
+
+ // read a file which we want to insert into the database
+ TQFile f( argv[1] );
+ if ( !f.open( IO_ReadOnly ) ) {
+ qWarning( "Unable to open data file '%s' - exiting", argv[1] );
+ return 1;
+ }
+ TQByteArray binaryData = f.readAll();
+ qWarning( "Data size: %d", binaryData.size() );
+
+ // create a table with a binary field
+ TQSqlQuery q;
+ if ( !q.exec( "CREATE TABLE blobexample ( id INT PRIMARY KEY, binfield LONGBLOB )" ) ) {
+ qWarning( "Unable to create table - exiting" );
+ return 1;
+ }
+
+ // insert a BLOB into the table
+ if ( !q.prepare( "INSERT INTO blobexample ( id, binfield ) VALUES ( ?, ? )" ) ) {
+ qWarning( "Unable to prepare query - exiting" );
+ return 1;
+ }
+ q.bindValue( 0, 1 );
+ q.bindValue( 1, binaryData );
+ if ( !q.exec() ) {
+ qWarning( "Unable to execute prepared query - exiting" );
+ return 1;
+ }
+
+ // read the BLOB back from the database
+ if ( !q.exec( "SELECT id, binfield FROM blobexample" ) ) {
+ qWarning( "Unable to execute query - exiting" );
+ return 1;
+ }
+ qWarning( "\nTQSqlQuery:" );
+ while ( q.next() ) {
+ qWarning( "BLOB id: %d", q.value( 0 ).toInt() );
+ qWarning( "BLOB size: %d", q.value( 1 ).toByteArray().size() );
+ }
+
+ // write another BLOB using TQSqlCursor
+ TQSqlCursor cur( "blobexample" );
+ TQSqlRecord * r = cur.primeInsert();
+ r->setValue( "id", 2 );
+ r->setValue( "binfield", binaryData );
+ if ( !cur.insert() ) {
+ qWarning( "Unable to insert BLOB using TQSqlCursor - exiting" );
+ return 1;
+ }
+
+ // read the BLOBs back using TQSqlCursor
+ if ( !cur.select() ) {
+ qWarning( "Unable retrieve blobexample table using TQSqlCursor - exiting" );
+ return 1;
+ }
+ qWarning( "\nTQSqlCursor:" );
+ while ( cur.next() ) {
+ qWarning( "BLOB id: %d", cur.value( "id" ).toInt() );
+ qWarning( "BLOB size: %d", cur.value( "binfield" ).toByteArray().size() );
+ }
+
+ if ( !q.exec( "DROP TABLE blobexample" ) ) {
+ qWarning( "Unable to drop table - exiting" );
+ return 1;
+ }
+ return 0;
+}
diff --git a/examples/sql/overview/basicbrowsing/README b/examples/sql/overview/basicbrowsing/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/basicbrowsing/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/basicbrowsing/basicbrowsing.pro b/examples/sql/overview/basicbrowsing/basicbrowsing.pro
new file mode 100644
index 000000000..b7245c992
--- /dev/null
+++ b/examples/sql/overview/basicbrowsing/basicbrowsing.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
+
diff --git a/examples/sql/overview/basicbrowsing/main.cpp b/examples/sql/overview/basicbrowsing/main.cpp
new file mode 100644
index 000000000..a63182444
--- /dev/null
+++ b/examples/sql/overview/basicbrowsing/main.cpp
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlquery.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlDatabase *oracledb = TQSqlDatabase::database( "ORACLE" );
+ // Copy data from the oracle database to the ODBC (default)
+ // database
+ TQSqlQuery target;
+ TQSqlQuery query( "SELECT id, name FROM people", oracledb );
+ if ( query.isActive() ) {
+ while ( query.next() ) {
+ target.exec( "INSERT INTO people ( id, name ) VALUES ( " +
+ query.value(0).toString() +
+ ", '" + query.value(1).toString() + "' )" );
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/basicbrowsing2/README b/examples/sql/overview/basicbrowsing2/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/basicbrowsing2/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/basicbrowsing2/basicbrowsing2.pro b/examples/sql/overview/basicbrowsing2/basicbrowsing2.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/basicbrowsing2/basicbrowsing2.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/basicbrowsing2/main.cpp b/examples/sql/overview/basicbrowsing2/main.cpp
new file mode 100644
index 000000000..5f7cbcb9f
--- /dev/null
+++ b/examples/sql/overview/basicbrowsing2/main.cpp
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlquery.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlDatabase *oracledb = TQSqlDatabase::database( "ORACLE" );
+ // Copy data from the oracle database to the ODBC (default)
+ // database
+ TQSqlQuery target;
+ TQSqlQuery query( "SELECT id, name FROM people", oracledb );
+ int count = 0;
+ if ( query.isActive() ) {
+ while ( query.next() ) {
+ target.exec( "INSERT INTO people ( id, name ) VALUES ( " +
+ query.value(0).toString() +
+ ", '" + query.value(1).toString() + "' )" );
+ if ( target.isActive() )
+ count += target.numRowsAffected();
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+
+
+
diff --git a/examples/sql/overview/basicdatamanip/README b/examples/sql/overview/basicdatamanip/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/basicdatamanip/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/basicdatamanip/basicdatamanip.pro b/examples/sql/overview/basicdatamanip/basicdatamanip.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/basicdatamanip/basicdatamanip.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/basicdatamanip/main.cpp b/examples/sql/overview/basicdatamanip/main.cpp
new file mode 100644
index 000000000..7777f9813
--- /dev/null
+++ b/examples/sql/overview/basicdatamanip/main.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlquery.h>
+#include "../connection.h"
+
+bool createConnections();
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ int rows = 0;
+
+ if ( createConnections() ) {
+ TQSqlQuery query( "INSERT INTO staff ( id, forename, surname, salary ) "
+ "VALUES ( 1155, 'Ginger', 'Davis', 50000 )" );
+ if ( query.isActive() ) rows += query.numRowsAffected() ;
+
+ query.exec( "UPDATE staff SET salary=60000 WHERE id=1155" );
+ if ( query.isActive() ) rows += query.numRowsAffected() ;
+
+ query.exec( "DELETE FROM staff WHERE id=1155" );
+ if ( query.isActive() ) rows += query.numRowsAffected() ;
+ }
+
+ return ( rows == 3 ) ? 0 : 1;
+}
+
+
+
diff --git a/examples/sql/overview/connect1/README b/examples/sql/overview/connect1/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/connect1/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/connect1/connect1.pro b/examples/sql/overview/connect1/connect1.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/connect1/connect1.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/connect1/main.cpp b/examples/sql/overview/connect1/main.cpp
new file mode 100644
index 000000000..16f3eeab2
--- /dev/null
+++ b/examples/sql/overview/connect1/main.cpp
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "../connection.h"
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ TQSqlDatabase *defaultDB = TQSqlDatabase::addDatabase( DB_SALES_DRIVER );
+ defaultDB->setDatabaseName( DB_SALES_DBNAME );
+ defaultDB->setUserName( DB_SALES_USER );
+ defaultDB->setPassword( DB_SALES_PASSWD );
+ defaultDB->setHostName( DB_SALES_HOST );
+
+ if ( defaultDB->open() ) {
+ // Database successfully opened; we can now issue SQL commands.
+ }
+
+ return 0;
+}
+
diff --git a/examples/sql/overview/connection.cpp b/examples/sql/overview/connection.cpp
new file mode 100644
index 000000000..0bbc7116c
--- /dev/null
+++ b/examples/sql/overview/connection.cpp
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+#include <qsqldatabase.h>
+#include "connection.h"
+
+bool createConnections()
+{
+
+ TQSqlDatabase *defaultDB = TQSqlDatabase::addDatabase( DB_SALES_DRIVER );
+ defaultDB->setDatabaseName( DB_SALES_DBNAME );
+ defaultDB->setUserName( DB_SALES_USER );
+ defaultDB->setPassword( DB_SALES_PASSWD );
+ defaultDB->setHostName( DB_SALES_HOST );
+ if ( ! defaultDB->open() ) {
+ qWarning( "Failed to open sales database: " + defaultDB->lastError().text() );
+ return FALSE;
+ }
+
+ TQSqlDatabase *oracle = TQSqlDatabase::addDatabase( DB_ORDERS_DRIVER, "ORACLE" );
+ oracle->setDatabaseName( DB_ORDERS_DBNAME );
+ oracle->setUserName( DB_ORDERS_USER );
+ oracle->setPassword( DB_ORDERS_PASSWD );
+ oracle->setHostName( DB_ORDERS_HOST );
+ if ( ! oracle->open() ) {
+ qWarning( "Failed to open orders database: " + oracle->lastError().text() );
+ return FALSE;
+ }
+
+ TQSqlQuery q(TQString::null, defaultDB);
+ q.exec("create table people (id integer primary key, name char(40))");
+ q.exec("create table staff (id integer primary key, forename char(40), "
+ "surname char(40), salary float, statusid integer)");
+ q.exec("create table status (id integer primary key, name char(30))");
+ q.exec("create table creditors (id integer primary key, forename char(40), "
+ "surname char(40), city char(30))");
+ q.exec("create table prices (id integer primary key, name char(40), price float)");
+ q.exec("create table invoiceitem (id integer primary key, "
+ "pricesid integer, quantity integer, paiddate date)");
+
+ TQSqlQuery q2(TQString::null, oracle);
+ q2.exec("create table people (id integer primary key, name char(40))");
+
+ return TRUE;
+}
diff --git a/examples/sql/overview/connection.h b/examples/sql/overview/connection.h
new file mode 100644
index 000000000..c2c5195b6
--- /dev/null
+++ b/examples/sql/overview/connection.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+// Enter your connection info here
+
+#define DB_SALES_DRIVER "TQSQLITE"
+#define DB_SALES_DBNAME ":memory:"
+#define DB_SALES_USER ""
+#define DB_SALES_PASSWD ""
+#define DB_SALES_HOST ""
+
+#define DB_ORDERS_DRIVER "TQSQLITE"
+#define DB_ORDERS_DBNAME ":memory:"
+#define DB_ORDERS_USER ""
+#define DB_ORDERS_PASSWD ""
+#define DB_ORDERS_HOST ""
+
+bool createConnections();
diff --git a/examples/sql/overview/create_connections/README b/examples/sql/overview/create_connections/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/create_connections/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/create_connections/create_connections.pro b/examples/sql/overview/create_connections/create_connections.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/create_connections/create_connections.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/create_connections/main.cpp b/examples/sql/overview/create_connections/main.cpp
new file mode 100644
index 000000000..c4b3a9b71
--- /dev/null
+++ b/examples/sql/overview/create_connections/main.cpp
@@ -0,0 +1,26 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ // Databases successfully opened; get pointers to them:
+ TQSqlDatabase *oracledb = TQSqlDatabase::database( "ORACLE" );
+ // Now we can now issue SQL commands to the oracle connection
+ // or to the default connection
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/custom1/custom1.pro b/examples/sql/overview/custom1/custom1.pro
new file mode 100644
index 000000000..c490bedd0
--- /dev/null
+++ b/examples/sql/overview/custom1/custom1.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS = main.h
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/custom1/main.cpp b/examples/sql/overview/custom1/main.cpp
new file mode 100644
index 000000000..808444c7c
--- /dev/null
+++ b/examples/sql/overview/custom1/main.cpp
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+
+
+CustomEdit::CustomEdit( TQWidget *parent, const char *name ) :
+ TQLineEdit( parent, name )
+{
+ connect( this, SIGNAL(textChanged(const TQString &)),
+ this, SLOT(changed(const TQString &)) );
+}
+
+
+void CustomEdit::changed( const TQString &line )
+{
+ setUpperLine( line );
+}
+
+
+void CustomEdit::setUpperLine( const TQString &line )
+{
+ upperLineText = line.upper();
+ setText( upperLineText );
+}
+
+
+TQString CustomEdit::upperLine() const
+{
+ return upperLineText;
+}
+
+
+FormDialog::FormDialog()
+{
+ TQLabel *forenameLabel = new TQLabel( "Forename:", this );
+ CustomEdit *forenameEdit = new CustomEdit( this );
+ TQLabel *surnameLabel = new TQLabel( "Surname:", this );
+ CustomEdit *surnameEdit = new CustomEdit( this );
+ TQLabel *salaryLabel = new TQLabel( "Salary:", this );
+ TQLineEdit *salaryEdit = new TQLineEdit( this );
+ salaryEdit->setAlignment( TQt::AlignRight );
+ TQPushButton *saveButton = new TQPushButton( "&Save", this );
+ connect( saveButton, SIGNAL(clicked()), this, SLOT(save()) );
+
+ TQGridLayout *grid = new TQGridLayout( this );
+ grid->addWidget( forenameLabel, 0, 0 );
+ grid->addWidget( forenameEdit, 0, 1 );
+ grid->addWidget( surnameLabel, 1, 0 );
+ grid->addWidget( surnameEdit, 1, 1 );
+ grid->addWidget( salaryLabel, 2, 0 );
+ grid->addWidget( salaryEdit, 2, 1 );
+ grid->addWidget( saveButton, 3, 0 );
+ grid->activate();
+
+ staffCursor = new TQSqlCursor( "staff" );
+ staffCursor->setTrimmed( "forename", TRUE );
+ staffCursor->setTrimmed( "surname", TRUE );
+ idIndex = staffCursor->index( "id" );
+ staffCursor->select( idIndex );
+ staffCursor->first();
+
+ propMap = new TQSqlPropertyMap;
+ propMap->insert( forenameEdit->className(), "upperLine" );
+
+ sqlForm = new TQSqlForm( this );
+ sqlForm->setRecord( staffCursor->primeUpdate() );
+ sqlForm->installPropertyMap( propMap );
+ sqlForm->insert( forenameEdit, "forename" );
+ sqlForm->insert( surnameEdit, "surname" );
+ sqlForm->insert( salaryEdit, "salary" );
+ sqlForm->readFields();
+}
+
+
+FormDialog::~FormDialog()
+{
+ delete staffCursor;
+}
+
+
+void FormDialog::save()
+{
+ sqlForm->writeFields();
+ staffCursor->update();
+ staffCursor->select( idIndex );
+ staffCursor->first();
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ FormDialog *formDialog = new FormDialog();
+ formDialog->show();
+ app.setMainWidget( formDialog );
+
+ return app.exec();
+}
diff --git a/examples/sql/overview/custom1/main.h b/examples/sql/overview/custom1/main.h
new file mode 100644
index 000000000..191672245
--- /dev/null
+++ b/examples/sql/overview/custom1/main.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qsqlform.h>
+#include <qsqlpropertymap.h>
+#include "../connection.h"
+
+class CustomEdit : public TQLineEdit
+{
+ Q_OBJECT
+ Q_PROPERTY( TQString upperLine READ upperLine WRITE setUpperLine )
+ public:
+ CustomEdit( TQWidget *parent=0, const char *name=0 );
+ TQString upperLine() const;
+ void setUpperLine( const TQString &line );
+ public slots:
+ void changed( const TQString &line );
+ private:
+ TQString upperLineText;
+};
+
+
+class FormDialog : public TQDialog
+{
+ Q_OBJECT
+ public:
+ FormDialog();
+ ~FormDialog();
+ public slots:
+ void save();
+ private:
+ TQSqlCursor *staffCursor;
+ TQSqlForm *sqlForm;
+ TQSqlPropertyMap *propMap;
+ TQSqlIndex idIndex;
+};
+
+
diff --git a/examples/sql/overview/delete/README b/examples/sql/overview/delete/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/delete/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/delete/delete.pro b/examples/sql/overview/delete/delete.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/delete/delete.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/delete/main.cpp b/examples/sql/overview/delete/main.cpp
new file mode 100644
index 000000000..ebe2108fa
--- /dev/null
+++ b/examples/sql/overview/delete/main.cpp
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlCursor cur( "prices" );
+ cur.select( "id=999" );
+ if ( cur.next() ) {
+ cur.primeDelete();
+ cur.del();
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/extract/README b/examples/sql/overview/extract/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/extract/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/extract/extract.pro b/examples/sql/overview/extract/extract.pro
new file mode 100644
index 000000000..c517268f4
--- /dev/null
+++ b/examples/sql/overview/extract/extract.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH =../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/extract/main.cpp b/examples/sql/overview/extract/main.cpp
new file mode 100644
index 000000000..191601c82
--- /dev/null
+++ b/examples/sql/overview/extract/main.cpp
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlCursor cur( "creditors" );
+
+ TQStringList orderFields = TQStringList() << "surname" << "forename";
+ TQSqlIndex order = cur.index( orderFields );
+
+ TQStringList filterFields = TQStringList() << "surname" << "city";
+ TQSqlIndex filter = cur.index( filterFields );
+ cur.setValue( "surname", "Chirac" );
+ cur.setValue( "city", "Paris" );
+
+ cur.select( filter, order );
+
+ while ( cur.next() ) {
+ int id = cur.value( "id" ).toInt();
+ TQString name = cur.value( "forename" ).toString() + " " +
+ cur.value( "surname" ).toString();
+ qDebug( TQString::number( id ) + ": " + name );
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/form1/form1.pro b/examples/sql/overview/form1/form1.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/form1/form1.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/form1/main.cpp b/examples/sql/overview/form1/main.cpp
new file mode 100644
index 000000000..8f1c05b0e
--- /dev/null
+++ b/examples/sql/overview/form1/main.cpp
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qsqlform.h>
+#include "../connection.h"
+
+class FormDialog : public TQDialog
+{
+ public:
+ FormDialog();
+};
+
+
+FormDialog::FormDialog()
+{
+ TQLabel *forenameLabel = new TQLabel( "Forename:", this );
+ TQLabel *forenameDisplay = new TQLabel( this );
+ TQLabel *surnameLabel = new TQLabel( "Surname:", this );
+ TQLabel *surnameDisplay = new TQLabel( this );
+ TQLabel *salaryLabel = new TQLabel( "Salary:", this );
+ TQLineEdit *salaryEdit = new TQLineEdit( this );
+
+ TQGridLayout *grid = new TQGridLayout( this );
+ grid->addWidget( forenameLabel, 0, 0 );
+ grid->addWidget( forenameDisplay, 0, 1 );
+ grid->addWidget( surnameLabel, 1, 0 );
+ grid->addWidget( surnameDisplay, 1, 1 );
+ grid->addWidget( salaryLabel, 2, 0 );
+ grid->addWidget( salaryEdit, 2, 1 );
+ grid->activate();
+
+ TQSqlCursor staffCursor( "staff" );
+ staffCursor.select();
+ staffCursor.next();
+
+ TQSqlForm sqlForm( this );
+ sqlForm.setRecord( staffCursor.primeUpdate() );
+ sqlForm.insert( forenameDisplay, "forename" );
+ sqlForm.insert( surnameDisplay, "surname" );
+ sqlForm.insert( salaryEdit, "salary" );
+ sqlForm.readFields();
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( ! createConnections() ) return 1;
+
+ FormDialog *formDialog = new FormDialog();
+ formDialog->show();
+ app.setMainWidget( formDialog );
+
+ return app.exec();
+}
diff --git a/examples/sql/overview/form2/form2.pro b/examples/sql/overview/form2/form2.pro
new file mode 100644
index 000000000..c490bedd0
--- /dev/null
+++ b/examples/sql/overview/form2/form2.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS = main.h
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/form2/main.cpp b/examples/sql/overview/form2/main.cpp
new file mode 100644
index 000000000..2d5420bdc
--- /dev/null
+++ b/examples/sql/overview/form2/main.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+
+FormDialog::FormDialog()
+ : staffCursor( "staff" )
+{
+ staffCursor.setTrimmed( "forename", TRUE );
+ staffCursor.setTrimmed( "surname", TRUE );
+
+ TQLabel *forenameLabel = new TQLabel( "Forename:", this );
+ TQLineEdit *forenameEdit = new TQLineEdit( this );
+ TQLabel *surnameLabel = new TQLabel( "Surname:", this );
+ TQLineEdit *surnameEdit = new TQLineEdit( this );
+ TQLabel *salaryLabel = new TQLabel( "Salary:", this );
+ TQLineEdit *salaryEdit = new TQLineEdit( this );
+ TQPushButton *saveButton = new TQPushButton( "&Save", this );
+ connect( saveButton, SIGNAL(clicked()), this, SLOT(save()) );
+
+ TQGridLayout *grid = new TQGridLayout( this );
+ grid->addWidget( forenameLabel, 0, 0 );
+ grid->addWidget( forenameEdit, 0, 1 );
+ grid->addWidget( surnameLabel, 1, 0 );
+ grid->addWidget( surnameEdit, 1, 1 );
+ grid->addWidget( salaryLabel, 2, 0 );
+ grid->addWidget( salaryEdit, 2, 1 );
+ grid->addWidget( saveButton, 3, 0 );
+ grid->activate();
+
+ idIndex = staffCursor.index( "id" );
+ staffCursor.select( idIndex );
+ staffCursor.first();
+
+ sqlForm = new TQSqlForm( this );
+ sqlForm->setRecord( staffCursor.primeUpdate() );
+ sqlForm->insert( forenameEdit, "forename" );
+ sqlForm->insert( surnameEdit, "surname" );
+ sqlForm->insert( salaryEdit, "salary" );
+ sqlForm->readFields();
+}
+
+
+FormDialog::~FormDialog()
+{
+
+}
+
+
+void FormDialog::save()
+{
+ sqlForm->writeFields();
+ staffCursor.update();
+ staffCursor.select( idIndex );
+ staffCursor.first();
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( ! createConnections() )
+ return 1;
+
+ FormDialog *formDialog = new FormDialog();
+ formDialog->show();
+ app.setMainWidget( formDialog );
+
+ return app.exec();
+}
diff --git a/examples/sql/overview/form2/main.h b/examples/sql/overview/form2/main.h
new file mode 100644
index 000000000..31a0f66cd
--- /dev/null
+++ b/examples/sql/overview/form2/main.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qsqlform.h>
+#include "../connection.h"
+
+class FormDialog : public TQDialog
+{
+ Q_OBJECT
+ public:
+ FormDialog();
+ ~FormDialog();
+ public slots:
+ void save();
+ private:
+ TQSqlCursor staffCursor;
+ TQSqlForm *sqlForm;
+ TQSqlIndex idIndex;
+};
diff --git a/examples/sql/overview/insert/README b/examples/sql/overview/insert/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/insert/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/insert/insert.pro b/examples/sql/overview/insert/insert.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/insert/insert.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/insert/main.cpp b/examples/sql/overview/insert/main.cpp
new file mode 100644
index 000000000..47276819f
--- /dev/null
+++ b/examples/sql/overview/insert/main.cpp
@@ -0,0 +1,37 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ int count = 0;
+ TQSqlCursor cur( "prices" );
+ TQStringList names = TQStringList() <<
+ "Screwdriver" << "Hammer" << "Wrench" << "Saw";
+ int id = 20;
+ for ( TQStringList::Iterator name = names.begin();
+ name != names.end(); ++name ) {
+ TQSqlRecord *buffer = cur.primeInsert();
+ buffer->setValue( "id", id );
+ buffer->setValue( "name", *name );
+ buffer->setValue( "price", 100.0 + (double)id );
+ count += cur.insert();
+ id++;
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/insert2/insert2.pro b/examples/sql/overview/insert2/insert2.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/insert2/insert2.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/insert2/main.cpp b/examples/sql/overview/insert2/main.cpp
new file mode 100644
index 000000000..800a94464
--- /dev/null
+++ b/examples/sql/overview/insert2/main.cpp
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlCursor cur( "prices" );
+ TQSqlRecord *buffer = cur.primeInsert();
+ buffer->setValue( "id", 53981 );
+ buffer->setValue( "name", "Thingy" );
+ buffer->setValue( "price", 105.75 );
+ cur.insert();
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/navigating/README b/examples/sql/overview/navigating/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/navigating/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/navigating/main.cpp b/examples/sql/overview/navigating/main.cpp
new file mode 100644
index 000000000..519aa2698
--- /dev/null
+++ b/examples/sql/overview/navigating/main.cpp
@@ -0,0 +1,33 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlquery.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlQuery query( "SELECT id, name FROM people ORDER BY name" );
+ if ( ! query.isActive() ) return 1; // Query failed
+ int i;
+ i = query.size(); // In this example we have 9 records; i == 9.
+ query.first(); // Moves to the first record.
+ i = query.at(); // i == 0
+ query.last(); // Moves to the last record.
+ i = query.at(); // i == 8
+ query.seek( query.size() / 2 ); // Moves to the middle record.
+ i = query.at(); // i == 4
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/navigating/navigating.pro b/examples/sql/overview/navigating/navigating.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/navigating/navigating.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/order1/README b/examples/sql/overview/order1/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/order1/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/order1/main.cpp b/examples/sql/overview/order1/main.cpp
new file mode 100644
index 000000000..7b185d459
--- /dev/null
+++ b/examples/sql/overview/order1/main.cpp
@@ -0,0 +1,32 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlCursor cur( "staff" );
+ TQStringList fields = TQStringList() << "surname" << "forename";
+ TQSqlIndex order = cur.index( fields );
+ cur.select( order );
+ while ( cur.next() ) {
+ qDebug( cur.value( "id" ).toString() + ": " +
+ cur.value( "surname" ).toString() + " " +
+ cur.value( "forename" ).toString() );
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/order1/order1.pro b/examples/sql/overview/order1/order1.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/order1/order1.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/order2/README b/examples/sql/overview/order2/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/order2/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/order2/main.cpp b/examples/sql/overview/order2/main.cpp
new file mode 100644
index 000000000..9165d2a9f
--- /dev/null
+++ b/examples/sql/overview/order2/main.cpp
@@ -0,0 +1,34 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlCursor cur( "staff" );
+ TQStringList fields = TQStringList() << "id" << "forename";
+ TQSqlIndex order = cur.index( fields );
+ TQSqlIndex filter = cur.index( "surname" );
+ cur.setValue( "surname", "Bloggs" );
+ cur.select( filter, order );
+ while ( cur.next() ) {
+ qDebug( cur.value( "id" ).toString() + ": " +
+ cur.value( "surname" ).toString() + " " +
+ cur.value( "forename" ).toString() );
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/order2/order2.pro b/examples/sql/overview/order2/order2.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/order2/order2.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/overview.pro b/examples/sql/overview/overview.pro
new file mode 100644
index 000000000..59be65100
--- /dev/null
+++ b/examples/sql/overview/overview.pro
@@ -0,0 +1,33 @@
+TEMPLATE = subdirs
+
+CONFIG += ordered
+
+REQUIRES = full-config
+
+SUBDIRS = basicbrowsing \
+ basicbrowsing2 \
+ basicdatamanip \
+ connect1 \
+ create_connections \
+ custom1 \
+ delete \
+ extract \
+ form1 \
+ form2 \
+ insert \
+ insert2 \
+ navigating \
+ order1 \
+ order2 \
+ retrieve1 \
+ retrieve2 \
+ subclass1 \
+ subclass2 \
+ subclass3 \
+ subclass4 \
+ subclass5 \
+ table1 \
+ table2 \
+ table3 \
+ table4 \
+ update
diff --git a/examples/sql/overview/retrieve1/README b/examples/sql/overview/retrieve1/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/retrieve1/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/retrieve1/main.cpp b/examples/sql/overview/retrieve1/main.cpp
new file mode 100644
index 000000000..956f8a17f
--- /dev/null
+++ b/examples/sql/overview/retrieve1/main.cpp
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlquery.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlQuery query( "SELECT id, surname FROM staff" );
+ if ( query.isActive() ) {
+ while ( query.next() ) {
+ qDebug( query.value(0).toString() + ": " +
+ query.value(1).toString() );
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/retrieve1/retrieve1.pro b/examples/sql/overview/retrieve1/retrieve1.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/retrieve1/retrieve1.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/retrieve2/README b/examples/sql/overview/retrieve2/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/retrieve2/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/retrieve2/main.cpp b/examples/sql/overview/retrieve2/main.cpp
new file mode 100644
index 000000000..4cb0150be
--- /dev/null
+++ b/examples/sql/overview/retrieve2/main.cpp
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ TQSqlCursor cur( "staff" ); // Specify the table/view name
+ cur.select(); // We'll retrieve every record
+ while ( cur.next() ) {
+ qDebug( cur.value( "id" ).toString() + ": " +
+ cur.value( "surname" ).toString() + " " +
+ cur.value( "salary" ).toString() );
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/retrieve2/retrieve2.pro b/examples/sql/overview/retrieve2/retrieve2.pro
new file mode 100644
index 000000000..c58585ea2
--- /dev/null
+++ b/examples/sql/overview/retrieve2/retrieve2.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/subclass1/main.cpp b/examples/sql/overview/subclass1/main.cpp
new file mode 100644
index 000000000..476ebd898
--- /dev/null
+++ b/examples/sql/overview/subclass1/main.cpp
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qdatatable.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ TQSqlCursor invoiceItemCursor( "invoiceitem" );
+
+ TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor );
+
+ app.setMainWidget( invoiceItemTable );
+
+ invoiceItemTable->addColumn( "pricesid", "PriceID" );
+ invoiceItemTable->addColumn( "quantity", "Quantity" );
+ invoiceItemTable->addColumn( "paiddate", "Paid" );
+
+ invoiceItemTable->refresh();
+ invoiceItemTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/subclass1/subclass1.pro b/examples/sql/overview/subclass1/subclass1.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/subclass1/subclass1.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/subclass2/main.cpp b/examples/sql/overview/subclass2/main.cpp
new file mode 100644
index 000000000..f7f9bd91f
--- /dev/null
+++ b/examples/sql/overview/subclass2/main.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+#include <qdatatable.h>
+
+InvoiceItemCursor::InvoiceItemCursor() :
+ TQSqlCursor( "invoiceitem" )
+{
+ // NOOP
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ InvoiceItemCursor invoiceItemCursor;
+
+ TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor );
+
+ app.setMainWidget( invoiceItemTable );
+
+ invoiceItemTable->addColumn( "pricesid", "PriceID" );
+ invoiceItemTable->addColumn( "quantity", "Quantity" );
+ invoiceItemTable->addColumn( "paiddate", "Paid" );
+
+ invoiceItemTable->refresh();
+ invoiceItemTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/subclass2/main.h b/examples/sql/overview/subclass2/main.h
new file mode 100644
index 000000000..020ecbff7
--- /dev/null
+++ b/examples/sql/overview/subclass2/main.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+class TQSqlRecord;
+
+class InvoiceItemCursor : public TQSqlCursor
+{
+ public:
+ InvoiceItemCursor();
+};
+
+
diff --git a/examples/sql/overview/subclass2/subclass2.pro b/examples/sql/overview/subclass2/subclass2.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/subclass2/subclass2.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/subclass3/main.cpp b/examples/sql/overview/subclass3/main.cpp
new file mode 100644
index 000000000..db77b855e
--- /dev/null
+++ b/examples/sql/overview/subclass3/main.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+#include <qdatatable.h>
+
+InvoiceItemCursor::InvoiceItemCursor() :
+ TQSqlCursor( "invoiceitem" )
+{
+ TQSqlFieldInfo productName( "productname", TQVariant::String );
+ append( productName );
+ setCalculated( productName.name(), TRUE );
+}
+
+
+TQVariant InvoiceItemCursor::calculateField( const TQString & name )
+{
+ if ( name == "productname" ) {
+ TQSqlQuery query( "SELECT name FROM prices WHERE id=" +
+ field( "pricesid" )->value().toString() );
+ if ( query.next() )
+ return query.value( 0 );
+ }
+
+ return TQVariant( TQString::null );
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ InvoiceItemCursor invoiceItemCursor;
+
+ TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor );
+
+ app.setMainWidget( invoiceItemTable );
+
+ invoiceItemTable->addColumn( "productname", "Product" );
+ invoiceItemTable->addColumn( "quantity", "Quantity" );
+ invoiceItemTable->addColumn( "paiddate", "Paid" );
+
+ invoiceItemTable->refresh();
+ invoiceItemTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/subclass3/main.h b/examples/sql/overview/subclass3/main.h
new file mode 100644
index 000000000..06b0a1734
--- /dev/null
+++ b/examples/sql/overview/subclass3/main.h
@@ -0,0 +1,25 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+class TQSqlRecord;
+
+class InvoiceItemCursor : public TQSqlCursor
+{
+ public:
+ InvoiceItemCursor();
+ protected:
+ TQVariant calculateField( const TQString & name );
+};
+
+
diff --git a/examples/sql/overview/subclass3/subclass3.pro b/examples/sql/overview/subclass3/subclass3.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/subclass3/subclass3.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/subclass4/main.cpp b/examples/sql/overview/subclass4/main.cpp
new file mode 100644
index 000000000..a96870e4d
--- /dev/null
+++ b/examples/sql/overview/subclass4/main.cpp
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+#include <qdatatable.h>
+
+InvoiceItemCursor::InvoiceItemCursor() :
+ TQSqlCursor( "invoiceitem" )
+{
+ TQSqlFieldInfo productName( "productname", TQVariant::String );
+ append( productName );
+ setCalculated( productName.name(), TRUE );
+
+ TQSqlFieldInfo productPrice( "price", TQVariant::Double );
+ append( productPrice );
+ setCalculated( productPrice.name(), TRUE );
+
+ TQSqlFieldInfo productCost( "cost", TQVariant::Double );
+ append( productCost );
+ setCalculated( productCost.name(), TRUE );
+}
+
+
+TQVariant InvoiceItemCursor::calculateField( const TQString & name )
+{
+
+ if ( name == "productname" ) {
+ TQSqlQuery query( "SELECT name FROM prices WHERE id=" +
+ field( "pricesid" )->value().toString() );
+ if ( query.next() )
+ return query.value( 0 );
+ }
+ else if ( name == "price" ) {
+ TQSqlQuery query( "SELECT price FROM prices WHERE id=" +
+ field( "pricesid" )->value().toString() );
+ if ( query.next() )
+ return query.value( 0 );
+ }
+ else if ( name == "cost" ) {
+ TQSqlQuery query( "SELECT price FROM prices WHERE id=" +
+ field( "pricesid" )->value().toString() );
+ if ( query.next() )
+ return TQVariant( query.value( 0 ).toDouble() *
+ value( "quantity").toDouble() );
+ }
+
+ return TQVariant( TQString::null );
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ InvoiceItemCursor invoiceItemCursor;
+
+ TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor );
+
+ app.setMainWidget( invoiceItemTable );
+
+ invoiceItemTable->addColumn( "productname", "Product" );
+ invoiceItemTable->addColumn( "price", "Price" );
+ invoiceItemTable->addColumn( "quantity", "Quantity" );
+ invoiceItemTable->addColumn( "cost", "Cost" );
+ invoiceItemTable->addColumn( "paiddate", "Paid" );
+
+ invoiceItemTable->refresh();
+ invoiceItemTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/subclass4/main.h b/examples/sql/overview/subclass4/main.h
new file mode 100644
index 000000000..06b0a1734
--- /dev/null
+++ b/examples/sql/overview/subclass4/main.h
@@ -0,0 +1,25 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+class TQSqlRecord;
+
+class InvoiceItemCursor : public TQSqlCursor
+{
+ public:
+ InvoiceItemCursor();
+ protected:
+ TQVariant calculateField( const TQString & name );
+};
+
+
diff --git a/examples/sql/overview/subclass4/subclass4.pro b/examples/sql/overview/subclass4/subclass4.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/subclass4/subclass4.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/subclass5/main.cpp b/examples/sql/overview/subclass5/main.cpp
new file mode 100644
index 000000000..260ddaf2a
--- /dev/null
+++ b/examples/sql/overview/subclass5/main.cpp
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+#include <qdatatable.h>
+
+InvoiceItemCursor::InvoiceItemCursor() :
+ TQSqlCursor( "invoiceitem" )
+{
+ TQSqlFieldInfo productName( "productname", TQVariant::String );
+ append( productName );
+ setCalculated( productName.name(), TRUE );
+
+ TQSqlFieldInfo productPrice( "price", TQVariant::Double );
+ append( productPrice );
+ setCalculated( productPrice.name(), TRUE );
+
+ TQSqlFieldInfo productCost( "cost", TQVariant::Double );
+ append( productCost );
+ setCalculated( productCost.name(), TRUE );
+}
+
+
+TQVariant InvoiceItemCursor::calculateField( const TQString & name )
+{
+
+ if ( name == "productname" ) {
+ TQSqlQuery query( "SELECT name FROM prices WHERE id=" +
+ field( "pricesid" )->value().toString() );
+ if ( query.next() )
+ return query.value( 0 );
+ }
+ else if ( name == "price" ) {
+ TQSqlQuery query( "SELECT price FROM prices WHERE id=" +
+ field( "pricesid" )->value().toString() );
+ if ( query.next() )
+ return query.value( 0 );
+ }
+ else if ( name == "cost" ) {
+ TQSqlQuery query( "SELECT price FROM prices WHERE id=" +
+ field( "pricesid" )->value().toString() );
+ if ( query.next() )
+ return TQVariant( query.value( 0 ).toDouble() *
+ value( "quantity").toDouble() );
+ }
+
+ return TQVariant( TQString::null );
+}
+
+
+TQSqlRecord *InvoiceItemCursor::primeInsert()
+{
+ TQSqlRecord *buffer = editBuffer();
+ TQSqlQuery query( "SELECT NEXTVAL( 'invoiceitem_seq' )" );
+ if ( query.next() )
+ buffer->setValue( "id", query.value( 0 ) );
+ buffer->setValue( "paiddate", TQDate::currentDate() );
+ buffer->setValue( "quantity", 1 );
+
+ return buffer;
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ InvoiceItemCursor invoiceItemCursor;
+
+ TQDataTable *invoiceItemTable = new TQDataTable( &invoiceItemCursor );
+
+ app.setMainWidget( invoiceItemTable );
+
+ invoiceItemTable->addColumn( "productname", "Product" );
+ invoiceItemTable->addColumn( "price", "Price" );
+ invoiceItemTable->addColumn( "quantity", "Quantity" );
+ invoiceItemTable->addColumn( "cost", "Cost" );
+ invoiceItemTable->addColumn( "paiddate", "Paid" );
+
+ invoiceItemTable->refresh();
+ invoiceItemTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/subclass5/main.h b/examples/sql/overview/subclass5/main.h
new file mode 100644
index 000000000..6f3a0edca
--- /dev/null
+++ b/examples/sql/overview/subclass5/main.h
@@ -0,0 +1,25 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qdatetime.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+class TQSqlRecord;
+
+class InvoiceItemCursor : public TQSqlCursor
+{
+ public:
+ InvoiceItemCursor();
+ TQSqlRecord *primeInsert();
+ protected:
+ TQVariant calculateField( const TQString & name );
+};
diff --git a/examples/sql/overview/subclass5/subclass5.pro b/examples/sql/overview/subclass5/subclass5.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/subclass5/subclass5.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/table1/main.cpp b/examples/sql/overview/table1/main.cpp
new file mode 100644
index 000000000..c0041a9a2
--- /dev/null
+++ b/examples/sql/overview/table1/main.cpp
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qdatatable.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ TQSqlCursor staffCursor( "staff" );
+ TQDataTable *staffTable = new TQDataTable( &staffCursor, TRUE );
+ app.setMainWidget( staffTable );
+ staffTable->refresh();
+ staffTable->show();
+
+ return app.exec();
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/table1/table1.pro b/examples/sql/overview/table1/table1.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/table1/table1.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/table2/main.cpp b/examples/sql/overview/table2/main.cpp
new file mode 100644
index 000000000..79c9993f9
--- /dev/null
+++ b/examples/sql/overview/table2/main.cpp
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qdatatable.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ TQSqlCursor staffCursor( "staff" );
+
+ TQDataTable *staffTable = new TQDataTable( &staffCursor );
+
+ app.setMainWidget( staffTable );
+
+ staffTable->addColumn( "forename", "Forename" );
+ staffTable->addColumn( "surname", "Surname" );
+ staffTable->addColumn( "salary", "Annual Salary" );
+
+ TQStringList order = TQStringList() << "surname" << "forename";
+ staffTable->setSort( order );
+
+ staffTable->refresh();
+ staffTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/table2/table2.pro b/examples/sql/overview/table2/table2.pro
new file mode 100644
index 000000000..a6cd8cb47
--- /dev/null
+++ b/examples/sql/overview/table2/table2.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/table3/main.cpp b/examples/sql/overview/table3/main.cpp
new file mode 100644
index 000000000..4b9f2050e
--- /dev/null
+++ b/examples/sql/overview/table3/main.cpp
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+#include <qdatatable.h>
+
+StatusPicker::StatusPicker( TQWidget *parent, const char *name )
+ : TQComboBox( parent, name )
+{
+ TQSqlCursor cur( "status" );
+ cur.select( cur.index( "name" ) );
+
+ int i = 0;
+ while ( cur.next() ) {
+ insertItem( cur.value( "name" ).toString(), i );
+ index2id[i] = cur.value( "id" ).toInt();
+ i++;
+ }
+}
+
+
+int StatusPicker::statusId() const
+{
+ return index2id[ currentItem() ];
+}
+
+
+void StatusPicker::setStatusId( int statusid )
+{
+ TQMap<int,int>::Iterator it;
+ for ( it = index2id.begin(); it != index2id.end(); ++it ) {
+ if ( it.data() == statusid ) {
+ setCurrentItem( it.key() );
+ break;
+ }
+ }
+}
+
+
+
+TQWidget *CustomSqlEditorFactory::createEditor(
+ TQWidget *parent, const TQSqlField *field )
+{
+ if ( field->name() == "statusid" ) {
+ TQWidget *editor = new StatusPicker( parent );
+ return editor;
+ }
+
+ return TQSqlEditorFactory::createEditor( parent, field );
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ TQSqlCursor staffCursor( "staff" );
+
+ TQDataTable *staffTable = new TQDataTable( &staffCursor );
+ TQSqlPropertyMap *propMap = new TQSqlPropertyMap();
+ CustomSqlEditorFactory *editorFactory = new CustomSqlEditorFactory();
+ propMap->insert( "StatusPicker", "statusid" );
+ staffTable->installPropertyMap( propMap );
+ staffTable->installEditorFactory( editorFactory );
+
+ app.setMainWidget( staffTable );
+
+ staffTable->addColumn( "forename", "Forename" );
+ staffTable->addColumn( "surname", "Surname" );
+ staffTable->addColumn( "salary", "Annual Salary" );
+ staffTable->addColumn( "statusid", "Status" );
+
+ TQStringList order = TQStringList() << "surname" << "forename";
+ staffTable->setSort( order );
+
+ staffTable->refresh();
+ staffTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/table3/main.h b/examples/sql/overview/table3/main.h
new file mode 100644
index 000000000..dd0d8d095
--- /dev/null
+++ b/examples/sql/overview/table3/main.h
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qcombobox.h>
+#include <qmap.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qsqleditorfactory.h>
+#include <qsqlpropertymap.h>
+#include "../connection.h"
+
+class StatusPicker : public TQComboBox
+{
+ Q_OBJECT
+ Q_PROPERTY( int statusid READ statusId WRITE setStatusId )
+ public:
+ StatusPicker( TQWidget *parent=0, const char *name=0 );
+ int statusId() const;
+ void setStatusId( int id );
+ private:
+ TQMap< int, int > index2id;
+};
+
+
+class CustomSqlEditorFactory : public TQSqlEditorFactory
+{
+ Q_OBJECT
+ public:
+ TQWidget *createEditor( TQWidget *parent, const TQSqlField *field );
+};
+
+
+
diff --git a/examples/sql/overview/table3/table3.pro b/examples/sql/overview/table3/table3.pro
new file mode 100644
index 000000000..c490bedd0
--- /dev/null
+++ b/examples/sql/overview/table3/table3.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS = main.h
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/table4/main.cpp b/examples/sql/overview/table4/main.cpp
new file mode 100644
index 000000000..b557b3f1e
--- /dev/null
+++ b/examples/sql/overview/table4/main.cpp
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "main.h"
+
+
+StatusPicker::StatusPicker( TQWidget *parent, const char *name )
+ : TQComboBox( parent, name )
+{
+ TQSqlCursor cur( "status" );
+ cur.select( cur.index( "name" ) );
+
+ int i = 0;
+ while ( cur.next() ) {
+ insertItem( cur.value( "name" ).toString(), i );
+ index2id[i] = cur.value( "id" ).toInt();
+ i++;
+ }
+}
+
+
+int StatusPicker::statusId() const
+{
+ return index2id[ currentItem() ];
+}
+
+
+void StatusPicker::setStatusId( int statusid )
+{
+ TQMap<int,int>::Iterator it;
+ for ( it = index2id.begin(); it != index2id.end(); ++it ) {
+ if ( it.data() == statusid ) {
+ setCurrentItem( it.key() );
+ break;
+ }
+ }
+}
+
+
+void CustomTable::paintField( TQPainter * p, const TQSqlField* field,
+ const TQRect & cr, bool b)
+{
+ if ( !field )
+ return;
+ if ( field->name() == "statusid" ) {
+ TQSqlQuery query( "SELECT name FROM status WHERE id=" +
+ field->value().toString() );
+ TQString text;
+ if ( query.next() ) {
+ text = query.value( 0 ).toString();
+ }
+ p->drawText( 2,2, cr.width()-4, cr.height()-4, fieldAlignment( field ), text );
+ }
+ else {
+ TQDataTable::paintField( p, field, cr, b) ;
+ }
+}
+
+
+TQWidget *CustomSqlEditorFactory::createEditor(
+ TQWidget *parent, const TQSqlField *field )
+{
+ if ( field->name() == "statusid" ) {
+ TQWidget *editor = new StatusPicker( parent );
+ return editor;
+ }
+
+ return TQSqlEditorFactory::createEditor( parent, field );
+}
+
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv );
+
+ if ( createConnections() ) {
+ TQSqlCursor staffCursor( "staff" );
+
+ CustomTable *staffTable = new CustomTable( &staffCursor );
+ TQSqlPropertyMap *propMap = new TQSqlPropertyMap();
+ CustomSqlEditorFactory *editorFactory = new CustomSqlEditorFactory();
+ propMap->insert( "StatusPicker", "statusid" );
+ staffTable->installPropertyMap( propMap );
+ staffTable->installEditorFactory( editorFactory );
+
+ app.setMainWidget( staffTable );
+
+ staffTable->addColumn( "forename", "Forename" );
+ staffTable->addColumn( "surname", "Surname" );
+ staffTable->addColumn( "salary", "Annual Salary" );
+ staffTable->addColumn( "statusid", "Status" );
+
+ TQStringList order = TQStringList() << "surname" << "forename";
+ staffTable->setSort( order );
+
+ staffTable->refresh();
+ staffTable->show();
+
+ return app.exec();
+ }
+
+ return 1;
+}
diff --git a/examples/sql/overview/table4/main.h b/examples/sql/overview/table4/main.h
new file mode 100644
index 000000000..59edfc9d5
--- /dev/null
+++ b/examples/sql/overview/table4/main.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qcombobox.h>
+#include <qmap.h>
+#include <qpainter.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include <qsqleditorfactory.h>
+#include <qsqlpropertymap.h>
+#include <qdatatable.h>
+#include "../connection.h"
+
+class StatusPicker : public TQComboBox
+{
+ Q_OBJECT
+ Q_PROPERTY( int statusid READ statusId WRITE setStatusId )
+public:
+ StatusPicker( TQWidget *parent=0, const char *name=0 );
+ int statusId() const;
+ void setStatusId( int id );
+private:
+ TQMap< int, int > index2id;
+};
+
+
+class CustomTable : public TQDataTable
+{
+ Q_OBJECT
+public:
+ CustomTable(
+ TQSqlCursor *cursor, bool autoPopulate = FALSE,
+ TQWidget * parent = 0, const char * name = 0 ) :
+ TQDataTable( cursor, autoPopulate, parent, name ) {}
+ void paintField(
+ TQPainter * p, const TQSqlField* field, const TQRect & cr, bool );
+
+};
+
+
+class CustomSqlEditorFactory : public TQSqlEditorFactory
+{
+ Q_OBJECT
+public:
+ TQWidget *createEditor( TQWidget *parent, const TQSqlField *field );
+};
diff --git a/examples/sql/overview/table4/table4.pro b/examples/sql/overview/table4/table4.pro
new file mode 100644
index 000000000..c490bedd0
--- /dev/null
+++ b/examples/sql/overview/table4/table4.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS = main.h
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/overview/update/README b/examples/sql/overview/update/README
new file mode 100644
index 000000000..eae3cd7f9
--- /dev/null
+++ b/examples/sql/overview/update/README
@@ -0,0 +1 @@
+This example is part of the overview in sql.html
diff --git a/examples/sql/overview/update/main.cpp b/examples/sql/overview/update/main.cpp
new file mode 100644
index 000000000..207702c06
--- /dev/null
+++ b/examples/sql/overview/update/main.cpp
@@ -0,0 +1,32 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qsqlcursor.h>
+#include "../connection.h"
+
+int main( int argc, char *argv[] )
+{
+ TQApplication app( argc, argv, FALSE );
+
+ if ( createConnections() ) {
+ TQSqlCursor cur( "prices" );
+ cur.select( "id=202" );
+ if ( cur.next() ) {
+ TQSqlRecord *buffer = cur.primeUpdate();
+ double price = buffer->value( "price" ).toDouble();
+ double newprice = price * 1.05;
+ buffer->setValue( "price", newprice );
+ cur.update();
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/sql/overview/update/update.pro b/examples/sql/overview/update/update.pro
new file mode 100644
index 000000000..9e6df96c9
--- /dev/null
+++ b/examples/sql/overview/update/update.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp ../connection.cpp
diff --git a/examples/sql/sql.pro b/examples/sql/sql.pro
new file mode 100644
index 000000000..35f92914c
--- /dev/null
+++ b/examples/sql/sql.pro
@@ -0,0 +1,9 @@
+TEMPLATE = subdirs
+
+CONFIG += ordered
+
+REQUIRES = full-config
+
+SUBDIRS = overview \
+ sqltable \
+ blob
diff --git a/examples/sql/sqltable/README b/examples/sql/sqltable/README
new file mode 100644
index 000000000..701458835
--- /dev/null
+++ b/examples/sql/sqltable/README
@@ -0,0 +1,18 @@
+This SQL table example retquires a connection to a SQL database.
+Modify main.cpp to connect to your specific database.
+
+This example program expects a table called 'simpletable' to exist in
+the database. You can create this table by running the following SQL
+script (modify to suit your backend, if necessary):
+
+drop table simpletable;
+create table simpletable
+(id number primary key,
+name varchar(20),
+address varchar(20) );
+
+-- optional, some sample data
+insert into simpletable (id, name, address)
+values (1, 'Trond', 'Oslo');
+insert into simpletable (id, name, address)
+values (2, 'Dave', 'Oslo');
diff --git a/examples/sql/sqltable/main.cpp b/examples/sql/sqltable/main.cpp
new file mode 100644
index 000000000..68d31389a
--- /dev/null
+++ b/examples/sql/sqltable/main.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qsqldatabase.h>
+#include <qdatatable.h>
+#include <qsqlcursor.h>
+#include <qmessagebox.h>
+
+/* Modify the following to match your environment */
+#define DRIVER "TQSQLITE" /* see the TQt SQL documentation for a list of available drivers */
+#define DATABASE ":memory:" /* the name of your database */
+#define USER "" /* user name with appropriate rights */
+#define PASSWORD "" /* password for USER */
+#define HOST "" /* host on which the database is running */
+
+class SimpleCursor : public TQSqlCursor
+{
+public:
+ SimpleCursor () : TQSqlCursor( "simpletable" ) {}
+protected:
+ TQSqlRecord* primeInsert()
+ {
+ /* a real-world application would use sequences, or the like */
+ TQSqlRecord* buf = TQSqlCursor::primeInsert();
+ TQSqlQuery q( "select max(id)+1 from simpletable" );
+ if ( q.next() )
+ buf->setValue( "id", q.value(0) );
+ return buf;
+ }
+};
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+
+ TQSqlDatabase * db = TQSqlDatabase::addDatabase( DRIVER );
+ db->setDatabaseName( DATABASE );
+ db->setUserName( USER );
+ db->setPassword( PASSWORD );
+ db->setHostName( HOST );
+
+ if( !db->open() ){
+ db->lastError().showMessage( "An error occured. Please read the README file in the sqltable"
+ "dir for more information.\n\n" );
+ return 1;
+ }
+
+ if (!db->tables().contains("simpletable")) {
+ TQSqlQuery q("create table simpletable(id int, name varchar(20), address varchar(20))", db);
+ }
+
+ SimpleCursor cursor;
+
+ TQDataTable table( &cursor ); /* data table uses our cursor */
+ table.addColumn( "name", "Name" );
+ table.addColumn( "address", "Address" );
+ table.setSorting( TRUE );
+
+ a.setMainWidget( &table );
+ table.refresh(); /* load data */
+ table.show(); /* show widget */
+
+ return a.exec();
+}
diff --git a/examples/sql/sqltable/sqltable.doc b/examples/sql/sqltable/sqltable.doc
new file mode 100644
index 000000000..bfa86f551
--- /dev/null
+++ b/examples/sql/sqltable/sqltable.doc
@@ -0,0 +1,24 @@
+/*
+/****************************************************************************
+**
+** 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.
+**
+*****************************************************************************/
+*/
+/*! \page sqltable-example.html
+
+ \ingroup sql-examples
+ \title SQL Table
+
+ This example shows how to use a QDataTable to browse data in a SQL database.
+
+ <hr>
+
+ Implementation:
+
+ \include sql/sqltable/main.cpp
+
+*/
diff --git a/examples/sql/sqltable/sqltable.pro b/examples/sql/sqltable/sqltable.pro
new file mode 100644
index 000000000..6a8c216f6
--- /dev/null
+++ b/examples/sql/sqltable/sqltable.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = sqltable
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = main.cpp
+INTERFACES =
diff --git a/examples/tabdialog/main.cpp b/examples/tabdialog/main.cpp
new file mode 100644
index 000000000..954f4dc94
--- /dev/null
+++ b/examples/tabdialog/main.cpp
@@ -0,0 +1,26 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "tabdialog.h"
+#include <qapplication.h>
+#include <qstring.h>
+
+int main( int argc, char **argv )
+{
+
+ TQApplication a( argc, argv );
+
+ TabDialog tabdialog( 0, "tabdialog", TQString( argc < 2 ? "." : argv[1] ) );
+ tabdialog.resize( 450, 350 );
+ tabdialog.setCaption( "TQt Example - Tabbed Dialog" );
+ a.setMainWidget( &tabdialog );
+ tabdialog.show();
+
+ return a.exec();
+}
diff --git a/examples/tabdialog/tabdialog.cpp b/examples/tabdialog/tabdialog.cpp
new file mode 100644
index 000000000..774b74c73
--- /dev/null
+++ b/examples/tabdialog/tabdialog.cpp
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "tabdialog.h"
+
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qdatetime.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlistbox.h>
+#include <qapplication.h>
+
+TabDialog::TabDialog( TQWidget *parent, const char *name, const TQString &_filename )
+ : TQTabDialog( parent, name ), filename( _filename ), fileinfo( filename )
+{
+ setupTab1();
+ setupTab2();
+ setupTab3();
+
+ connect( this, SIGNAL( applyButtonPressed() ), qApp, SLOT( tquit() ) );
+}
+
+void TabDialog::setupTab1()
+{
+ TQVBox *tab1 = new TQVBox( this );
+ tab1->setMargin( 5 );
+
+ (void)new TQLabel( "Filename:", tab1 );
+ TQLineEdit *fname = new TQLineEdit( filename, tab1 );
+ fname->setFocus();
+
+ (void)new TQLabel( "Path:", tab1 );
+ TQLabel *path = new TQLabel( fileinfo.dirPath( TRUE ), tab1 );
+ path->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ (void)new TQLabel( "Size:", tab1 );
+ ulong kb = (ulong)(fileinfo.size()/1024);
+ TQLabel *size = new TQLabel( TQString( "%1 KB" ).arg( kb ), tab1 );
+ size->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ (void)new TQLabel( "Last Read:", tab1 );
+ TQLabel *lread = new TQLabel( fileinfo.lastRead().toString(), tab1 );
+ lread->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ (void)new TQLabel( "Last Modified:", tab1 );
+ TQLabel *lmodif = new TQLabel( fileinfo.lastModified().toString(), tab1 );
+ lmodif->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ addTab( tab1, "General" );
+}
+
+void TabDialog::setupTab2()
+{
+ TQVBox *tab2 = new TQVBox( this );
+ tab2->setMargin( 5 );
+
+ TQButtonGroup *bg = new TQButtonGroup( 1, TQGroupBox::Horizontal, "Permissions", tab2 );
+
+ TQCheckBox *readable = new TQCheckBox( "Readable", bg );
+ if ( fileinfo.isReadable() )
+ readable->setChecked( TRUE );
+
+ TQCheckBox *writable = new TQCheckBox( "Writeable", bg );
+ if ( fileinfo.isWritable() )
+ writable->setChecked( TRUE );
+
+ TQCheckBox *executable = new TQCheckBox( "Executable", bg );
+ if ( fileinfo.isExecutable() )
+ executable->setChecked( TRUE );
+
+ TQButtonGroup *bg2 = new TQButtonGroup( 2, TQGroupBox::Horizontal, "Owner", tab2 );
+
+ (void)new TQLabel( "Owner", bg2 );
+ TQLabel *owner = new TQLabel( fileinfo.owner(), bg2 );
+ owner->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ (void)new TQLabel( "Group", bg2 );
+ TQLabel *group = new TQLabel( fileinfo.group(), bg2 );
+ group->setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+
+ addTab( tab2, "Permissions" );
+}
+
+void TabDialog::setupTab3()
+{
+ TQVBox *tab3 = new TQVBox( this );
+ tab3->setMargin( 5 );
+ tab3->setSpacing( 5 );
+
+ (void)new TQLabel( TQString( "Open %1 with:" ).arg( filename ), tab3 );
+
+ TQListBox *prgs = new TQListBox( tab3 );
+ for ( unsigned int i = 0; i < 30; i++ ) {
+ TQString prg = TQString( "Application %1" ).arg( i );
+ prgs->insertItem( prg );
+ }
+ prgs->setCurrentItem( 3 );
+
+ (void)new TQCheckBox( TQString( "Open files with the extension '%1' always with this application" ).arg( fileinfo.extension() ), tab3 );
+
+ addTab( tab3, "Applications" );
+}
diff --git a/examples/tabdialog/tabdialog.doc b/examples/tabdialog/tabdialog.doc
new file mode 100644
index 000000000..c52e6653c
--- /dev/null
+++ b/examples/tabdialog/tabdialog.doc
@@ -0,0 +1,31 @@
+/*
+*/
+/*! \page tabdialog-example.html
+
+ \ingroup examples
+ \title Tabdialog
+
+ This example shows how to use a dialog with multiple tabs
+ (pages). To start the program you have to specify a filename
+ as the first argument. The dialog shows information about the
+ file separated onto different tabs.
+
+ <hr>
+
+ Header file:
+
+ \include tabdialog/tabdialog.h
+
+ <hr>
+
+ Implementation:
+
+ \include tabdialog/tabdialog.cpp
+
+ <hr>
+
+ Main:
+
+ \include tabdialog/main.cpp
+*/
+
diff --git a/examples/tabdialog/tabdialog.h b/examples/tabdialog/tabdialog.h
new file mode 100644
index 000000000..363c07eb0
--- /dev/null
+++ b/examples/tabdialog/tabdialog.h
@@ -0,0 +1,34 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TABDIALOG_H
+#define TABDIALOG_H
+
+#include <qtabdialog.h>
+#include <qstring.h>
+#include <qfileinfo.h>
+
+class TabDialog : public TQTabDialog
+{
+ Q_OBJECT
+
+public:
+ TabDialog( TQWidget *parent, const char *name, const TQString &_filename );
+
+protected:
+ TQString filename;
+ TQFileInfo fileinfo;
+
+ void setupTab1();
+ void setupTab2();
+ void setupTab3();
+
+};
+
+#endif
diff --git a/examples/tabdialog/tabdialog.pro b/examples/tabdialog/tabdialog.pro
new file mode 100644
index 000000000..40cfbe97a
--- /dev/null
+++ b/examples/tabdialog/tabdialog.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = tabdialog
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = tabdialog.h
+SOURCES = main.cpp \
+ tabdialog.cpp
diff --git a/examples/table/bigtable/bigtable.doc b/examples/table/bigtable/bigtable.doc
new file mode 100644
index 000000000..7f8a5c2da
--- /dev/null
+++ b/examples/table/bigtable/bigtable.doc
@@ -0,0 +1,19 @@
+/*
+*/
+
+/*! \page bigtable-example.html
+
+ \ingroup table-examples
+
+ \title How to create a large, sparse QTable
+
+ This example shows a sparse table implementation using a QIntDict to
+ keep track of the cells that are actually in use.
+
+ <hr>
+
+ Implementation:
+
+ \include table/bigtable/main.cpp
+
+*/
diff --git a/examples/table/bigtable/bigtable.pro b/examples/table/bigtable/bigtable.pro
new file mode 100644
index 000000000..e059dd953
--- /dev/null
+++ b/examples/table/bigtable/bigtable.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = bigtable
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = table full-config
+
+HEADERS =
+SOURCES = main.cpp
diff --git a/examples/table/bigtable/main.cpp b/examples/table/bigtable/main.cpp
new file mode 100644
index 000000000..b0d42b22b
--- /dev/null
+++ b/examples/table/bigtable/main.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qtable.h>
+
+// Table size
+
+const int numRows = 1000000;
+const int numCols = 1000000;
+
+class MyTable : public TQTable
+{
+public:
+ MyTable( int r, int c ) : TQTable( r, c ) {
+ items.setAutoDelete( TRUE );
+ widgets.setAutoDelete( TRUE );
+ setCaption( tr( "A 1 Million x 1 Million Cell Table" ) );
+ setLeftMargin( fontMetrics().width( "W999999W" ) );
+ }
+
+ void resizeData( int ) {}
+ TQTableItem *item( int r, int c ) const { return items.find( indexOf( r, c ) ); }
+ void setItem( int r, int c, TQTableItem *i ) { items.replace( indexOf( r, c ), i ); }
+ void clearCell( int r, int c ) { items.remove( indexOf( r, c ) ); }
+ void takeItem( TQTableItem *item )
+ {
+ items.setAutoDelete( FALSE );
+ items.remove( indexOf( item->row(), item->col() ) );
+ items.setAutoDelete( TRUE );
+ }
+ void insertWidget( int r, int c, TQWidget *w ) { widgets.replace( indexOf( r, c ), w ); }
+ TQWidget *cellWidget( int r, int c ) const { return widgets.find( indexOf( r, c ) ); }
+ void clearCellWidget( int r, int c )
+ {
+ TQWidget *w = widgets.take( indexOf( r, c ) );
+ if ( w )
+ w->deleteLater();
+ }
+
+private:
+ TQIntDict<TQTableItem> items;
+ TQIntDict<TQWidget> widgets;
+
+};
+
+// The program starts here.
+
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+
+ MyTable table( numRows, numCols );
+ app.setMainWidget( &table );
+ table.show();
+ return app.exec();
+}
diff --git a/examples/table/small-table-demo/main.cpp b/examples/table/small-table-demo/main.cpp
new file mode 100644
index 000000000..8039aadf2
--- /dev/null
+++ b/examples/table/small-table-demo/main.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qtable.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qstringlist.h>
+
+// TQt logo: static const char *qtlogo_xpm[]
+#include "qtlogo.xpm"
+
+// Table size
+
+const int numRows = 30;
+const int numCols = 10;
+
+// The program starts here.
+
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+
+ TQTable table( numRows, numCols );
+
+ TQHeader *header = table.horizontalHeader();
+ header->setLabel( 0, TQObject::tr( "Tiny" ), 40 );
+ header->setLabel( 1, TQObject::tr( "Checkboxes" ) );
+ header->setLabel( 5, TQObject::tr( "Combos" ) );
+ table.setColumnMovingEnabled(TRUE);
+
+ TQImage img( qtlogo_xpm );
+ TQPixmap pix = img.scaleHeight( table.rowHeight(3) );
+ table.setPixmap( 3, 2, pix );
+ table.setText( 3, 2, "A Pixmap" );
+
+ TQStringList comboEntries;
+ comboEntries << "one" << "two" << "three" << "four";
+
+ for ( int i = 0; i < numRows; ++i ){
+ TQComboTableItem * item = new TQComboTableItem( &table, comboEntries, FALSE );
+ item->setCurrentItem( i % 4 );
+ table.setItem( i, 5, item );
+ }
+ for ( int j = 0; j < numRows; ++j )
+ table.setItem( j, 1, new TQCheckTableItem( &table, "Check me" ) );
+
+ app.setMainWidget( &table );
+ table.show();
+ return app.exec();
+}
diff --git a/examples/table/small-table-demo/qtlogo.xpm b/examples/table/small-table-demo/qtlogo.xpm
new file mode 100644
index 000000000..d8aee6add
--- /dev/null
+++ b/examples/table/small-table-demo/qtlogo.xpm
@@ -0,0 +1,123 @@
+/* XPM */
+static const char *qtlogo_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 100 100 16 1",
+/* colors */
+". c #000000",
+"# c #0b0d01",
+"a c #161a02",
+"b c #202703",
+"c c #2b3505",
+"d c #364206",
+"e c #414f07",
+"f c #4c5c08",
+"g c #566909",
+"h c #61760a",
+"i c #6c830b",
+"j c #77900c",
+"k c #829e0e",
+"l c #8cab0f",
+"m c #97b810",
+"n c #a2c511",
+/* pixels */
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmkhgecbbabbcdefikmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkjdc#..............#ceilnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmida......................aehmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmgc#.....................##..#abgmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmgd#..............................#chmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnjd....##..................#.....###..#eimnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnmga...#...............................#..agmnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnke#.......#................................acknnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnjc...#........................##....#.........dinnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnib..#...............................#...........cjnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnhb....#.#......................##......#..........ahnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnib..#..........#.....####aabba#.....#.....##.......#cinnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnjb.................#acehklmmmmljihca..................bjnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnkc..#.............#cfknnnnnnnnnnnnnlkhc#..#.............cknnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnme......##....#..#dhmnnnnnnnnnnnnnnnnnnlhda...##.......##.dmnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnng#.#....#......#bglnnnnnnnnnnnnnnnnnnnnnnlfa...#...#....#.#fnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnja...#.......#.#dknnnnnnnnnnnnnnnnnnnnnnnnnnmda.....#....##.ajnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnmd..#........#.#emnnnnnnnnnnnnnnnnnnnnnnnnnnnnmf#.#...#.......dlnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnf...#....#..#.#hnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnh#.#...........gnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnmd.#..........#hlnnnnnnnnnnnnnnnnnnnnnnnknnnnnnnnmg#............dlnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnng#.#..........fmnnnnnnnnnnnnnnnnnnnnnnnhcgnnnnnnnnme............agnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnmc..#......#..dlnnnnnnnnnnnnnnnnnnnnnnnha.ahnnnnnnnnld.#..........cmnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnni#.#.........bknnnnnnnnnnnnnnnnnnnnnnnha...ahnnnnnnnnkb...........#innnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnd..#........#gnnnnnnnnnnnnnnnnnnnnnnng#...#.#hnnnnnnnnh..........#.ennnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnla.#......#..dlnnnnnnnnnnnnnnnnnnnnnmha..#.##.bhnnnnnnnlc.........#.aknnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnj.........#.#innnnnnnnnnnnnnnnnnnnnnia.#.......ahnnnnnnni............innnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnd...........cmnnnnnnnnnnnnnnnnnnnnnha............hnnnnnnnc.........##dnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnmc..........#fnnnnnnnnnnnnnnnnnnnnnha....#...##...bgmnnnnnf##.........cmnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnk#..........aknnnnnnnnnnnnnnnnnnnnha..#.....#......cknnnnnka#.........aknnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnh...........cnnnnnnnnnnnnnnnnnnnni#..#.....#......ahmnnnnnnc...........innnnnnnnnnnnnn",
+"nnnnnnnnnnnnnng..........#ennnnnnnnnnnnnnnnnnnha.........#..#..#imnnnnnnne........#..gnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnne..........#hnnnnnnnnnnnnnnnnnnha.....#.........ahnnnnnnnnnh#.......#..ennnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnc..........#knnnnnnnnnnnnnnnnnha.#...##........ainnnnnnnnnnk#..........cnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnmb..........#lnnnnnnnnnnnnnnnnia.#.............#hnnnnnnnnnnnma..........bnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnma..........amnnnnnnnnnnnnnnnh#.............#.ainnnnnnnnnnnnna..........bnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnma..........amnnnnnnnnnnnnnnha.............#.#hnnnnnnnnnnnnnna..........bmnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnmb..........bmnnnnnnnnnnnnmha..............#.#hnnnnnnnnnnnnnna..........amnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnmb..........amnnnnnnnnnnnmia.##..#..........#.ahnnnnnnnnnnnnna..........bmnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnc..........alnnnnnnnnnnnha.##..##.............#hnnnnnnnnnnnla..........cmnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnd..........#jnnnnnnnnnnga..#...................ahnnnnnnnnnnj#..........dnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnne...........innnnnnnnnha.#....................#.ahmnnnnnnnnh.#.........ennnnnnnnnnnnnn",
+"nnnnnnnnnnnnnne.........#.hnnnnnnnnia.#...#...#.........#.....#.imnnnnnnng.#......#.#fnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnni....#..#.#.cmnnnnnnh#..#..#...#...#..............#hnnnnnnnb...........innnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnj#......#...aknnnnnkc.....#..##...#..#.............ahnnnnnka........#.#knnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnlb.#.........hnnnnnnga..#...##...#.##...............ahnnnnf.........#.bmnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnne.#.......#.clnnnnnnh#.#..##..#..#hha.............#.ahmnmb.........#.ennnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnni...........#hnnnnnnnh#...#..#..#hnnh#.#.............#ini#..#.....#..innnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnla......#....dlnnnnnnnhb....#..bhmnnnha.............#.bfc...#.....#.alnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnne#.#..#.....afnnnnnnnni#.....binnnnnnha#.........#................#ennnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnha.#....#..#.amnnnnnnnnh#...#hnnnnnnnnh..............#..........#.#hnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnb.#.....#....dmnnnnnnnnha.ainnnnnnnnnmi..........................dlnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnh#......#..#.afnnnnnnnnngdgmnnnnnnnnnnmha.#..#.................#.gnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnmc.#....#..#..#glnnnnnnnmkmnnnnnnnnnnnnnh#......................clnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnh#.............gmnnnnnnnnnnnnnnnnnnnnnnnha.#...................innnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnme..........##.#elnnnnnnnnnnnnnnnnnnnnnnnh#...................elnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnia...........#.#dknnnnnnnnnnnnnnnnnnnnnnmhb.............##.#alnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnmga..............bhlmnnnnnnnnnnnnnnnnnnnnng.#...........##.#bmnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnmc.......###...#..cimnnnnnnnnnnnnnnnnnnmic..........#......ajnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnkd........#........cfknnnnnnnnnnnnnnkfb#..........#........#hnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnic....##...........#bcehklmmnmljhfba.......................agnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnja#...............###.##aaabba#............................ahnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnhc..#..........................#.............##..........#.ahnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnib..##......................................##..........##.ahmnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnjc......................................................#.#emnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnjd#................####.....#.............##............#cjnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnmfa......................................aba.........a#bknnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnjd.................................#..elmj#.......#.clnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmgda..##................#..........cilnnnha.##..#.elnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnlgc#...#...##...........###..##dglnnnnnng#.##.#clnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnliea##....................behlnnnnnnnnnh#..#blnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkidca..............#cfilnnnnnnnnnnnnnib#cknnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmkigecbbbabcdefikmnnnnnnnnnnnnnnnnnhejnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmnnnnnnnnnnnnnnnnnnnnnnnmmnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn",
+"nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"
+};
diff --git a/examples/table/small-table-demo/small-table-demo.doc b/examples/table/small-table-demo/small-table-demo.doc
new file mode 100644
index 000000000..d2ced77b7
--- /dev/null
+++ b/examples/table/small-table-demo/small-table-demo.doc
@@ -0,0 +1,15 @@
+/*! \page small-table-example-example.html
+
+ \ingroup table-examples
+ \title Small Table Example
+
+ This example displays a QTable and some \l{QTableItem}s.
+
+ <hr>
+
+ Implementation:
+
+ \include table/small-table-demo/main.cpp
+*/
+
+
diff --git a/examples/table/small-table-demo/small-table-demo.pro b/examples/table/small-table-demo/small-table-demo.pro
new file mode 100644
index 000000000..c052fa1a8
--- /dev/null
+++ b/examples/table/small-table-demo/small-table-demo.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = smalltable
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = table full-config
+
+HEADERS =
+SOURCES = main.cpp
diff --git a/examples/table/statistics/main.cpp b/examples/table/statistics/main.cpp
new file mode 100644
index 000000000..0f58c21b8
--- /dev/null
+++ b/examples/table/statistics/main.cpp
@@ -0,0 +1,20 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "statistics.h"
+#include <qapplication.h>
+int main( int argc, char **argv )
+{
+ TQApplication a(argc,argv);
+
+ Table t;
+ a.setMainWidget( &t );
+ t.show();
+ return a.exec();
+}
diff --git a/examples/table/statistics/statistics.cpp b/examples/table/statistics/statistics.cpp
new file mode 100644
index 000000000..f64b67568
--- /dev/null
+++ b/examples/table/statistics/statistics.cpp
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "statistics.h"
+
+#include <qdir.h>
+#include <qstringlist.h>
+#include <qheader.h>
+#include <qcombobox.h>
+#include <stdlib.h>
+
+const char* dirs[] = {
+ "kernel",
+ "tools",
+ "widgets",
+ "dialogs",
+ "xml",
+ "table",
+ "network",
+ "opengl",
+ "canvas",
+ 0
+};
+
+Table::Table()
+ : TQTable( 10, 100, 0, "table" )
+{
+ setSorting( TRUE );
+ horizontalHeader()->setLabel( 0, tr( "File" ) );
+ horizontalHeader()->setLabel( 1, tr( "Size (bytes)" ) );
+ horizontalHeader()->setLabel( 2, tr( "Use in Sum" ) );
+ initTable();
+ adjustColumn( 0 );
+
+ // if the user edited something we might need to recalculate the sum
+ connect( this, SIGNAL( valueChanged( int, int ) ),
+ this, SLOT( recalcSum( int, int ) ) );
+}
+
+void Table::initTable()
+{
+ // read all the TQt source and header files into a list
+ TQStringList all;
+ int i = 0;
+ TQString srcdir( "../../../src/" );
+ while ( dirs[ i ] ) {
+ TQDir dir( srcdir + dirs[ i ] );
+ TQStringList lst = dir.entryList( "*.cpp; *.h" );
+ for ( TQStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ if ( ( *it ).contains( "moc" ) )
+ continue;
+ all << (TQString( dirs[ i ] ) + "/" + *it);
+ }
+ ++i;
+ }
+
+ // set the number of rows we'll need for the table
+ setNumRows( all.count() + 1 );
+ i = 0;
+ int sum = 0;
+
+ // insert the data into the table
+ for ( TQStringList::Iterator it = all.begin(); it != all.end(); ++it ) {
+ setText( i, 0, *it );
+ TQFile f( srcdir + *it );
+ setText( i, 1, TQString::number( (ulong)f.size() ) );
+ ComboItem *ci = new ComboItem( this, TQTableItem::WhenCurrent );
+ setItem( i++, 2, ci );
+ sum += f.size();
+ }
+
+ // last row should show the sum
+ TableItem *i1 = new TableItem( this, TQTableItem::Never, tr( "Sum" ) );
+ setItem( i, 0, i1 );
+ TableItem *i2 = new TableItem( this, TQTableItem::Never, TQString::number( sum ) );
+ setItem( i, 1, i2 );
+}
+
+void Table::recalcSum( int, int col )
+{
+ // only recalc if a value in the second or third column changed
+ if ( col < 1 || col > 2 )
+ return;
+
+ // recalc sum
+ int sum = 0;
+ for ( int i = 0; i < numRows() - 1; ++i ) {
+ if ( text( i, 2 ) == "No" )
+ continue;
+ sum += text( i, 1 ).toInt();
+ }
+
+ // insert calculated data
+ TableItem *i1 = new TableItem( this, TQTableItem::Never, tr( "Sum" ) );
+ setItem( numRows() - 1, 0, i1 );
+ TableItem *i2 = new TableItem( this, TQTableItem::Never, TQString::number( sum ) );
+ setItem( numRows() - 1, 1, i2 );
+}
+
+void Table::sortColumn( int col, bool ascending, bool /*wholeRows*/ )
+{
+ // sum row should not be sorted, so get rid of it for now
+ clearCell( numRows() - 1, 0 );
+ clearCell( numRows() - 1, 1 );
+ // do sort
+ TQTable::sortColumn( col, ascending, TRUE );
+ // re-insert sum row
+ recalcSum( 0, 1 );
+}
+
+
+
+void TableItem::paint( TQPainter *p, const TQColorGroup &cg, const TQRect &cr, bool selected )
+{
+ TQColorGroup g( cg );
+ // last row is the sum row - we want to make it more visible by
+ // using a red background
+ if ( row() == table()->numRows() - 1 )
+ g.setColor( TQColorGroup::Base, red );
+ TQTableItem::paint( p, g, cr, selected );
+}
+
+
+
+
+ComboItem::ComboItem( TQTable *t, EditType et )
+ : TQTableItem( t, et, "Yes" ), cb( 0 )
+{
+ // we do not want this item to be replaced
+ setReplaceable( FALSE );
+}
+
+TQWidget *ComboItem::createEditor() const
+{
+ // create an editor - a combobox in our case
+ ( (ComboItem*)this )->cb = new TQComboBox( table()->viewport() );
+ TQObject::connect( cb, SIGNAL( activated( int ) ), table(), SLOT( doValueChanged() ) );
+ cb->insertItem( "Yes" );
+ cb->insertItem( "No" );
+ // and initialize it
+ cb->setCurrentItem( text() == "No" ? 1 : 0 );
+ return cb;
+}
+
+void ComboItem::setContentFromEditor( TQWidget *w )
+{
+ // the user changed the value of the combobox, so synchronize the
+ // value of the item (its text), with the value of the combobox
+ if ( w->inherits( "TQComboBox" ) )
+ setText( ( (TQComboBox*)w )->currentText() );
+ else
+ TQTableItem::setContentFromEditor( w );
+}
+
+void ComboItem::setText( const TQString &s )
+{
+ if ( cb ) {
+ // initialize the combobox from the text
+ if ( s == "No" )
+ cb->setCurrentItem( 1 );
+ else
+ cb->setCurrentItem( 0 );
+ }
+ TQTableItem::setText( s );
+}
diff --git a/examples/table/statistics/statistics.doc b/examples/table/statistics/statistics.doc
new file mode 100644
index 000000000..4cd47d897
--- /dev/null
+++ b/examples/table/statistics/statistics.doc
@@ -0,0 +1,27 @@
+/*! \page statistics-example.html
+
+ \ingroup table-examples
+ \title Table Example
+
+ Another QTable example.
+
+ <hr>
+
+ Header file:
+
+ \include table/statistics/statistics.h
+
+ <hr>
+
+ Implementation:
+
+ \include table/statistics/statistics.cpp
+
+ <hr>
+
+ Main:
+
+ \include table/statistics/main.cpp
+*/
+
+
diff --git a/examples/table/statistics/statistics.h b/examples/table/statistics/statistics.h
new file mode 100644
index 000000000..efb0358a6
--- /dev/null
+++ b/examples/table/statistics/statistics.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef STATISTICS_H
+#define STATISTICS_H
+
+#include <qtable.h>
+#include <qcombobox.h>
+
+class TableItem : public TQTableItem
+{
+public:
+ TableItem( TQTable *t, EditType et, const TQString &txt ) : TQTableItem( t, et, txt ) {}
+ void paint( TQPainter *p, const TQColorGroup &cg, const TQRect &cr, bool selected );
+};
+
+class ComboItem : public TQTableItem
+{
+public:
+ ComboItem( TQTable *t, EditType et );
+ TQWidget *createEditor() const;
+ void setContentFromEditor( TQWidget *w );
+ void setText( const TQString &s );
+
+private:
+ TQComboBox *cb;
+
+};
+
+class Table : public TQTable
+{
+ Q_OBJECT
+
+public:
+ Table();
+ void sortColumn( int col, bool ascending, bool wholeRows );
+
+private slots:
+ void recalcSum( int row, int col );
+
+private:
+ void initTable();
+
+};
+
+#endif
diff --git a/examples/table/statistics/statistics.pro b/examples/table/statistics/statistics.pro
new file mode 100644
index 000000000..d172d5266
--- /dev/null
+++ b/examples/table/statistics/statistics.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = statistics
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = table full-config
+
+HEADERS = statistics.h
+SOURCES = statistics.cpp main.cpp
diff --git a/examples/tablet/canvas.cpp b/examples/tablet/canvas.cpp
new file mode 100644
index 000000000..6d5c0fe75
--- /dev/null
+++ b/examples/tablet/canvas.cpp
@@ -0,0 +1,178 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "canvas.h"
+
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qevent.h>
+#include <qrect.h>
+
+const bool no_writing = FALSE;
+
+Canvas::Canvas( TQWidget *parent, const char *name, WFlags fl )
+ : TQWidget( parent, name, WStaticContents | fl ),
+ pen( TQt::red, 3 ), polyline(3),
+ mousePressed( FALSE ), oldPressure( 0 ), saveColor( red ),
+ buffer( width(), height() )
+{
+
+ if ((qApp->argc() > 0) && !buffer.load(qApp->argv()[1]))
+ buffer.fill( colorGroup().base() );
+ setBackgroundMode( TQWidget::PaletteBase );
+#ifndef QT_NO_CURSOR
+ setCursor( TQt::crossCursor );
+#endif
+}
+
+void Canvas::save( const TQString &filename, const TQString &format )
+{
+ if ( !no_writing )
+ buffer.save( filename, format.upper() );
+}
+
+void Canvas::clearScreen()
+{
+ buffer.fill( colorGroup().base() );
+ repaint( FALSE );
+}
+
+void Canvas::mousePressEvent( TQMouseEvent *e )
+{
+ mousePressed = TRUE;
+ polyline[2] = polyline[1] = polyline[0] = e->pos();
+}
+
+void Canvas::mouseReleaseEvent( TQMouseEvent * )
+{
+ mousePressed = FALSE;
+}
+
+void Canvas::mouseMoveEvent( TQMouseEvent *e )
+{
+ if ( mousePressed ) {
+ TQPainter painter;
+ painter.begin( &buffer );
+ painter.setPen( pen );
+ polyline[2] = polyline[1];
+ polyline[1] = polyline[0];
+ polyline[0] = e->pos();
+ painter.drawPolyline( polyline );
+ painter.end();
+
+ TQRect r = polyline.boundingRect();
+ r = r.normalize();
+ r.setLeft( r.left() - penWidth() );
+ r.setTop( r.top() - penWidth() );
+ r.setRight( r.right() + penWidth() );
+ r.setBottom( r.bottom() + penWidth() );
+
+ bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );
+ }
+}
+
+void Canvas::tabletEvent( TQTabletEvent *e )
+{
+ e->accept();
+ // change the width based on range of pressure
+ if ( e->device() == TQTabletEvent::Stylus ) {
+ if ( e->pressure() >= 0 && e->pressure() <= 32 )
+ pen.setColor( saveColor.light(175) );
+ else if ( e->pressure() > 32 && e->pressure() <= 64 )
+ pen.setColor( saveColor.light(150) );
+ else if ( e->pressure() > 64 && e->pressure() <= 96 )
+ pen.setColor( saveColor.light(125) );
+ else if ( e->pressure() > 96 && e->pressure() <= 128 )
+ pen.setColor( saveColor );
+ else if ( e->pressure() > 128 && e->pressure() <= 160 )
+ pen.setColor( saveColor.dark(150) );
+ else if ( e->pressure() > 160 && e->pressure() <= 192 )
+ pen.setColor( saveColor.dark(200) );
+ else if ( e->pressure() > 192 && e->pressure() <= 224 )
+ pen.setColor( saveColor.dark(250) );
+ else // pressure > 224
+ pen.setColor( saveColor.dark(300) );
+ } else if ( e->device() == TQTabletEvent::Eraser
+ && pen.color() != backgroundColor() ) {
+ pen.setColor( backgroundColor() );
+ }
+
+ int xt = e->xTilt();
+ int yt = e->yTilt();
+ if ( ( xt > -15 && xt < 15 ) && ( yt > -15 && yt < 15 ) )
+ pen.setWidth( 3 );
+ else if ( ((xt < -15 && xt > -30) || (xt > 15 && xt < 30)) &&
+ ((yt < -15 && yt > -30) || (yt > 15 && yt < 30 )) )
+ pen.setWidth( 6 );
+ else if ( ((xt < -30 && xt > -45) || (xt > 30 && xt < 45)) &&
+ ((yt < -30 && yt > -45) || (yt > 30 && yt < 45)) )
+ pen.setWidth( 9 );
+ else if ( (xt < -45 || xt > 45 ) && ( yt < -45 || yt > 45 ) )
+ pen.setWidth( 12 );
+
+ switch ( e->type() ) {
+ case TQEvent::TabletPress:
+ mousePressed = TRUE;
+ polyline[2] = polyline[1] = polyline[0] = e->pos();
+ break;
+ case TQEvent::TabletRelease:
+ mousePressed = FALSE;
+ break;
+ case TQEvent::TabletMove:
+ if ( mousePressed ) {
+ TQPainter painter;
+ painter.begin( &buffer );
+ painter.setPen( pen );
+ polyline[2] = polyline[1];
+ polyline[1] = polyline[0];
+ polyline[0] = e->pos();
+ painter.drawPolyline( polyline );
+ painter.end();
+
+ TQRect r = polyline.boundingRect();
+ r = r.normalize();
+ r.setLeft( r.left() - penWidth() );
+ r.setTop( r.top() - penWidth() );
+ r.setRight( r.right() + penWidth() );
+ r.setBottom( r.bottom() + penWidth() );
+
+ bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(),
+ r.height() );
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void Canvas::resizeEvent( TQResizeEvent *e )
+{
+ TQWidget::resizeEvent( e );
+
+ int w = width() > buffer.width() ?
+ width() : buffer.width();
+ int h = height() > buffer.height() ?
+ height() : buffer.height();
+
+ TQPixmap tmp( buffer );
+ buffer.resize( w, h );
+ buffer.fill( colorGroup().base() );
+ bitBlt( &buffer, 0, 0, &tmp, 0, 0, tmp.width(), tmp.height() );
+}
+
+void Canvas::paintEvent( TQPaintEvent *e )
+{
+ TQWidget::paintEvent( e );
+
+ TQMemArray<TQRect> rects = e->region().rects();
+ for ( uint i = 0; i < rects.count(); i++ ) {
+ TQRect r = rects[(int)i];
+ bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );
+ }
+}
diff --git a/examples/tablet/canvas.h b/examples/tablet/canvas.h
new file mode 100644
index 000000000..24268b95d
--- /dev/null
+++ b/examples/tablet/canvas.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qpen.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qpointarray.h>
+#include <qwidget.h>
+
+
+#ifndef _MY_CANVAS_
+#define _MY_CANVAS_
+
+
+class Canvas : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ Canvas( TQWidget *parent = 0, const char *name = 0, WFlags fl = 0 );
+ virtual ~Canvas() {};
+
+ void setPenColor( const TQColor &c )
+ { saveColor = c;
+ pen.setColor( saveColor ); }
+
+ void setPenWidth( int w )
+ { pen.setWidth( w ); }
+
+ TQColor penColor()
+ { return pen.color(); }
+
+ int penWidth()
+ { return pen.width(); }
+
+ void save( const TQString &filename, const TQString &format );
+
+ void clearScreen();
+
+protected:
+ virtual void mousePressEvent( TQMouseEvent *e );
+ virtual void mouseReleaseEvent( TQMouseEvent *e );
+ virtual void mouseMoveEvent( TQMouseEvent *e );
+ virtual void resizeEvent( TQResizeEvent *e );
+ virtual void paintEvent( TQPaintEvent *e );
+ virtual void tabletEvent( TQTabletEvent *e );
+
+ TQPen pen;
+ TQPointArray polyline;
+
+ bool mousePressed;
+ int oldPressure;
+ TQColor saveColor;
+
+ TQPixmap buffer;
+
+};
+
+#endif
diff --git a/examples/tablet/main.cpp b/examples/tablet/main.cpp
new file mode 100644
index 000000000..7f97aa964
--- /dev/null
+++ b/examples/tablet/main.cpp
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "scribble.h"
+#include "tabletstats.h"
+#include <qapplication.h>
+#include <qtabwidget.h>
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ TQTabWidget tab;
+ Scribble scribble(&tab, "scribble");
+ TabletStats tabStats( &tab, "tablet stats" );
+
+ scribble.setMinimumSize( 500, 350 );
+ tabStats.setMinimumSize( 500, 350 );
+ tab.addTab(&scribble, "Scribble" );
+ tab.addTab(&tabStats, "Tablet Stats" );
+
+ a.setMainWidget( &tab );
+ if ( TQApplication::desktop()->width() > 550
+ && TQApplication::desktop()->height() > 366 )
+ tab.show();
+ else
+ tab.showMaximized();
+ return a.exec();
+}
diff --git a/examples/tablet/scribble.cpp b/examples/tablet/scribble.cpp
new file mode 100644
index 000000000..356a4277b
--- /dev/null
+++ b/examples/tablet/scribble.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "canvas.h"
+#include "scribble.h"
+
+#include <qapplication.h>
+#include <qevent.h>
+#include <qpainter.h>
+#include <qtoolbar.h>
+#include <qtoolbutton.h>
+#include <qspinbox.h>
+#include <qtooltip.h>
+#include <qrect.h>
+#include <qpoint.h>
+#include <qcolordialog.h>
+#include <qfiledialog.h>
+#include <qcursor.h>
+#include <qimage.h>
+#include <qstrlist.h>
+#include <qpopupmenu.h>
+#include <qintdict.h>
+
+
+
+Scribble::Scribble( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name )
+{
+ canvas = new Canvas( this );
+ setCentralWidget( canvas );
+
+ TQToolBar *tools = new TQToolBar( this );
+
+ bSave = new TQToolButton( TQPixmap(), "Save", "Save as PNG image", this, SLOT( slotSave() ), tools );
+ bSave->setText( "Save as..." );
+
+ tools->addSeparator();
+
+ bPColor = new TQToolButton( TQPixmap(), "Choose Pen Color", "Choose Pen Color", this, SLOT( slotColor() ), tools );
+ bPColor->setText( "Choose Pen Color..." );
+
+ tools->addSeparator();
+
+ bPWidth = new TQSpinBox( 1, 20, 1, tools );
+ TQToolTip::add( bPWidth, "Choose Pen Width" );
+ connect( bPWidth, SIGNAL( valueChanged( int ) ), this, SLOT( slotWidth( int ) ) );
+ bPWidth->setValue( 3 );
+
+ tools->addSeparator();
+
+ bClear = new TQToolButton( TQPixmap(), "Clear Screen", "Clear Screen", this, SLOT( slotClear() ), tools );
+ bClear->setText( "Clear Screen" );
+}
+
+/*
+
+Scribble::Scribble( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name )
+{
+ canvas = new Canvas( this );
+ setCentralWidget( canvas );
+
+ TQToolBar *tools = new TQToolBar( this );
+
+ bSave = new TQPushButton( "Save as...", tools );
+
+ tools->addSeparator();
+
+ bPColor = new TQPushButton( "Choose Pen Color...", tools );
+ // bPColor->setText( "Choose Pen Color..." );
+
+ tools->addSeparator();
+
+ bPWidth = new TQSpinBox( 1, 20, 1, tools );
+ TQToolTip::add( bPWidth, "Choose Pen Width" );
+ connect( bPWidth, SIGNAL( valueChanged( int ) ), this, SLOT( slotWidth( int ) ) );
+ bPWidth->setValue( 3 );
+
+ tools->addSeparator();
+
+ bClear = new TQPushButton( "Clear Screen", tools );
+ TQObject::connect( bSave, SIGNAL( clicked() ), this, SLOT( slotSave() ) );
+ TQObject::connect( bPColor, SIGNAL( clicked() ), this, SLOT( slotColor() ) );
+ TQObject::connect( bClear, SIGNAL( clicked() ), this, SLOT( slotClear() ) );
+
+}
+
+ */
+void Scribble::slotSave()
+{
+ TQPopupMenu *menu = new TQPopupMenu( 0 );
+ TQIntDict<TQString> formats;
+ formats.setAutoDelete( TRUE );
+
+ for ( unsigned int i = 0; i < TQImageIO::outputFormats().count(); i++ ) {
+ TQString str = TQString( TQImageIO::outputFormats().at( i ) );
+ formats.insert( menu->insertItem( TQString( "%1..." ).arg( str ) ), new TQString( str ) );
+ }
+
+ menu->setMouseTracking( TRUE );
+ int id = menu->exec( bSave->mapToGlobal( TQPoint( 0, bSave->height() + 1 ) ) );
+
+ if ( id != -1 ) {
+ TQString format = *formats[ id ];
+
+ TQString filename = TQFileDialog::getSaveFileName( TQString::null, TQString( "*.%1" ).arg( format.lower() ), this );
+ if ( !filename.isEmpty() )
+ canvas->save( filename, format );
+ }
+
+ delete menu;
+}
+
+void Scribble::slotColor()
+{
+ TQColor c = TQColorDialog::getColor( canvas->penColor(), this );
+ canvas->setPenColor( c );
+}
+
+void Scribble::slotWidth( int w )
+{
+ canvas->setPenWidth( w );
+}
+
+void Scribble::slotClear()
+{
+ canvas->clearScreen();
+}
diff --git a/examples/tablet/scribble.h b/examples/tablet/scribble.h
new file mode 100644
index 000000000..de5749bed
--- /dev/null
+++ b/examples/tablet/scribble.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SCRIBBLE_H
+#define SCRIBBLE_H
+
+#include <qmainwindow.h>
+#include <qpen.h>
+#include <qpoint.h>
+#include <qpixmap.h>
+#include <qwidget.h>
+#include <qstring.h>
+#include <qpointarray.h>
+
+class TQMouseEvent;
+class TQResizeEvent;
+class TQPaintEvent;
+class TQSpinBox;
+class TQToolButton;
+class Canvas;
+
+class Scribble : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ Scribble( TQWidget *parent = 0, const char *name = 0 );
+
+protected:
+ Canvas* canvas;
+
+ TQSpinBox *bPWidth;
+ TQToolButton *bPColor, *bSave, *bClear;
+
+protected slots:
+ void slotSave();
+ void slotColor();
+ void slotWidth( int );
+ void slotClear();
+
+};
+
+#endif
diff --git a/examples/tablet/tablet.doc b/examples/tablet/tablet.doc
new file mode 100644
index 000000000..8ee77f8fc
--- /dev/null
+++ b/examples/tablet/tablet.doc
@@ -0,0 +1,11 @@
+/*! \page tablet-example.html
+
+ \ingroup examples
+ \title Tablet Example
+
+ This example shows how to interact with a tablet device.
+
+ See \c{$QTDIR/examples/tablet} for the source code.
+*/
+
+
diff --git a/examples/tablet/tablet.pro b/examples/tablet/tablet.pro
new file mode 100644
index 000000000..b7b32eaba
--- /dev/null
+++ b/examples/tablet/tablet.pro
@@ -0,0 +1,12 @@
+##############################################################
+# Automatically generated by qmake Thu Jul 26 13:46:03 2001
+##############################################################
+TEMPLATE = app
+TARGET = tablet
+
+REQUIRES = tablet
+
+# Input
+HEADERS += canvas.h scribble.h tabletstats.h
+INTERFACES += tabletstatsbase.ui
+SOURCES += canvas.cpp main.cpp scribble.cpp tabletstats.cpp
diff --git a/examples/tablet/tabletstats.cpp b/examples/tablet/tabletstats.cpp
new file mode 100644
index 000000000..ac3617e0f
--- /dev/null
+++ b/examples/tablet/tabletstats.cpp
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <math.h>
+
+#include "tabletstats.h"
+
+MyOrientation::MyOrientation( TQWidget *parent, const char *name )
+ : TQFrame( parent, name, WRepaintNoErase )
+{
+// TQSizePolicy mySize( TQSizePolicy::Minimum, TQSizePolicy::Expanding );
+// setSizePolicy( mySize );
+ setFrameStyle( TQFrame::Box | TQFrame::Sunken );
+}
+
+MyOrientation::~MyOrientation()
+{
+}
+
+void MyOrientation::newOrient( int tiltX, int tiltY )
+{
+ double PI = 3.14159265359;
+ int realWidth,
+ realHeight,
+ hypot, // a faux hypoteneus, to mess with calculations
+ shaX,
+ shaY;
+ static int oldX = 0,
+ oldY = 0;
+ realWidth = width() - 2 * frameWidth();
+ realHeight = height() - 2 * frameWidth();
+
+
+
+ TQRect cr( 0 + frameWidth(), 0 + frameWidth(), realWidth, realHeight );
+ TQPixmap pix( cr.size() );
+ pix.fill( this, cr.topLeft() );
+ TQPainter p( &pix );
+
+ if ( realWidth > realHeight )
+ hypot = realHeight / 2;
+ else
+ hypot = realWidth / 2;
+
+ // create a shadow...
+ shaX = int(hypot * sin( tiltX * (PI / 180) ));
+ shaY = int(hypot * sin( tiltY * (PI / 180) ));
+
+ p.translate( realWidth / 2, realHeight / 2 );
+ p.setPen( backgroundColor() );
+ p.drawLine( 0, 0, oldX, oldY );
+ p.setPen( foregroundColor() );
+ p.drawLine( 0, 0,shaX, shaY );
+ oldX = shaX;
+ oldY = shaY;
+ p.end();
+
+ TQPainter p2( this );
+ p2.drawPixmap( cr.topLeft(), pix );
+ p2.end();
+}
+
+
+StatsCanvas::StatsCanvas( TQWidget *parent, const char* name )
+ : Canvas( parent, name, WRepaintNoErase )
+{
+ TQSizePolicy mySize( TQSizePolicy::Expanding, TQSizePolicy::Minimum );
+ setSizePolicy( mySize );
+}
+
+StatsCanvas::~StatsCanvas()
+{
+}
+
+void StatsCanvas::tabletEvent( TQTabletEvent *e )
+{
+ static TQRect oldR( -1, -1, -1, -1);
+ TQPainter p;
+
+ e->accept();
+ switch( e->type() ) {
+ case TQEvent::TabletPress:
+ qDebug( "Tablet Press" );
+ mousePressed = TRUE;
+ break;
+ case TQEvent::TabletRelease:
+ qDebug( "Tablet Release" );
+ mousePressed = FALSE;
+ clearScreen();
+ break;
+ default:
+ break;
+ }
+
+ r.setRect( e->x() - e->pressure() / 2,
+ e->y() - e->pressure() / 2, e->pressure(), e->pressure() );
+ TQRect tmpR = r | oldR;
+ oldR = r;
+
+ update( tmpR );
+ emit signalNewTilt( e->xTilt(), e->yTilt() );
+ emit signalNewDev( e->device() );
+ emit signalNewLoc( e->x(), e->y() );
+ emit signalNewPressure( e->pressure() );
+}
+
+void StatsCanvas::mouseMoveEvent( TQMouseEvent *e )
+{
+ qDebug( "Mouse Move" );
+ // do nothing
+ TQWidget::mouseMoveEvent( e );
+}
+
+
+void StatsCanvas::mousePressEvent( TQMouseEvent *e )
+{
+ qDebug( "Mouse Press" );
+ TQWidget::mousePressEvent( e );
+}
+
+void StatsCanvas::mouseReleaseEvent( TQMouseEvent *e )
+{
+ qDebug( "Mouse Release" );
+ TQWidget::mouseReleaseEvent( e );
+}
+
+void StatsCanvas::paintEvent( TQPaintEvent *e )
+{
+ TQPainter p;
+ p.begin( &buffer );
+ p.fillRect( e->rect(), colorGroup().base() );
+
+ // draw a circle if we have the tablet down
+ if ( mousePressed ) {
+ p.setBrush( red );
+ p.drawEllipse( r );
+ }
+ bitBlt( this, e->rect().x(), e->rect().y(), &buffer, e->rect().x(),
+ e->rect().y(), e->rect().width(), e->rect().height() );
+ p.end();
+}
+
+TabletStats::TabletStats( TQWidget *parent, const char *name )
+ : TabletStatsBase( parent, name )
+{
+ lblXPos->setMinimumSize( lblXPos->sizeHint() );
+ lblYPos->setMinimumSize( lblYPos->sizeHint() );
+ lblPressure->setMinimumSize( lblPressure->sizeHint() );
+ lblDev->setMinimumSize( lblDev->sizeHint() );
+ lblXTilt->setMinimumSize( lblXTilt->sizeHint() );
+ lblYTilt->setMinimumSize( lblYTilt->sizeHint() );
+
+ TQObject::connect( statCan, SIGNAL(signalNewTilt(int, int)),
+ orient, SLOT(newOrient(int, int)) );
+ TQObject::connect( statCan, SIGNAL(signalNewTilt(int, int)),
+ this, SLOT(slotTiltChanged(int, int)) );
+ TQObject::connect( statCan, SIGNAL(signalNewDev(int)),
+ this, SLOT(slotDevChanged(int)) );
+ TQObject::connect( statCan, SIGNAL(signalNewLoc(int,int)),
+ this, SLOT( slotLocationChanged(int,int)) );
+}
+
+TabletStats::~TabletStats()
+{
+}
+
+void TabletStats::slotDevChanged( int newDev )
+{
+ if ( newDev == TQTabletEvent::Stylus )
+ lblDev->setText( tr("Stylus") );
+ else if ( newDev == TQTabletEvent::Eraser )
+ lblDev->setText( tr("Eraser") );
+}
+
+void TabletStats::slotLocationChanged( int newX, int newY )
+{
+ lblXPos->setNum( newX );
+ lblYPos->setNum( newY );
+}
+
+void TabletStats::slotTiltChanged( int newTiltX, int newTiltY )
+{
+ lblXTilt->setNum( newTiltX );
+ lblYTilt->setNum( newTiltY );
+}
diff --git a/examples/tablet/tabletstats.h b/examples/tablet/tabletstats.h
new file mode 100644
index 000000000..fca8960fa
--- /dev/null
+++ b/examples/tablet/tabletstats.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef _TABLET_STATS_
+#define _TABLET_STATS_
+
+#include <qwidget.h>
+#include <qframe.h>
+#include "canvas.h"
+#include "tabletstatsbase.h"
+
+class TQLabel;
+
+class MyOrientation : public TQFrame
+{
+ Q_OBJECT
+public:
+ MyOrientation( TQWidget *parent = 0, const char *name = 0 );
+ virtual ~MyOrientation();
+
+public slots:
+ void newOrient( int tiltX, int tiltY );
+
+};
+
+class StatsCanvas : public Canvas
+{
+ Q_OBJECT
+public:
+ StatsCanvas( TQWidget *parent = 0, const char* name = 0 );
+ ~StatsCanvas();
+signals:
+ void signalNewPressure( int );
+ void signalNewTilt( int, int );
+ void signalNewDev( int );
+ void signalNewLoc( int, int );
+
+protected:
+ void tabletEvent( TQTabletEvent *e );
+ void mouseMoveEvent( TQMouseEvent *e );
+ void paintEvent( TQPaintEvent *e );
+ void mousePressEvent( TQMouseEvent *e );
+ void mouseReleaseEvent( TQMouseEvent *e );
+
+private:
+ TQRect r;
+};
+
+class TabletStats : public TabletStatsBase
+{
+ Q_OBJECT
+public:
+ TabletStats( TQWidget *parent, const char* name );
+ ~TabletStats();
+
+private slots:
+ void slotTiltChanged( int newTiltX, int newTiltY );
+ void slotDevChanged( int newDev );
+ void slotLocationChanged( int newX, int newY );
+
+protected:
+};
+
+#endif
diff --git a/examples/tablet/tabletstatsbase.ui b/examples/tablet/tabletstatsbase.ui
new file mode 100644
index 000000000..5c2c16640
--- /dev/null
+++ b/examples/tablet/tabletstatsbase.ui
@@ -0,0 +1,298 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>TabletStatsBase</class>
+<layoutdefaults spacing="6" margin="11"/>
+<widget class="TQWidget">
+ <property name="name">
+ <cstring>TabletStatsBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>657</width>
+ <height>527</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Form1</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="TQLayoutWidget">
+ <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="TQLayoutWidget">
+ <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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>X Pos:</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>lblXPos</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Y Pos:</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>lblYPos</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Pressure:</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>lblPressure</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>Device:</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>lblDev</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel9</cstring>
+ </property>
+ <property name="text">
+ <string>Tilt Information</string>
+ </property>
+ <property name="alignment">
+ <set>AlignAuto|AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <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="TQLabel">
+ <property name="name">
+ <cstring>TextLabel10</cstring>
+ </property>
+ <property name="text">
+ <string>X Tilt:</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>lblXTilt</cstring>
+ </property>
+ <property name="text">
+ <string>000</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel12</cstring>
+ </property>
+ <property name="text">
+ <string>Y Tilt:</string>
+ </property>
+ </widget>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>lblYTilt</cstring>
+ </property>
+ <property name="text">
+ <string>000</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="MyOrientation">
+ <property name="name">
+ <cstring>orient</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="StatsCanvas">
+ <property name="name">
+ <cstring>statCan</cstring>
+ </property>
+ </widget>
+ </hbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>MyOrientation</class>
+ <header location="local">tabletstats.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <slot access="public" specifier="">slotNewOrient( int, int )</slot>
+ <slot access="public" specifier="">slotNewOrient( int, int )</slot>
+ <slot access="public" specifier="">slotNewOrient( int, int )</slot>
+ <slot access="public" specifier="">slotNewOrient( int, int )</slot>
+ </customwidget>
+ <customwidget>
+ <class>StatsCanvas</class>
+ <header location="local">tabletstats.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ </sizepolicy>
+ <pixmap>image1</pixmap>
+ <signal>signalNewPressure( int )</signal>
+ <signal>signalNewTilt( int, int )</signal>
+ <signal>signalNewDev( int )</signal>
+ <signal>signalNewLoc( int, int )</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="45">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523250004143a55a6b2e0026630c4f</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="4366">789c6dd7596fe3460c07f0f7fd14c1f26d51702dd9b22d147dc81de776eea4e80375f84a9cd3499c14fdeea5867f0e9a62e30ac6af43cd509c43de9f3f56ae8e0f567efcfcf6b290c5b45c2927f2bcf2a37a9dcf3ffefceb8fbfbf7d4fd395e6bf566725fdfedbb7efc3c54ab972f8705f37e09182d23c2d935670616eb7e032ba1f2c8ddb895bda7027cd1b1704f753bbff32385787761ab8db49889fc2a5c517e3688b7f70237e64eeb4103f89b6f8307e27f1785a8d0eedbc61ee74ac9d37e13e9e8fdcc8ffde8dfb2b18f9d269b0783bb1bb13fa970eece35fb8ad9d42ff599a65663e8f96f07c355ce17939dac6fb0c168fe71ccee1757716269f76e00ae3bf4687785ab811df327713f477e6467bbf7137f578b932c7f6398cfc64c38df84318f9ca96dbdaf934dac67f80f1fc5cbb31df9b6ed4ff39daea59997b09eeb7fcc4fb97118c78eebb91cf89bb6bf9df9b7b09c6aba3adbf0cce905fee467c0ae736bff2d4b8d7eea13ef402e7585f891bf7cfdca8e72eecf53888b6fd29e67e82f13ea3adff1337f65b096788ef455bfdd6828b5ede6b07afc215bc63ee27663987bd1ebde8d09f5cc0785e1ebaf1bc398cfd401f6eece7f03c7dcdbf57847881339b2fbe73a37d0fced1fe116df377067b3ddfcc79827caf61d4438edcd85f29ecf37beab6fee412f6e7b17cf579fba15ed481bd9e63b7b5f3ad394f10bf05fb7e9f9805f35d147066e71d8ddc187f1c6debe10e169cf7095cb7cc7d37de178f8df38ee7c3b3e8506f9ec019bc84bdde5d73cc671a6deba1070beab98cb6fa6fbb313f27708dfcc7e622b57c6923dace7fbbbfccf3bc13fc0257c8f7d98df6697419fabb300bd61f1dc219d6ff3a5c637db4cd458ae7a1687bde63379ea7057791ff73b43ddf0d2c989f81dbe285a3adfdc08df18730e697a2311eea53a27e1cce7be94862f5a002ceccb26a2e529c979bb0cfcf07ecfdcfdcd86f4bb38f276f6e9c0f5dd8ebb11f6df319f68368bdc5e6eb29dae66bcd5ca4c8770ad738ffdfdd589f73b38f4f68f7f165df8df558b9118ff14bd49b6ea22dfe18aeb1ff6a37ceb770be149d52701ebeb8edfd45b730eee7d48df3e63ddac6db71e37df5e8c6fbae6daebcde1d377eaf84f928aa52709e3ec035ced3cc1ce393681befd58df7d71adcc5ef917337ceb3eb689b9ff07ba5cc4ac1fcbec235f6ebc06df3cd8766bf5f166eaccf891bfbf718467df9c08de76b455bbe7b30d60b87f55056558dfecedc961f1d99eb14f5bb73e33c0feff34afbb7e7a347736cafa2edfec28df82bb88b7aecb9b15fc3fc54759d16b6fe6f616f5f8fb6faedba51cf1bd8f3bb8c0eed127e3fd45d374517557017f6f909f35beb5f9985f755380f46e1aff170d17c9858b8e052af5f7d571665f15cf388c73ce1a95e33befdcf35d6cf1dcff95eef7988f1053ff2133f6bdb23bff0825ff98ddf79c91ffcc9abbca6f1ebbcc1a5c5f3a6c66df136ef68ec8077798ff7f9800ff9888f79c8277cca677cce177cc914e245b378d69eaef89a6fb8c509a7dce60e67fadde51ef739e79c98886dbe463c25a1824aaaa8e62e8d684c139ad28c6e35be4b7734a77bbea007b6fa95daff95463fd2133dd30b2de8355c737aa3775aeae7833eb5ffd5d8ff8cd6689d53daa04d5ae8d8cdb5c543bdeb43a3b7b5971d8d1f205e347e97f6689f0e62df877444c7e18e916634a4133afdd2ff199d6befdef7055dd2155dd30db528d1fe979486fe3dff19559c501b7d7728a3aed634a11ef529d7e8a1e8f4ebf3c6fe799f8e859abe45a410ad141f4825b57aa4e32e65fc357f9968fb945e45ef945bb9d359c8b82d737d27dc37f973ef6bfef2a0f18ff224cff2220b79953779d7194bf45beb231ff2f925ff5b59d5b63559970ded719387b225dbb2d3cc70537f19c8ee97fcc7b227fb3a5b4f722087a8d1428ee438440fe5e47ff5bfe33539d53c97dc15963339970beac932cced50b319cba5e63f88fdcff954aee43acca55e7ae736226f349781b4249154dac8bf928eaeef73ad9dfe234fe772896b28039a484fa3fb92175c90ade7b05f3674fd9d86ab2e84ee8ae6af647de3ea22ae34ba2e463c8afb4b576a31b61d3a5cd02a3d84cf2a3c2826c5b4d9c3c5cce28b5931d3091f696547faff7ff5bdd9c468fffffcfeed5fd8c2e305</data>
+ </image>
+</images>
+<connections>
+ <connection language="C++">
+ <sender>statCan</sender>
+ <signal>signalNewPressure( int )</signal>
+ <receiver>lblPressure</receiver>
+ <slot>setNum(int)</slot>
+ </connection>
+</connections>
+</UI>
diff --git a/examples/tetrix/README b/examples/tetrix/README
new file mode 100644
index 000000000..869c2dbfb
--- /dev/null
+++ b/examples/tetrix/README
@@ -0,0 +1,28 @@
+ Oslo, May 14 1995
+
+This code was written to test the very first Qt skeleton. It was in
+fact the first Qt application and was written at a time when Qt only
+had pushbutton widgets and the drawing engine was limited to drawing
+text in a single font and drawing lines (no kidding, those were the
+only two drawing operations). In fact the tetrix project doubled the
+number of widgets in Qt by introducing the QLCDNumber widget. The whole
+application was written in 5 evenings and 1 weekend and is not very
+well documented. The tetrix engine is implemented in the GenericTetrix
+class and was first made on my good old 10 MHZ AT where I made a DOS
+text-mode Tetrix (using about 50 lines) to test it out, it was later
+moved to a SUN Sparc 10, where it met Qt. GenericTetrix is totally
+independent of Qt, feel free to use it in any way you like. (see the
+file gtetrix.h for a brief description of how to use it)
+
+Enjoy!
+
+ Eirik Eng
+ -----
+
+P.S. Tetrix has later been updated to show new versions of Qt.
+
+P.P.S The tetrix program uses a special application object called
+ QDragApplication. Try to guess what it does.
+ Hint: Try pressing the right mouse button somewhere in the
+ tetrix window and start dragging....
+
diff --git a/examples/tetrix/gtetrix.cpp b/examples/tetrix/gtetrix.cpp
new file mode 100644
index 000000000..92b946b44
--- /dev/null
+++ b/examples/tetrix/gtetrix.cpp
@@ -0,0 +1,502 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "gtetrix.h"
+
+#include <string.h>
+
+GenericTetrix::GenericTetrix(int boardWidth,int boardHeight)
+{
+ int i,j;
+
+ width = boardWidth;
+ height = boardHeight;
+ boardPtr = new int[height*width]; // Note the order, this makes it easier
+ // to remove full lines.
+ for(i = 0 ; i < height ; i++)
+ for(j = 0 ; j < width ; j++)
+ board(j,i) = 0;
+ currentLine = -1; // -1 if no falling piece.
+ currentPos = 0;
+ showNext = 0; // FALSE
+ nLinesRemoved = 0;
+ nPiecesDropped = 0;
+ score = 0;
+ level = 1;
+ gameID = 0;
+ nClearLines = height;
+}
+
+GenericTetrix::~GenericTetrix()
+{
+ delete[] boardPtr;
+}
+
+
+void GenericTetrix::clearBoard(int fillRandomLines)
+{
+ int i,j;
+
+ if (fillRandomLines >= height)
+ fillRandomLines = height - 1;
+
+ erasePiece();
+ for(i = height - nClearLines - 1 ; i >= fillRandomLines ; i--)
+ for(j = 0 ; j < width ; j++)
+ if (board(j,i) != 0) {
+ draw(j,i,0);
+ board(j,i) = 0;
+ }
+ if (fillRandomLines != 0)
+ for (i = 0 ; i < fillRandomLines ; i++) {
+ fillRandom(i);
+ }
+ nClearLines = height - fillRandomLines;
+}
+
+void GenericTetrix::showBoard()
+{
+ int i,j;
+
+ showPiece();
+ for(i = height - nClearLines - 1 ; i >= 0 ; i--)
+ for(j = 0 ; j < width ; j++)
+ if (board(j,i) != 0)
+ draw(j,i,board(j,i));
+}
+
+void GenericTetrix::hideBoard()
+{
+ int i,j;
+
+ erasePiece();
+ for(i = height - nClearLines - 1 ; i >= 0 ; i--)
+ for(j = 0 ; j < width ; j++)
+ if (board(j,i) != 0)
+ draw(j,i,0);
+}
+
+void GenericTetrix::startGame(int gameType,int fillRandomLines)
+{
+ gameID = gameType;
+ clearBoard(fillRandomLines);
+ nLinesRemoved = 0;
+ updateRemoved(nLinesRemoved);
+ nClearLines = height;
+ nPiecesDropped = 0;
+ score = 0;
+ updateScore(score);
+ level = 1;
+ updateLevel(level);
+ newPiece();
+}
+
+void GenericTetrix::revealNextPiece(int revealIt)
+{
+ if (showNext == revealIt)
+ return;
+ showNext = revealIt;
+ if (!showNext)
+ eraseNextPiece();
+ else
+ showNextPiece();
+}
+
+void GenericTetrix::updateBoard(int x1,int y1,int x2, int y2,
+ int dontUpdateBlanks)
+{
+ int i,j;
+ int tmp;
+
+ if (x1 > x2) {
+ tmp = x2;
+ x2 = x1;
+ x1 = tmp;
+ }
+ if (y1 > y2) {
+ tmp = y2;
+ y2 = y1;
+ y1 = tmp;
+ }
+ if (x1 < 0)
+ x1 = 0;
+ if (x2 >= width)
+ x2 = width - 1;
+ if (y1 < 0)
+ y1 = 0;
+ if (y2 >= height)
+ y2 = height - 1;
+ for(i = y1 ; i <= y2 ; i++)
+ for(j = x1 ; j <= x2 ; j++)
+ if (!dontUpdateBlanks || board(j,height - i - 1) != 0)
+ draw(j,height - i - 1,board(j,height - i - 1));
+ showPiece(); // Remember to update piece correctly!!!!
+}
+
+
+void GenericTetrix::fillRandom(int line)
+{
+ int i,j;
+ int holes;
+
+ for(i = 0 ; i < width ; i++)
+ board(i,line) = TetrixPiece::randomValue(7);
+ holes = 0;
+ for(i = 0 ; i < width ; i++)
+ if (board(i,line) == 0) // Count holes in the line.
+ holes++;
+ if (holes == 0) // Full line, make a random hole:
+ board(TetrixPiece::randomValue(width),line) = 0;
+ if (holes == width) // Empty line, make a random square:
+ board(TetrixPiece::randomValue(width),line) =
+ TetrixPiece::randomValue(6) + 1;
+ for(j = 0 ; j < width ; j++)
+ draw(j,i,board(j,i));
+}
+
+void GenericTetrix::moveLeft(int steps)
+{
+ while(steps) {
+ if (!canMoveTo(currentPos - 1,currentLine))
+ return;
+ moveTo(currentPos - 1,currentLine);
+ steps--;
+ }
+}
+
+void GenericTetrix::moveRight(int steps)
+{
+ while(steps) {
+ if (!canMoveTo(currentPos + 1,currentLine))
+ return;
+ moveTo(currentPos + 1,currentLine);
+ steps--;
+ }
+}
+
+void GenericTetrix::rotateLeft()
+{
+ TetrixPiece tmp(currentPiece);
+
+ tmp.rotateLeft();
+ if (!canPosition(tmp))
+ return;
+ position(tmp);
+ currentPiece = tmp;
+}
+
+void GenericTetrix::rotateRight()
+{
+ TetrixPiece tmp(currentPiece);
+
+ tmp.rotateRight();
+ if (!canPosition(tmp))
+ return;
+ position(tmp);
+ currentPiece = tmp;
+}
+
+void GenericTetrix::dropDown()
+{
+ if (currentLine == -1)
+ return;
+
+ int dropHeight = 0;
+ int newLine = currentLine;
+ while(newLine) {
+ if (!canMoveTo(currentPos,newLine - 1))
+ break;
+ newLine--;
+ dropHeight++;
+ }
+ if (dropHeight != 0)
+ moveTo(currentPos,newLine);
+ internalPieceDropped(dropHeight);
+}
+
+void GenericTetrix::oneLineDown()
+{
+ if (currentLine == -1)
+ return;
+ if (canMoveTo(currentPos,currentLine - 1)) {
+ moveTo(currentPos,currentLine - 1);
+ } else {
+ internalPieceDropped(0);
+ }
+}
+
+void GenericTetrix::newPiece()
+{
+ currentPiece = nextPiece;
+ if (showNext)
+ eraseNextPiece();
+ nextPiece.setRandomType();
+ if (showNext)
+ showNextPiece();
+ currentLine = height - 1 + currentPiece.getMinY();
+ currentPos = width/2 + 1;
+ if (!canMoveTo(currentPos,currentLine)) {
+ currentLine = -1;
+ gameOver();
+ } else {
+ showPiece();
+ }
+}
+
+void GenericTetrix::removePiece()
+{
+ erasePiece();
+ currentLine = -1;
+}
+
+void GenericTetrix::drawNextSquare(int,int,int)
+{
+
+}
+
+void GenericTetrix::pieceDropped(int)
+{
+ newPiece();
+}
+
+void GenericTetrix::updateRemoved(int)
+{
+}
+
+void GenericTetrix::updateScore(int)
+{
+}
+
+void GenericTetrix::updateLevel(int)
+{
+}
+
+void GenericTetrix::removeFullLines()
+{
+ int i,j,k;
+ int nFullLines;
+
+ for(i = 0 ; i < height - nClearLines ; i++) {
+ for(j = 0 ; j < width ; j++)
+ if (board(j,i) == 0)
+ break;
+ if (j == width) {
+ nFullLines = 1;
+ for(k = i + 1 ; k < height - nClearLines ; k++) {
+ for(j = 0 ; j < width ; j++)
+ if (board(j,k) == 0)
+ break;
+ if (j == width) {
+ nFullLines++;
+ } else {
+ for(j = 0 ; j < width ; j++) {
+ if (board(j,k - nFullLines) != board(j,k)) {
+ board(j,k - nFullLines) = board(j,k);
+ draw( j,k - nFullLines,
+ board(j,k - nFullLines));
+ }
+ }
+ }
+ }
+ nClearLines = nClearLines + nFullLines;
+ nLinesRemoved = nLinesRemoved + nFullLines;
+ updateRemoved(nLinesRemoved);
+ score = score + 10*nFullLines; // updateScore must be
+ // called by caller!
+ for (i = height - nClearLines ;
+ i < height - nClearLines + nFullLines ;
+ i++)
+ for(j = 0 ; j < width ; j++)
+ if (board(j,i) != 0) {
+ draw(j,i,0);
+ board(j,i) = 0;
+ }
+ }
+ }
+}
+
+void GenericTetrix::showPiece()
+{
+ int x,y;
+
+ if (currentLine == -1)
+ return;
+
+ for(int i = 0 ; i < 4 ; i++) {
+ currentPiece.getCoord(i,x,y);
+ draw(currentPos + x,currentLine - y,currentPiece.getType());
+ }
+}
+
+void GenericTetrix::erasePiece()
+{
+ int x,y;
+
+ if (currentLine == -1)
+ return;
+
+ for(int i = 0 ; i < 4 ; i++) {
+ currentPiece.getCoord(i,x,y);
+ draw(currentPos + x,currentLine - y,0);
+ }
+}
+
+void GenericTetrix::internalPieceDropped(int dropHeight)
+{
+ gluePiece();
+ nPiecesDropped++;
+ if (nPiecesDropped % 25 == 0) {
+ level++;
+ updateLevel(level);
+ }
+ score = score + 7 + dropHeight;
+ removeFullLines();
+ updateScore(score);
+ pieceDropped(dropHeight);
+}
+
+void GenericTetrix::gluePiece()
+{
+ int x,y;
+ int min;
+
+ if (currentLine == -1)
+ return;
+
+ for(int i = 0 ; i < 4 ; i++) {
+ currentPiece.getCoord(i,x,y);
+ board(currentPos + x,currentLine - y) = currentPiece.getType();
+ }
+ min = currentPiece.getMinY();
+ if (currentLine - min >= height - nClearLines)
+ nClearLines = height - currentLine + min - 1;
+}
+
+void GenericTetrix::showNextPiece(int erase)
+{
+ int x,y;
+ int minX = nextPiece.getMinX();
+ int minY = nextPiece.getMinY();
+ int maxX = nextPiece.getMaxX();
+ int maxY = nextPiece.getMaxY();
+
+ int xOffset = (3 - (maxX - minX))/2;
+ int yOffset = (3 - (maxY - minY))/2;
+
+ for(int i = 0 ; i < 4 ; i++) {
+ nextPiece.getCoord(i,x,y);
+ if (erase)
+ drawNextSquare(x + xOffset - minX,
+ y + yOffset - minY,0);
+ else
+ drawNextSquare(x + xOffset - minX,
+ y + yOffset - minY,nextPiece.getType());
+ }
+}
+
+int GenericTetrix::canPosition(TetrixPiece &piece)
+{
+ if (currentLine == -1)
+ return 0;
+
+ int x,y;
+
+ for(int i = 0 ; i < 4 ; i++) {
+ piece.getCoord(i,x,y);
+ x = currentPos + x;
+ y = currentLine - y; // Board and pieces have inverted y-coord. systems.
+ if (x < 0 || x >= width || y < 0 || y >= height)
+ return 0; // Outside board, cannot put piece here.
+ if (board(x,y) != 0)
+ return 0; // Over a non-zero square, cannot put piece here.
+ }
+ return 1; // Inside board and no non-zero squares underneath.
+
+}
+
+int GenericTetrix::canMoveTo(int xPosition,int line)
+{
+ if (currentLine == -1)
+ return 0;
+
+ int x,y;
+
+ for(int i = 0 ; i < 4 ; i++) {
+ currentPiece.getCoord(i,x,y);
+ x = xPosition + x;
+ y = line - y; // Board and pieces have inverted y-coord. systems.
+ if (x < 0 || x >= width || y < 0 || y >= height)
+ return 0; // Outside board, cannot put piece here.
+ if (board(x,y) != 0)
+ return 0; // Over a non-zero square, cannot put piece here.
+ }
+ return 1; // Inside board and no non-zero squares underneath.
+}
+
+void GenericTetrix::moveTo(int xPosition,int line)
+{
+ if (currentLine == -1)
+ return;
+ optimizedMove(xPosition,line,currentPiece);
+ currentPos = xPosition;
+ currentLine = line;
+}
+
+void GenericTetrix::position(TetrixPiece &piece)
+{
+ if (currentLine == -1)
+ return;
+
+ optimizedMove(currentPos,currentLine,piece);
+}
+
+void GenericTetrix::optimizedMove(int newPos, int newLine,
+ TetrixPiece &newPiece)
+{
+ int updates [8][3];
+ int nUpdates;
+ int value;
+ int x,y;
+ int i,j;
+
+ for(i = 0 ; i < 4 ; i++) { // Put the erasing coords into updates
+ currentPiece.getCoord(i,x,y);
+ updates[i][0] = currentPos + x;
+ updates[i][1] = currentLine - y;
+ updates[i][2] = 0;
+ }
+ nUpdates = 4;
+ for(i = 0 ; i < 4 ; i++) { // Any drawing coord same as an erasing one?
+ newPiece.getCoord(i,x,y);
+ x = newPos + x;
+ y = newLine - y;
+ for (j = 0 ; j < 4 ; j++)
+ if (updates[j][0] == x && updates[j][1] == y) { // Same coord,
+ // don't have to erase
+ if (currentPiece.getType() == newPiece.getType())
+ updates[j][2] = -1; // Correct on screen, no update!
+ else
+ updates[j][2] = newPiece.getType();
+ break;
+ }
+ if (j == 4) { // This coord does not overlap an erasing one
+ updates[nUpdates][0] = x;
+ updates[nUpdates][1] = y;
+ updates[nUpdates][2] = newPiece.getType();
+ nUpdates++;
+ }
+ }
+ for (i = 0 ; i < nUpdates ; i++) { // Do the updating
+ x = updates[i][0];
+ y = updates[i][1];
+ value = updates[i][2];
+ if (value != -1) // Only update if new value != current
+ draw(x,y,value);
+ }
+}
diff --git a/examples/tetrix/gtetrix.h b/examples/tetrix/gtetrix.h
new file mode 100644
index 000000000..170def596
--- /dev/null
+++ b/examples/tetrix/gtetrix.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef GTETRIX_H
+#define GTETRIX_H
+
+#include "tpiece.h"
+
+
+class GenericTetrix
+{
+public:
+ GenericTetrix(int boardWidth = 10,int boardHeight = 22);
+ virtual ~GenericTetrix();
+
+ void clearBoard(int fillRandomLines = 0);
+ void revealNextPiece(int revealIt);
+ void updateBoard(int x1,int y1,int x2,int y2,int dontUpdateBlanks = 0);
+ void updateNext(){if (showNext) showNextPiece();}
+ void hideBoard();
+ void showBoard();
+ void fillRandom(int line);
+
+ void moveLeft(int steps = 1);
+ void moveRight(int steps = 1);
+ void rotateLeft();
+ void rotateRight();
+ void dropDown();
+ void oneLineDown();
+ void newPiece();
+ void removePiece();
+
+ int noOfClearLines() {return nClearLines;}
+ int getLinesRemoved() {return nLinesRemoved;}
+ int getPiecesDropped() {return nPiecesDropped;}
+ int getScore() {return score;}
+ int getLevel() {return level;}
+ int boardHeight() {return height;}
+ int boardWidth() {return width;}
+
+ virtual void drawSquare(int x,int y,int value) = 0;
+ virtual void gameOver() = 0;
+
+ virtual void startGame(int gameType = 0,int fillRandomLines = 0);
+ virtual void drawNextSquare(int x,int y,int value);
+ virtual void pieceDropped(int dropHeight);
+ virtual void updateRemoved(int noOfLines);
+ virtual void updateScore(int newScore);
+ virtual void updateLevel(int newLevel);
+
+private:
+ void draw(int x, int y, int value){drawSquare(x,height - y,value);}
+ void removeFullLines();
+ void removeLine(int line);
+ void showPiece();
+ void erasePiece();
+ void internalPieceDropped(int dropHeight);
+ void gluePiece();
+ void showNextPiece(int erase = 0);
+ void eraseNextPiece(){showNextPiece(1);};
+ int canPosition(TetrixPiece &piece); // Returns a boolean value.
+ int canMoveTo(int xPosition, int line); // Returns a boolean value.
+ void moveTo(int xPosition,int line);
+ void position(TetrixPiece &piece);
+ void optimizedMove(int newPos, int newLine,TetrixPiece &newPiece);
+
+ int &board(int x,int y){return boardPtr[width*y + x];}
+
+ TetrixPiece currentPiece;
+ TetrixPiece nextPiece;
+ int currentLine;
+ int currentPos;
+ int showNext; // Boolean variable.
+ int nLinesRemoved;
+ int nPiecesDropped;
+ int score;
+ int level;
+ int gameID;
+ int nClearLines;
+ int width;
+ int height;
+ int *boardPtr;
+};
+
+
+#endif
diff --git a/examples/tetrix/qdragapp.cpp b/examples/tetrix/qdragapp.cpp
new file mode 100644
index 000000000..409d418b3
--- /dev/null
+++ b/examples/tetrix/qdragapp.cpp
@@ -0,0 +1,502 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qdragapp.h"
+#include "qptrlist.h"
+#include "qintdict.h"
+#include "qpopupmenu.h"
+#include "qguardedptr.h"
+#include "qcolor.h"
+#include "qwidget.h"
+#include "qfontmetrics.h"
+#include "qcursor.h"
+#include "qobjectlist.h"
+
+TQWidget *cursorWidget( TQPoint * = 0 );
+
+class TQDragger;
+
+
+class DropWindow : public TQWidget
+{
+ Q_OBJECT
+public:
+ void paintEvent( TQPaintEvent * );
+ void closeEvent( TQCloseEvent * );
+
+ TQDragger *master;
+};
+
+
+struct DropInfo {
+ DropInfo() { w=0; }
+ ~DropInfo() { delete w; }
+ DropWindow *w;
+ bool userOpened;
+};
+
+struct DraggedInfo {
+ TQWidget *w;
+ TQWidget *mother;
+ TQPoint pos;
+};
+
+
+class TQDragger : public TQObject
+{
+ Q_OBJECT
+public:
+ TQDragger();
+ ~TQDragger();
+
+ bool notify( TQObject *, TQEvent * ); // event filter
+ void closeDropWindow( DropWindow * );
+public slots:
+ void openDropWindow();
+ void killDropWindow();
+ void killAllDropWindows();
+ void sendChildHome();
+ void sendAllChildrenHome();
+private:
+ bool isParentToDragged( TQWidget * );
+ bool noWidgets( TQWidget * );
+ void killDropWindow( DropInfo * );
+ void killAllDropWindows( bool );
+ void sendChildHome( DraggedInfo * );
+ void sendAllChildrenHome( TQWidget * );
+ TQWidget *openDropWindow( const TQRect&, bool );
+
+ bool startGrab();
+ void grabFinished();
+ bool dragEvent( TQWidget *, TQMouseEvent * );
+ bool killDropEvent( TQMouseEvent * );
+ bool sendChildEvent( TQMouseEvent * );
+
+ bool killingDrop;
+ bool sendingChild;
+ TQWidget *clickedWidget;
+ TQGuardedPtr<TQWidget> hostWidget;
+ TQCursor cursor;
+
+ TQPopupMenu* menu;
+ TQPoint clickOffset;
+ TQColor dragBackground;
+ TQColor dragForeground;
+ DraggedInfo dragInfo;
+ TQIntDict<DraggedInfo> draggedDict;
+ TQIntDict<DropInfo> dropDict;
+};
+
+
+TQDragApplication::TQDragApplication( int &argc, char **argv )
+ : TQApplication( argc, argv ), dragger( 0 )
+{
+ dragger = new TQDragger;
+}
+
+TQDragApplication::~TQDragApplication()
+{
+ delete dragger;
+}
+
+bool TQDragApplication::notify( TQObject *o, TQEvent *e )
+{
+ if ( dragger && !dragger->notify( o, e ) )
+ return TQApplication::notify( o, e );
+ else
+ return FALSE;
+}
+
+void DropWindow::paintEvent( TQPaintEvent * )
+{
+ const char *msg = "Drag widgets and drop them here or anywhere!";
+ int startX = ( width() - fontMetrics().width( msg ) )/2;
+ startX = startX < 0 ? 0 : startX;
+
+ drawText( startX, height()/2, msg );
+}
+
+void DropWindow::closeEvent( TQCloseEvent *e )
+{
+ master->closeDropWindow( this );
+ e->ignore();
+}
+
+TQDragger::TQDragger()
+{
+ dragInfo.w = 0;
+ killingDrop = FALSE;
+ sendingChild = FALSE;
+ draggedDict.setAutoDelete( TRUE );
+ dropDict .setAutoDelete( TRUE );
+
+ menu = new TQPopupMenu;
+ menu->insertItem( "Open drop window", 1 );
+ menu->insertItem( "Kill drop window", 2 );
+ menu->insertItem( "Kill all drop windows", 3 );
+ menu->insertSeparator();
+// menu->insertItem( "Send child home", 4 );
+ menu->insertItem( "Send all children home", 5 );
+
+ menu->connectItem( 1, this, SLOT(openDropWindow()) );
+ menu->connectItem( 2, this, SLOT(killDropWindow()) );
+ menu->connectItem( 3, this, SLOT(killAllDropWindows()) );
+// menu->connectItem( 4, this, SLOT(sendChildHome()) );
+ menu->connectItem( 5, this, SLOT(sendAllChildrenHome()) );
+}
+
+TQDragger::~TQDragger()
+{
+ delete menu;
+}
+
+
+bool TQDragger::notify( TQObject *o, TQEvent *e )
+{
+ if ( !o->isWidgetType() || o == menu )
+ return FALSE;
+ switch( e->type() ) {
+ case TQEvent::MouseMove:
+ {
+ TQMouseEvent *tmp = (TQMouseEvent*) e;
+ if ( killingDrop )
+ return killDropEvent( tmp );
+ if ( sendingChild )
+ return sendChildEvent( tmp );
+ if ( tmp->state() & TQMouseEvent::RightButton )
+ return dragEvent( (TQWidget*) o, tmp );
+ break;
+ }
+ case TQEvent::MouseButtonPress:
+ case TQEvent::MouseButtonRelease:
+ case TQEvent::MouseButtonDblClick:
+ {
+ TQMouseEvent *tmp = (TQMouseEvent*) e;
+ if ( killingDrop )
+ return killDropEvent( tmp );
+ if ( sendingChild )
+ return sendChildEvent( tmp );
+ if ( tmp->button() == TQMouseEvent::RightButton )
+ return dragEvent( (TQWidget*) o, tmp );
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+bool TQDragger::isParentToDragged( TQWidget *w )
+{
+ TQIntDictIterator<DraggedInfo> iter( draggedDict );
+
+ DraggedInfo *tmp;
+ while( (tmp = iter.current()) ) {
+ ++iter;
+ if ( tmp->mother == w )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool TQDragger::noWidgets( TQWidget *w )
+{
+ const TQObjectList *l = w->children();
+ if ( !l )
+ return TRUE;
+ TQObjectListIt iter( *l );
+ TQObject *tmp;
+ while( (tmp = iter.current()) ) {
+ ++iter;
+ if ( tmp->isWidgetType() )
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void TQDragger::sendAllChildrenHome( TQWidget *w )
+{
+ const TQObjectList *l = w->children();
+ if ( !l )
+ return;
+ TQObjectListIt iter( *l );
+ TQObject *tmp;
+ while( (tmp = iter.current()) ) {
+ ++iter;
+ if ( tmp->isWidgetType() ) {
+ sendAllChildrenHome( (TQWidget*) tmp );
+ DraggedInfo *di = draggedDict.find( (long) tmp );
+ if ( di )
+ sendChildHome( di );
+ }
+ }
+}
+
+bool TQDragger::dragEvent( TQWidget *w, TQMouseEvent *e )
+{
+ switch( e->type() ) {
+ case TQEvent::MouseButtonDblClick:
+ case TQEvent::MouseButtonPress: {
+ if ( !noWidgets( w ) || // has widget children
+ isParentToDragged( w ) || // has had widget children
+ w->parentWidget() == 0 ) { // is top level window
+ hostWidget = w;
+ menu->popup( w->mapToGlobal( e->pos() ) );
+ return TRUE;
+ }
+ if ( !draggedDict.find( (long) w ) ) {
+ DraggedInfo *tmp = new DraggedInfo;
+ tmp->w = w;
+ tmp->mother = w->parentWidget();
+ tmp->pos = w->frameGeometry().topLeft();
+ draggedDict.insert( (long) w, tmp );
+ }
+ dragBackground = w->backgroundColor();
+ dragForeground = w->foregroundColor();
+ dragInfo.w = w;
+ dragInfo.mother = w->parentWidget();
+ dragInfo.pos = w->frameGeometry().topLeft();
+ clickOffset = e->pos();
+ dragInfo.w = w;
+ TQPoint p = w->mapToGlobal(TQPoint(0,0));
+ w->reparent( 0, WType_Popup, p, TRUE );
+
+ return TRUE;
+ }
+ case TQEvent::MouseButtonRelease:
+ case TQEvent::MouseMove: {
+ if ( dragInfo.w != 0 ) {
+ TQPoint p = TQCursor::pos() - clickOffset;
+ dragInfo.w->move( p );
+ if ( e->type() == TQEvent::MouseMove )
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ if ( !dragInfo.w )
+ return FALSE;
+ if ( w != dragInfo.w )
+ w = dragInfo.w;
+ dragInfo.w = 0;
+ w->hide();
+ TQPoint pos;
+ TQWidget *target = cursorWidget( &pos );
+ pos = pos - clickOffset;
+ TQPoint p;
+ if ( !target ) {
+ target = openDropWindow( TQRect( pos, w->size() ),
+ FALSE);
+ p = TQPoint( 0, 0 );
+ }
+ else
+ p = target->mapFromGlobal( pos );
+ w->reparent( target, 0, p, TRUE );
+ DropInfo *tmp = dropDict.find( (long) dragInfo.mother );
+ if ( tmp ) {
+ if ( !tmp->userOpened && noWidgets( tmp->w ) )
+ dropDict.remove( (long) tmp->w );
+ }
+ if ( !target->isVisible() )
+ target->show();
+ }
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+bool TQDragger::killDropEvent( TQMouseEvent *e )
+{
+ switch( e->type() ) {
+ case TQEvent::MouseButtonDblClick:
+ case TQEvent::MouseButtonPress:
+ clickedWidget = cursorWidget();
+ return TRUE;
+ case TQEvent::MouseButtonRelease:
+ hostWidget->releaseMouse();
+ if ( clickedWidget ) {
+ DropInfo *tmp = dropDict.find( (long) clickedWidget );
+ if( tmp ) {
+ killDropWindow( tmp );
+ dropDict.remove( (long) tmp->w );
+ }
+ }
+ grabFinished();
+ return TRUE;
+ case TQEvent::MouseMove:
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+bool TQDragger::sendChildEvent( TQMouseEvent *e )
+{
+ switch( e->type() ) {
+ case TQEvent::MouseButtonDblClick:
+ case TQEvent::MouseButtonPress:
+ clickedWidget = cursorWidget();
+ return TRUE;
+ case TQEvent::MouseButtonRelease:
+ hostWidget->releaseMouse();
+ if ( clickedWidget ) {
+ DraggedInfo *tmp = draggedDict.find((long) clickedWidget);
+ if( tmp ) {
+ TQWidget *parent = tmp->w->parentWidget();
+ sendChildHome( tmp );
+ DropInfo *dri = dropDict.find( (long) parent );
+ if ( dri && noWidgets(dri->w) && !dri->userOpened ) {
+ killDropWindow( dri );
+ dropDict.remove( (long) dri );
+ }
+ }
+ grabFinished();
+ }
+ return TRUE;
+ case TQEvent::MouseMove:
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+bool TQDragger::startGrab()
+{
+ if ( !hostWidget )
+ return FALSE;
+ clickedWidget = 0;
+ cursor = hostWidget->cursor();
+ hostWidget->grabMouse();
+ hostWidget->setCursor( TQCursor( CrossCursor ) );
+ return TRUE;
+}
+
+void TQDragger::grabFinished()
+{
+ killingDrop = FALSE;
+ sendingChild = FALSE;
+ if(hostWidget)
+ hostWidget->setCursor( cursor );
+}
+
+void TQDragger::closeDropWindow( DropWindow *w )
+{
+ DropInfo *tmp = dropDict.find( (long) w);
+ if( tmp )
+ killDropWindow( tmp );
+}
+
+void TQDragger::openDropWindow()
+{
+ TQWidget *tmp = openDropWindow( TQRect(100, 100, 300, 200), TRUE );
+ tmp->show();
+}
+
+TQWidget *TQDragger::openDropWindow( const TQRect &r, bool user )
+{
+ DropInfo *tmp = new DropInfo;
+ DropWindow *w = new DropWindow;
+ if ( user ) {
+ tmp->userOpened = TRUE;
+ w->setCaption( "Drop window" );
+ } else {
+ tmp->userOpened = FALSE;
+ w->setCaption( "Auto drop window" );
+ }
+ tmp->w = w;
+ w->master = this;
+ w->setGeometry( r );
+ dropDict.insert( (long) w, tmp );
+ w->show();
+ return w;
+}
+
+void TQDragger::killDropWindow()
+{
+ if ( startGrab() )
+ killingDrop = TRUE;
+}
+
+void TQDragger::killDropWindow( DropInfo *di )
+{
+ const TQObjectList *l = di->w->children();
+ if ( !l )
+ return;
+ TQObjectListIt iter( *l );
+ TQObject *tmp;
+ while( (tmp = iter.current()) ) {
+ ++iter;
+ if ( tmp->isWidgetType() ) {
+ DraggedInfo *dri = draggedDict.find( (long) tmp );
+ if ( dri ) {
+ sendChildHome( dri );
+ draggedDict.remove( (long) tmp );
+ }
+ }
+ }
+ di->w->hide();
+}
+
+void TQDragger::killAllDropWindows()
+{
+ killAllDropWindows( FALSE );
+}
+
+void TQDragger::killAllDropWindows( bool autoOnly )
+{
+ TQIntDictIterator<DropInfo> iter( dropDict );
+
+ DropInfo *tmp;
+ while( (tmp = iter.current()) ) {
+ ++iter;
+ if( !autoOnly || !tmp->userOpened ) {
+ killDropWindow( tmp );
+ dropDict.remove( (long) tmp->w );
+ }
+ }
+}
+
+void TQDragger::sendChildHome( DraggedInfo *i )
+{
+ i->w->reparent( i->mother, 0, i->pos, TRUE );
+}
+
+void TQDragger::sendChildHome()
+{
+ if ( startGrab() )
+ sendingChild = TRUE;
+}
+
+void TQDragger::sendAllChildrenHome()
+{
+ TQIntDictIterator<DraggedInfo> iter( draggedDict );
+
+ DraggedInfo *tmp;
+ while( (tmp = iter.current()) ) {
+ ++iter;
+ sendChildHome( tmp );
+ draggedDict.remove( (long) tmp->w );
+ }
+ killAllDropWindows( TRUE );
+ draggedDict.clear();
+}
+
+
+TQWidget *cursorWidget( TQPoint *p )
+{
+ TQPoint curpos = TQCursor::pos();
+ if ( p )
+ *p = curpos;
+ return TQApplication::widgetAt( curpos );
+}
+
+
+#include "qdragapp.moc"
diff --git a/examples/tetrix/qdragapp.h b/examples/tetrix/qdragapp.h
new file mode 100644
index 000000000..f0334b829
--- /dev/null
+++ b/examples/tetrix/qdragapp.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TQDRAGAPP_H
+#define TQDRAGAPP_H
+
+#include "qapplication.h"
+
+class TQDragger;
+
+class TQDragApplication : public TQApplication
+{
+ Q_OBJECT
+public:
+ TQDragApplication( int &argc, char **argv );
+ virtual ~TQDragApplication();
+
+ virtual bool notify( TQObject *, TQEvent * ); // event filter
+
+private:
+ TQDragger *dragger;
+};
+
+
+#endif // TQDRAGAPP_H
diff --git a/examples/tetrix/qtetrix.cpp b/examples/tetrix/qtetrix.cpp
new file mode 100644
index 000000000..68b49c254
--- /dev/null
+++ b/examples/tetrix/qtetrix.cpp
@@ -0,0 +1,176 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qtetrix.h"
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qdatetime.h>
+
+
+void drawTetrixButton( TQPainter *p, int x, int y, int w, int h,
+ const TQColor *color, TQWidget *widg)
+{
+ if ( color ) {
+ TQPointArray a;
+ a.setPoints( 3, x,y+h-1, x,y, x+w-1,y );
+ p->setPen( color->light() );
+ p->drawPolyline( a );
+ a.setPoints( 3, x+1,y+h-1, x+w-1,y+h-1, x+w-1,y+1 );
+ p->setPen( color->dark() );
+ p->drawPolyline( a );
+ x++;
+ y++;
+ w -= 2;
+ h -= 2;
+ p->fillRect( x, y, w, h, *color );
+ }
+ else if(widg) {
+ widg->erase(x, y, w, h);
+ } else {
+ p->fillRect(x, y, w, h, p->backgroundColor());
+ }
+}
+
+
+ShowNextPiece::ShowNextPiece( TQWidget *parent, const char *name )
+ : TQFrame( parent, name )
+{
+ setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+ xOffset = -1; // -1 until first resizeEvent.
+}
+
+void ShowNextPiece::resizeEvent( TQResizeEvent *e )
+{
+ TQSize sz = e->size();
+ blockWidth = (sz.width() - 3)/5;
+ blockHeight = (sz.height() - 3)/6;
+ xOffset = (sz.width() - 3)/5;
+ yOffset = (sz.height() - 3)/6;
+}
+
+
+void ShowNextPiece::paintEvent( TQPaintEvent * )
+{
+ TQPainter p( this );
+ drawFrame( &p );
+ p.end(); // explicit end() so any slots can paint too
+ emit update();
+}
+
+
+void ShowNextPiece::drawNextSquare(int x, int y,TQColor *color)
+{
+ if (xOffset == -1) // Before first resizeEvent?
+ return;
+
+ TQPainter paint;
+ paint.begin(this);
+ drawTetrixButton( &paint, xOffset+x*blockWidth, yOffset+y*blockHeight,
+ blockWidth, blockHeight, color, this );
+ paint.end();
+}
+
+
+TQTetrix::TQTetrix( TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ TQTime t = TQTime::currentTime();
+ TetrixPiece::setRandomSeed( (((double)t.hour())+t.minute()+t.second())/
+ (24+60+60) );
+
+#define ADD_LABEL( str, x, y, w, h ) \
+ { TQLabel *label = new TQLabel(str,this); \
+ label->setGeometry(x,y,w,h); \
+ label->setAlignment(AlignCenter|AlignVCenter); }
+
+ ADD_LABEL( "NEXT", 50, 10, 78, 30 );
+ ADD_LABEL( "SCORE", 330, 10, 178, 30 );
+ ADD_LABEL( "LEVEL", 50, 130, 78, 30 );
+ ADD_LABEL( "LINES REMOVED", 330, 130, 178, 30 );
+
+ board = new TQTetrixBoard(this);
+ showNext = new ShowNextPiece(this);
+#ifndef QT_NO_LCDNUMBER
+ showScore = new TQLCDNumber(5,this);
+ showLevel = new TQLCDNumber(2,this);
+ showLines = new TQLCDNumber(5,this);
+#else
+ showScore = new TQLabel("0",this);
+ showLevel = new TQLabel("0",this);
+ showLines = new TQLabel("0",this);
+ showScore->setAlignment(AlignCenter);
+ showLines->setAlignment(AlignCenter);
+ showLevel->setAlignment(AlignCenter);
+ showScore->setFrameStyle(TQFrame::Sunken|TQFrame::Box);
+ showLines->setFrameStyle(TQFrame::Sunken|TQFrame::Box);
+ showLevel->setFrameStyle(TQFrame::Sunken|TQFrame::Box);
+#endif
+ tquitButton = new TQPushButton("&Quit",this);
+ startButton = new TQPushButton("&New Game",this);
+ pauseButton = new TQPushButton("&Pause",this);
+
+ // Don't let the buttons get keyboard focus
+ tquitButton->setFocusPolicy( TQWidget::NoFocus );
+ startButton->setFocusPolicy( TQWidget::NoFocus );
+ pauseButton->setFocusPolicy( TQWidget::NoFocus );
+
+ connect( board, SIGNAL(gameOverSignal()), SLOT(gameOver()) );
+ connect( board, SIGNAL(drawNextSquareSignal(int,int,TQColor*)), showNext,
+ SLOT(drawNextSquare(int,int,TQColor*)) );
+ connect( showNext, SIGNAL(update()), board, SLOT(updateNext()) );
+#ifndef QT_NO_LCDNUMBER
+ connect( board, SIGNAL(updateScoreSignal(int)), showScore,
+ SLOT(display(int)) );
+ connect( board, SIGNAL(updateLevelSignal(int)), showLevel,
+ SLOT(display(int)));
+ connect( board, SIGNAL(updateRemovedSignal(int)), showLines,
+ SLOT(display(int)));
+#else
+ connect( board, SIGNAL(updateScoreSignal(int)), showScore,
+ SLOT(setNum(int)) );
+ connect( board, SIGNAL(updateLevelSignal(int)), showLevel,
+ SLOT(setNum(int)));
+ connect( board, SIGNAL(updateRemovedSignal(int)), showLines,
+ SLOT(setNum(int)));
+#endif
+ connect( startButton, SIGNAL(clicked()), board, SLOT(start()) );
+ connect( tquitButton , SIGNAL(clicked()), SLOT(tquit()));
+ connect( pauseButton, SIGNAL(clicked()), board, SLOT(pause()) );
+
+ board->setGeometry( 150, 20, 153, 333 );
+ showNext->setGeometry( 50, 40, 78, 94 );
+ showScore->setGeometry( 330, 40, 178, 93 );
+ showLevel->setGeometry( 50, 160, 78, 93 );
+ showLines->setGeometry( 330, 160, 178, 93 );
+#ifndef QT_NO_LCDNUMBER
+ showScore->display( 0 );
+ showLevel->display( 0 );
+ showLines->display( 0 );
+#else
+ showScore->setNum( 0 );
+ showLevel->setNum( 0 );
+ showLines->setNum( 0 );
+#endif
+ startButton->setGeometry( 46, 288, 90, 30 );
+ tquitButton->setGeometry( 370, 265, 90, 30 );
+ pauseButton->setGeometry( 370, 310, 90, 30 );
+ board->revealNextPiece(TRUE);
+
+ resize( 550, 370 );
+}
+
+void TQTetrix::gameOver()
+{
+}
+
+
+void TQTetrix::tquit()
+{
+ qApp->tquit();
+}
diff --git a/examples/tetrix/qtetrix.h b/examples/tetrix/qtetrix.h
new file mode 100644
index 000000000..36d8bd041
--- /dev/null
+++ b/examples/tetrix/qtetrix.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TQTETRIX_H
+#define TQTETRIX_H
+
+#include "qtetrixb.h"
+#include <qframe.h>
+#include <qlcdnumber.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qpainter.h>
+
+
+class ShowNextPiece : public TQFrame
+{
+ Q_OBJECT
+ friend class TQTetrix;
+public:
+ ShowNextPiece( TQWidget *parent=0, const char *name=0 );
+public slots:
+ void drawNextSquare( int x, int y,TQColor *color );
+signals:
+ void update();
+private:
+ void paintEvent( TQPaintEvent * );
+ void resizeEvent( TQResizeEvent * );
+
+ int blockWidth,blockHeight;
+ int xOffset,yOffset;
+};
+
+
+class TQTetrix : public TQWidget
+{
+ Q_OBJECT
+public:
+ TQTetrix( TQWidget *parent=0, const char *name=0 );
+ void startGame() { board->startGame(); }
+
+public slots:
+ void gameOver();
+ void tquit();
+private:
+ void keyPressEvent( TQKeyEvent *e ) { board->keyPressEvent(e); }
+
+ TQTetrixBoard *board;
+ ShowNextPiece *showNext;
+#ifndef QT_NO_LCDNUMBER
+ TQLCDNumber *showScore;
+ TQLCDNumber *showLevel;
+ TQLCDNumber *showLines;
+#else
+ TQLabel *showScore;
+ TQLabel *showLevel;
+ TQLabel *showLines;
+#endif
+ TQPushButton *tquitButton;
+ TQPushButton *startButton;
+ TQPushButton *pauseButton;
+};
+
+
+void drawTetrixButton( TQPainter *, int x, int y, int w, int h,
+ const TQColor *color, TQWidget *widg);
+
+
+#endif
diff --git a/examples/tetrix/qtetrixb.cpp b/examples/tetrix/qtetrixb.cpp
new file mode 100644
index 000000000..26fd2c2d0
--- /dev/null
+++ b/examples/tetrix/qtetrixb.cpp
@@ -0,0 +1,241 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qtetrixb.h"
+#include "qtetrix.h"
+#include <qtimer.h>
+#include <qpainter.h>
+
+const int waitAfterLineTime = 500;
+
+TQTetrixBoard::TQTetrixBoard( TQWidget *p, const char *name )
+ : TQFrame( p, name )
+{
+ setFrameStyle( TQFrame::Panel | TQFrame::Sunken );
+ paint = 0;
+ paint_widget = 0;
+ timer = new TQTimer(this);
+ connect( timer, SIGNAL(timeout()), SLOT(timeout()) );
+
+ colors[0].setRgb(200,100,100);
+ colors[1].setRgb(100,200,100);
+ colors[2].setRgb(100,100,200);
+ colors[3].setRgb(200,200,100);
+ colors[4].setRgb(200,100,200);
+ colors[5].setRgb(100,200,200);
+ colors[6].setRgb(218,170, 0);
+
+ xOffset = -1; // -1 until a resizeEvent is received.
+ blockWidth = 20;
+ yOffset = 30;
+ blockHeight = 20;
+ noGame = TRUE;
+ isPaused = FALSE;
+ waitingAfterLine = FALSE;
+ updateTimeoutTime(); // Sets timeoutTime
+}
+
+void TQTetrixBoard::startGame(int gameType,int fillRandomLines)
+{
+ if ( isPaused )
+ return; // ignore if game is paused
+ noGame = FALSE;
+ GenericTetrix::startGame( gameType, fillRandomLines );
+ // Note that the timer is started by updateLevel!
+}
+
+
+void TQTetrixBoard::pause()
+{
+ if ( noGame ) // game not active
+ return;
+ isPaused = !isPaused;
+ if ( isPaused ) {
+ timer->stop();
+ hideBoard();
+ }
+ else
+ timer->start(timeoutTime);
+ update();
+}
+
+
+void TQTetrixBoard::drawSquare(int x,int y,int value)
+{
+ if (xOffset == -1) // Before first resizeEvent?
+ return;
+
+ const int X = xOffset + x*blockWidth;
+ const int Y = yOffset + (y - 1)*blockHeight;
+
+ bool localPainter = paint == 0;
+ TQPainter *p;
+ TQWidget *w;
+ if ( localPainter ) {
+ p = new TQPainter( this );
+ w = this;
+ } else {
+ p = paint;
+ w = paint_widget;
+ }
+ drawTetrixButton( p, X, Y, blockWidth, blockHeight,
+ value == 0 ? 0 : &colors[value-1], w);
+ /*
+ if ( value != 0 ) {
+ TQColor tc, bc;
+ tc = colors[value-1].light();
+ bc = colors[value-1].dark();
+ p->drawShadePanel( X, Y, blockWidth, blockHeight,
+ tc, bc, 1, colors[value-1], TRUE );
+ }
+ else
+ p->fillRect( X, Y, blockWidth, blockHeight, backgroundColor() );
+ */
+ if ( localPainter )
+ delete p;
+}
+
+void TQTetrixBoard::drawNextSquare( int x, int y, int value )
+{
+ if ( value == 0 )
+ emit drawNextSquareSignal (x, y, 0 );
+ else
+ emit drawNextSquareSignal( x, y, &colors[value-1] );
+}
+
+void TQTetrixBoard::updateRemoved( int noOfLines )
+{
+ if ( noOfLines > 0 ) {
+ timer->stop();
+ timer->start( waitAfterLineTime );
+ waitingAfterLine = TRUE;
+ }
+ emit updateRemovedSignal( noOfLines );
+}
+
+void TQTetrixBoard::updateScore( int newScore )
+{
+ emit updateScoreSignal( newScore );
+}
+
+void TQTetrixBoard::updateLevel( int newLevel )
+{
+ timer->stop();
+ updateTimeoutTime();
+ timer->start( timeoutTime );
+ emit updateLevelSignal( newLevel );
+}
+
+void TQTetrixBoard::pieceDropped(int)
+{
+ if ( waitingAfterLine ) // give player a break if a line has been removed
+ return;
+ newPiece();
+}
+
+void TQTetrixBoard::gameOver()
+{
+ timer->stop();
+ noGame = TRUE;
+ emit gameOverSignal();
+}
+
+void TQTetrixBoard::timeout()
+{
+ if ( waitingAfterLine ) {
+ timer->stop();
+ waitingAfterLine = FALSE;
+ newPiece();
+ timer->start( timeoutTime );
+ } else {
+ oneLineDown();
+ }
+}
+
+void TQTetrixBoard::drawContents( TQPainter *p )
+{
+ const char *text = "Press \"Pause\"";
+ TQRect r = contentsRect();
+ paint = p; // set widget painter
+ if ( isPaused ) {
+ p->drawText( r, AlignCenter | AlignVCenter, text );
+ return;
+ }
+ int x1,y1,x2,y2;
+ x1 = (r.left() - xOffset) / blockWidth;
+ if (x1 < 0)
+ x1 = 0;
+ if (x1 >= boardWidth())
+ x1 = boardWidth() - 1;
+
+ x2 = (r.right() - xOffset) / blockWidth;
+ if (x2 < 0)
+ x2 = 0;
+ if (x2 >= boardWidth())
+ x2 = boardWidth() - 1;
+
+ y1 = (r.top() - yOffset) / blockHeight;
+ if (y1 < 0)
+ y1 = 0;
+ if (y1 >= boardHeight())
+ y1 = boardHeight() - 1;
+
+ y2 = (r.bottom() - yOffset) / blockHeight;
+ if (y2 < 0)
+ y2 = 0;
+ if (y2 >= boardHeight())
+ y2 = boardHeight() - 1;
+
+ updateBoard( x1, y1, x2, y2, TRUE );
+ paint = 0; // reset widget painter
+ return;
+}
+
+void TQTetrixBoard::resizeEvent(TQResizeEvent *e)
+{
+ TQSize sz = e->size();
+ blockWidth = (sz.width() - 3)/10;
+ blockHeight = (sz.height() - 3)/22;
+ xOffset = 1;
+ yOffset = 1;
+}
+
+void TQTetrixBoard::keyPressEvent( TQKeyEvent *e )
+{
+ if ( noGame || isPaused || waitingAfterLine )
+ return;
+ switch( e->key() ) {
+ case Key_Left :
+ moveLeft();
+ break;
+ case Key_Right :
+ moveRight();
+ break;
+ case Key_Down :
+ rotateRight();
+ break;
+ case Key_Up :
+ rotateLeft();
+ break;
+ case Key_Space :
+ dropDown();
+ break;
+ case Key_D :
+ oneLineDown();
+ break;
+ default:
+ return;
+ }
+ e->accept();
+}
+
+void TQTetrixBoard::updateTimeoutTime()
+{
+ timeoutTime = 1000/(1 + getLevel());
+}
diff --git a/examples/tetrix/qtetrixb.h b/examples/tetrix/qtetrixb.h
new file mode 100644
index 000000000..236f02e18
--- /dev/null
+++ b/examples/tetrix/qtetrixb.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TQTETRIXB_H
+#define TQTETRIXB_H
+
+#include "gtetrix.h"
+#include <qframe.h>
+
+class TQTimer;
+
+class TQTetrixBoard : public TQFrame, public GenericTetrix
+{
+ Q_OBJECT
+public:
+ TQTetrixBoard( TQWidget *parent=0, const char *name=0 );
+
+ void gameOver();
+ void startGame(int gameType = 0,int fillRandomLines = 0);
+
+public slots:
+ void timeout();
+ void updateNext() { GenericTetrix::updateNext(); }
+ void key(TQKeyEvent *e) { keyPressEvent(e); }
+ void start() { startGame(); }
+ void pause();
+
+signals:
+ void gameOverSignal();
+ void drawNextSquareSignal(int x,int y,TQColor *color1);
+ void updateRemovedSignal(int noOfLines);
+ void updateScoreSignal(int score);
+ void updateLevelSignal(int level);
+
+public: // until we have keyboard focus, should be protected
+ void keyPressEvent( TQKeyEvent * );
+
+private:
+ void drawContents( TQPainter * );
+ void resizeEvent( TQResizeEvent * );
+ void drawSquare(int x,int y,int value);
+ void drawNextSquare(int x,int y,int value);
+ void updateRemoved(int noOfLines);
+ void updateScore(int newScore);
+ void updateLevel(int newLlevel);
+ void pieceDropped(int dropHeight);
+ void updateTimeoutTime();
+
+ TQTimer *timer;
+
+ int xOffset,yOffset;
+ int blockWidth,blockHeight;
+ int timeoutTime;
+ bool noGame;
+ bool isPaused;
+ bool waitingAfterLine;
+
+ TQColor colors[7];
+ TQPainter *paint;
+ TQWidget *paint_widget;
+};
+
+#endif
diff --git a/examples/tetrix/tetrix.cpp b/examples/tetrix/tetrix.cpp
new file mode 100644
index 000000000..e3cf9c29f
--- /dev/null
+++ b/examples/tetrix/tetrix.cpp
@@ -0,0 +1,24 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "qtetrix.h"
+#include "qdragapp.h"
+#include "qfont.h"
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQDragApplication a(argc,argv);
+ TQTetrix *tetrix = new TQTetrix;
+ tetrix->setCaption("Tetrix");
+ a.setMainWidget(tetrix);
+ tetrix->setCaption("TQt Example - Tetrix");
+ tetrix->show();
+ return a.exec();
+}
diff --git a/examples/tetrix/tetrix.doc b/examples/tetrix/tetrix.doc
new file mode 100644
index 000000000..93afca4eb
--- /dev/null
+++ b/examples/tetrix/tetrix.doc
@@ -0,0 +1,15 @@
+/*
+*/
+/*! \page tetrix-example.html
+
+ \ingroup examples
+ \title Tetrix
+
+ This is the Qt implementation of the well known game Tetris.
+
+ <hr>
+
+ Main:
+
+ \include tetrix/tetrix.cpp
+*/
diff --git a/examples/tetrix/tetrix.pro b/examples/tetrix/tetrix.pro
new file mode 100644
index 000000000..ad8ad831a
--- /dev/null
+++ b/examples/tetrix/tetrix.pro
@@ -0,0 +1,19 @@
+TEMPLATE = app
+TARGET = tetrix
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = small-config
+
+HEADERS = gtetrix.h \
+ qdragapp.h \
+ qtetrix.h \
+ qtetrixb.h \
+ tpiece.h
+SOURCES = gtetrix.cpp \
+ qdragapp.cpp \
+ qtetrix.cpp \
+ qtetrixb.cpp \
+ tetrix.cpp \
+ tpiece.cpp
diff --git a/examples/tetrix/tpiece.cpp b/examples/tetrix/tpiece.cpp
new file mode 100644
index 000000000..71e47e9b3
--- /dev/null
+++ b/examples/tetrix/tpiece.cpp
@@ -0,0 +1,180 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "tpiece.h"
+#include "qstring.h"
+#include <stdlib.h>
+
+void TetrixPiece::rotateLeft()
+{
+ if ( pieceType == 5 ) // don't rotate square piece type
+ return;
+ int tmp;
+ for (int i = 0 ; i < 4 ; i++) {
+ tmp = getXCoord(i);
+ setXCoord(i,getYCoord(i));
+ setYCoord(i,-tmp);
+ }
+}
+
+void TetrixPiece::rotateRight()
+{
+ if ( pieceType == 5 ) // don't rotate square piece type
+ return;
+ int tmp;
+ for (int i = 0 ; i < 4 ; i++) {
+ tmp = getXCoord(i);
+ setXCoord(i,-getYCoord(i));
+ setYCoord(i,tmp);
+ }
+}
+
+int TetrixPiece::getMinX()
+{
+ int tmp = coordinates[0][0];
+ for(int i = 1 ; i < 4 ; i++)
+ if (tmp > coordinates[i][0])
+ tmp = coordinates[i][0];
+ return tmp;
+}
+
+int TetrixPiece::getMaxX()
+{
+ int tmp = coordinates[0][0];
+ for(int i = 1 ; i < 4 ; i++)
+ if (tmp < coordinates[i][0])
+ tmp = coordinates[i][0];
+ return tmp;
+
+}
+
+int TetrixPiece::getMinY()
+{
+ int tmp = coordinates[0][1];
+ for(int i = 1 ; i < 4 ; i++)
+ if (tmp > coordinates[i][1])
+ tmp = coordinates[i][1];
+ return tmp;
+}
+
+int TetrixPiece::getMaxY()
+{
+ int tmp = coordinates[0][1];
+ for(int i = 1 ; i < 4 ; i++)
+ if (tmp < coordinates[i][1])
+ tmp = coordinates[i][1];
+ return tmp;
+}
+
+void TetrixPiece::initialize(int type)
+{
+ static int pieceTypes[7][4][2] = {{{ 0,-1},
+ { 0, 0},
+ {-1, 0},
+ {-1, 1}},
+
+ {{ 0,-1},
+ { 0, 0},
+ { 1, 0},
+ { 1, 1}},
+
+ {{ 0,-1},
+ { 0, 0},
+ { 0, 1},
+ { 0, 2}},
+
+ {{-1, 0},
+ { 0, 0},
+ { 1, 0},
+ { 0, 1}},
+
+ {{ 0, 0},
+ { 1, 0},
+ { 0, 1},
+ { 1, 1}},
+
+ {{-1,-1},
+ { 0,-1},
+ { 0, 0},
+ { 0, 1}},
+
+ {{ 1,-1},
+ { 0,-1},
+ { 0, 0},
+ { 0, 1}}};
+ if (type < 1 || type > 7)
+ type = 1;
+ pieceType = type;
+ for(int i = 0 ; i < 4 ; i++) {
+ coordinates[i][0] = pieceTypes[type - 1][i][0];
+ coordinates[i][1] = pieceTypes[type - 1][i][1];
+ }
+}
+
+
+/*
+ * Sigh, oh beautiful nostalgia! This random algorithm has
+ * been taken from the book "Adventures with your pocket calculator"
+ * and I used it in my first implemented and machine-
+ * run program of any size to speak of. Imagine how hungry I
+ * was after having programmed BASIC on paper for
+ * half a year?!!?!?!?!?!? The first program I typed in was a
+ * slot machine game and was made in BASIC on a SHARP
+ * PC-1211 with 1,47 KB RAM (one point four seven kilobytes) and
+ * a one-line LCD-display (I think it had 32 characters) in the
+ * year of our lord 1981. The man I had bought the machine from worked
+ * as a COBOL programmer and was amazed and impressed
+ * when I demonstrated the program 2 days after I had
+ * bought the machine, quote: "Gees, I have been looking so long
+ * for a "random" command in that BASIC, what is it called?"
+ * Oh, how I still get a thrill out of the thought of the
+ * explanation I then gave him...
+ */
+
+/*
+ * Sukk, aa vakre nostalgi! Denne random algoritmen er
+ * tatt fra boka "Adventures with your pocket calculator"
+ * og den brukte jeg i mitt foerste implementerte og maskin-
+ * kjoerte program av nevneverdig stoerrelse. Tror du jeg var
+ * noe sulten etter aa ha programmert BASIC paa papir i et
+ * halvt aar?!!?!?!?!?!? Programmet jeg tasta inn foerst var et
+ * "enarmet banditt" spill og ble laget i BASIC paa en SHARP
+ * PC-1211 med 1,47 KB RAM (en komma foertisju kilobyte) og
+ * et en-linjers LCD-display (tror det hadde 32 karakterer) i det
+ * herrens aar 1981. Mannen jeg kjoepte maskinen av jobbet til
+ * daglig med COBOL programmering og var forbloeffet og imponert
+ * da jeg demonstrerte programmet 2 dager etter at jeg hadde
+ * kjoept maskinen, sitat: "Joess, jeg som har leita saa lenge
+ * etter en random kommando i den BASICen, hva var det den
+ * het?" Aa, jeg frydes ennaa ved tanken paa forklaringen jeg
+ * deretter ga ham...
+ */
+
+double TetrixPiece::randomSeed = 0.33333;
+
+void TetrixPiece::setRandomSeed(double seed)
+{
+ TQCString buffer;
+ if (seed < 0)
+ seed = - seed;
+ if (seed >= 1)
+ seed = seed - (double) ((int) seed);
+ buffer.sprintf("%1.5f",(float) seed);
+ for (int i = 0 ; i < 5 ; i++)
+ if ((buffer[i + 2] - '0') % 2 == 0)
+ buffer[i + 2]++;
+ randomSeed = atof(buffer);
+}
+
+int TetrixPiece::randomValue(int maxPlusOne)
+{
+ randomSeed = randomSeed*147;
+ randomSeed = randomSeed - (double) ((int) randomSeed);
+ return (int) (randomSeed*maxPlusOne);
+}
diff --git a/examples/tetrix/tpiece.h b/examples/tetrix/tpiece.h
new file mode 100644
index 000000000..11a0ffb49
--- /dev/null
+++ b/examples/tetrix/tpiece.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TPIECE_H
+#define TPIECE_H
+
+class TetrixPiece
+{
+public:
+ TetrixPiece() {setRandomType();}
+ TetrixPiece(int type) {initialize(type % 7 + 1);}
+
+ void setRandomType() {initialize(randomValue(7) + 1);}
+
+ void rotateLeft();
+ void rotateRight();
+
+ int getType() {return pieceType;}
+ int getXCoord(int index) {return coordinates[index][0];}
+ int getYCoord(int index) {return coordinates[index][1];}
+ void getCoord(int index,int &x,int&y){x = coordinates[index][0];
+ y = coordinates[index][1];}
+ int getMinX();
+ int getMaxX();
+ int getMinY();
+ int getMaxY();
+
+ static void setRandomSeed(double seed);
+ static int randomValue(int maxPlusOne);
+
+private:
+ void setXCoord(int index,int value) {coordinates[index][0] = value;}
+ void setYCoord(int index,int value) {coordinates[index][1] = value;}
+ void setCoords(int index,int x,int y){coordinates[index][0] = x;
+ coordinates[index][1] = y;}
+ void initialize(int type);
+
+ int pieceType;
+ int coordinates[4][2];
+
+ static double randomSeed;
+};
+
+#endif
diff --git a/examples/textedit/editcopy.xpm b/examples/textedit/editcopy.xpm
new file mode 100644
index 000000000..cc6fb7a68
--- /dev/null
+++ b/examples/textedit/editcopy.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray100",
+". c #8b8bfd",
+"X c #3c3cfd",
+"o c #000082",
+"O c Gray0",
+"+ c None",
+"@ c Gray0",
+"# c Gray0",
+/* pixels */
+"++++++++++++++++++++++",
+"++++++++++++++++++++++",
+"OOOOOOOO++++++++++++++",
+"O OO+++++++++++++",
+"O OOOO O O++++++++++++",
+"O O O+++++++++++",
+"O OOOO Ooooooooo++++++",
+"O Oo oo+++++",
+"O OOOOO o OOOO oXo++++",
+"O o o.Xo+++",
+"O OOOOO o OOOO o .Xo++",
+"O o oooooo+",
+"O OOOOO o OOOO o+",
+"O o o+",
+"O OOOOO o OOOOOOOOO o+",
+"O o o+",
+"OOOOOOOOo OOOOOOOOO o+",
+"++++++++o o+",
+"++++++++o OOOOOOOOO o+",
+"++++++++o o+",
+"++++++++ooooooooooooo+",
+"++++++++++++++++++++++"
+};
diff --git a/examples/textedit/editcut.xpm b/examples/textedit/editcut.xpm
new file mode 100644
index 000000000..2391adda5
--- /dev/null
+++ b/examples/textedit/editcut.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 4 1",
+" c Gray100",
+". c #000082",
+"X c Gray0",
+"o c None",
+/* pixels */
+"oooooooooooooooooooooo",
+"oooooooXoooooXoooooooo",
+"oooooooXoooooXoooooooo",
+"oooooooXoooooXoooooooo",
+"oooooooXooooXXoooooooo",
+"oooooooXXoooXooooooooo",
+"ooooooooXoooXooooooooo",
+"ooooooooXXoXXooooooooo",
+"oooooooooXXXoooooooooo",
+"oooooooooXXXoooooooooo",
+"ooooooooooXooooooooooo",
+"ooooooooo.X.oooooooooo",
+"oooooooo..o...oooooooo",
+"ooooooo.o.o.oo.ooooooo",
+"oooooo.oo.o.ooo.oooooo",
+"ooooo.ooo.o.oooo.ooooo",
+"oooo.oooo.o.oooo.ooooo",
+"oooo.oooo.oo.ooo.ooooo",
+"oooo.oooo.oo.oo.oooooo",
+"oooo.ooo.oooo..ooooooo",
+"ooooo...oooooooooooooo",
+"oooooooooooooooooooooo"
+};
diff --git a/examples/textedit/editpaste.xpm b/examples/textedit/editpaste.xpm
new file mode 100644
index 000000000..3f775920f
--- /dev/null
+++ b/examples/textedit/editpaste.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray100",
+". c Yellow",
+"X c #c6c3c6",
+"o c #848284",
+"O c #848200",
+"+ c #000084",
+"@ c Gray0",
+"# c None",
+/* pixels */
+"######################",
+"#######@@@@@##########",
+"##@@@@@@...@@@@@@#####",
+"#@@@@@@.....@@@@@@####",
+"@@oOo@@.@@@.@@oOo@@###",
+"@oOo@XXXXXXXXX@oOo@###",
+"@OoO@XXXXXXXXX@OoO@###",
+"@oOo@@@@@@@@@@@oOo@###",
+"@OoOoOoOoOoOoOoOoO@###",
+"@oOoOoOoOoOoOoOoOo@###",
+"@OoOoOoO++++++++++@###",
+"@oOoOoOo+ + +###",
+"@OoOoOoO+ +++++ + +##",
+"@oOoOoOo+ + +#",
+"@OoOoOoO+ +++++ + +",
+"@oOoOoOo+ ++++++",
+"@OoOoOoO+ +++++ +",
+"@oOoOoOo+ +",
+"@OoOoOoO+ ++++++++++ +",
+"#@@@@@@@+ +",
+"########++++++++++++++",
+"######################"
+};
diff --git a/examples/textedit/editredo.xpm b/examples/textedit/editredo.xpm
new file mode 100644
index 000000000..46dc03319
--- /dev/null
+++ b/examples/textedit/editredo.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray100",
+". c #848284",
+"X c #000084",
+"o c Gray0",
+"O c None",
+"+ c Gray0",
+"@ c Gray0",
+"# c Gray0",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOO.XXXXXXOOOOOOOOOOO",
+"OOOXXXXXXXXXXOOOOOOXOO",
+"OO.XXOOOOOOXXXXOOOXXOO",
+"OOXXOOOOOOOOOXXXOXXXOO",
+"OOXXOOOOOOOOOOXXXXXXOO",
+"OOXXOOOOOOOOOOOXXXXXOO",
+"OOXXOOOOOOOOOOXXXXXXOO",
+"OOXXOOOOOOOOOXXXXXXXOO",
+"OO.XXOOOOOOOXXXXXXXXOO",
+"OOOXXX.OOOOOOOOOOOOOOO",
+"OOOOXXXOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/examples/textedit/editundo.xpm b/examples/textedit/editundo.xpm
new file mode 100644
index 000000000..229c1636e
--- /dev/null
+++ b/examples/textedit/editundo.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray100",
+". c #848284",
+"X c #000084",
+"o c Gray0",
+"O c None",
+"+ c Gray0",
+"@ c Gray0",
+"# c Gray0",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOXXXXXX.OOOO",
+"OOXOOOOOOXXXXXXXXXXOOO",
+"OOXXOOOXXXXOOOOOOXX.OO",
+"OOXXXOXXXOOOOOOOOOXXOO",
+"OOXXXXXXOOOOOOOOOOXXOO",
+"OOXXXXXOOOOOOOOOOOXXOO",
+"OOXXXXXXOOOOOOOOOOXXOO",
+"OOXXXXXXXOOOOOOOOOXXOO",
+"OOXXXXXXXXOOOOOOOXX.OO",
+"OOOOOOOOOOOOOOO.XXXOOO",
+"OOOOOOOOOOOOOOOXXXOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/examples/textedit/example.html b/examples/textedit/example.html
new file mode 100644
index 000000000..39b60ff76
--- /dev/null
+++ b/examples/textedit/example.html
@@ -0,0 +1,24 @@
+<html><head><meta name="qrichtext" content="1" /></head><body style="font-size:12pt;font-family:helvetica">
+<p align="center"><span style="font-size:24pt;font-weight:600">TQTextEdit</span></p>
+<p align="justify">TQTextEdit is an advanced WYSIWYG editor supporting richtext formatting. It is optimized to handle large documents and to respond tquickly to user input.</p>
+<p align="justify">TQTextEdit supports font styles such as <span style="font-weight:600">bold</span>, <span style="font-style:italic">italic, </span><span style="text-decoration:underline">underlined</span> as well as various <span style="font-weight:600;color:#00007f">c</span><span style="font-weight:600;color:#aa0000">o</span><span style="font-weight:600;color:#005500">l</span><span style="font-weight:600;color:#aa5500">o</span><span style="font-weight:600;color:#00aa00">r</span><span style="font-weight:600;color:#ff0000">s </span>and <span style="font-size:16pt">s</span><span style="font-size:18pt">i</span><span style="font-size:20pt">z</span><span style="font-size:22pt">e</span><span style="font-size:28pt">s</span>. You can select different font families, for example <span style="font-family:Times;font-weight:600">Times New Roman</span> or <span style="font-family:Courier;font-weight:600">Courier</span>. Futhermore the widget supports different paragraph alignments such as justified,</p>
+<p>left aligned,</p>
+<p align="center">centered,</p>
+<p align="right">and right aligned.</p>
+<p align="justify"></p>
+<!-- Not public API
+<p>In addition to the mentioned character styles, the editor supports both bullet lists</p>
+<ul type="disc"><li>Disc</li>
+<ul type="circle"><li>Circle</li>
+<ul type="square"><li>Square</li></ul></ul></ul>
+<p>and ordered lists</p>
+<ol><li>One</li>
+<li>Two</li>
+<ol type="a"><li>Two.a</li>
+<li>Two.b</li>
+<ol type="A"><li>Two.b.A</li>
+<li>Two.b.B</li></ol>
+<li>Two.c</li></ol>
+<li>Three.</li></ol>
+-->
+</body></html>
diff --git a/examples/textedit/filenew.xpm b/examples/textedit/filenew.xpm
new file mode 100644
index 000000000..884d7cbb1
--- /dev/null
+++ b/examples/textedit/filenew.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray100",
+". c Gray76",
+"X c Gray53",
+"o c Gray36",
+"O c Gray18",
+"+ c Gray0",
+"@ c None",
+"# c Gray0",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@++++++++++@@@@@@@@",
+"@@@@+ +O+@@@@@@@",
+"@@@@+ +oO+@@@@@@",
+"@@@@+ +XoO+@@@@@",
+"@@@@+ +.XoO+@@@@",
+"@@@@+ + .XoO+@@@",
+"@@@@+ +++++++@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@+++++++++++++++@@@",
+"@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/examples/textedit/fileopen.xpm b/examples/textedit/fileopen.xpm
new file mode 100644
index 000000000..82effcf7b
--- /dev/null
+++ b/examples/textedit/fileopen.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray100",
+". c Yellow",
+"X c #848200",
+"o c Gray0",
+"O c None",
+"+ c Gray0",
+"@ c Gray0",
+"# c Gray0",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOooooOOOOoO",
+"OOOOOOOOOOOoOOOOooOooO",
+"OOOOOOOOOOOOOOOOOOoooO",
+"OOOOOOOOOOOOOOOOOooooO",
+"OooooOOOOOOOOOOOoooooO",
+"o. . ooooooooooOOOOOOO",
+"o . . . . . . oOOOOOOO",
+"o. . . . . . .oOOOOOOO",
+"o . . . . . . oOOOOOOO",
+"o. . . ooooooooooooooo",
+"o . . ooXXXXXXXXXXXXoo",
+"o. . ooXXXXXXXXXXXXooO",
+"o . ooXXXXXXXXXXXXooOO",
+"o. ooXXXXXXXXXXXXooOOO",
+"o ooXXXXXXXXXXXXooOOOO",
+"oooXXXXXXXXXXXXooOOOOO",
+"ooXXXXXXXXXXXXooOOOOOO",
+"oooooooooooooooOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/examples/textedit/fileprint.xpm b/examples/textedit/fileprint.xpm
new file mode 100644
index 000000000..8701d4609
--- /dev/null
+++ b/examples/textedit/fileprint.xpm
@@ -0,0 +1,117 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 89 1",
+" c Gray0",
+". c #101008081010",
+"X c #101010101010",
+"o c #101010101818",
+"O c #181810101818",
+"+ c #181818181818",
+"@ c #181818182121",
+"# c #212118182121",
+"$ c Gray13",
+"% c #212121212929",
+"& c #292921212929",
+"* c Gray16",
+"= c #292929293131",
+"- c #313129293131",
+"; c #313131313131",
+": c #313131313939",
+"> c #393931313939",
+", c #393939393939",
+"< c #393939394242",
+"1 c #424239394242",
+"2 c Gray26",
+"3 c #4a4a4a4a5252",
+"4 c #5a5a52525a5a",
+"5 c #5a5a5a5a6363",
+"6 c #6b6b63636b6b",
+"7 c Gray42",
+"8 c #6b6b6b6b7373",
+"9 c #73736b6b7373",
+"0 c #7b7b73737b7b",
+"q c #7b7b73738484",
+"w c #0808ffff0808",
+"e c #2929ffff2929",
+"r c #3131ffff3131",
+"t c #5a5acece5a5a",
+"y c #6b6bffff6363",
+"u c #7b7bffff7b7b",
+"i c #84847b7b8484",
+"p c #84847b7b8c8c",
+"a c #8c8c7b7b9494",
+"s c #848484848c8c",
+"d c #8c8c84848c8c",
+"f c Gray55",
+"g c #8c8c84849494",
+"h c #8c8c8c8c9494",
+"j c #94948c8c9494",
+"k c #94948c8c9c9c",
+"l c Gray58",
+"z c #949494949c9c",
+"x c #9c9c94949c9c",
+"c c Gray61",
+"v c #9c9c9494a5a5",
+"b c #9c9c9c9ca5a5",
+"n c #a5a59c9ca5a5",
+"m c #a5a59c9cadad",
+"M c #adad9c9cadad",
+"N c #a5a5a5a5a5a5",
+"B c #a5a5a5a5adad",
+"V c #adada5a5adad",
+"C c Gray68",
+"Z c #adadadadb5b5",
+"A c #b5b5adadb5b5",
+"S c Gray71",
+"D c Gray74",
+"F c #9494c6c69494",
+"G c #9c9ccecea5a5",
+"H c #bdbdd6d6bdbd",
+"J c #c0c0c0c0c0c0",
+"K c #c6c6c6c6c6c6",
+"L c #cecec6c6cece",
+"P c #cececececece",
+"I c #cecececed6d6",
+"U c #d6d6ceced6d6",
+"Y c #d6d6cecedede",
+"T c Gray84",
+"R c #d6d6d6d6dede",
+"E c #deded6d6dede",
+"W c Gray87",
+"Q c #deded6d6e7e7",
+"! c #dedededee7e7",
+"~ c #d6d6ffffd6d6",
+"^ c #e7e7dedee7e7",
+"/ c #e7e7e7e7e7e7",
+"( c #e7e7e7e7efef",
+") c #efefe7e7efef",
+"_ c #efefefefefef",
+"` c #e7e7ffffe7e7",
+"' c Gray97",
+"] c Gray100",
+"[ c None",
+/* pixels */
+"[[[[[[SDPPPPKKDDCD[[[[",
+"[[[[[[D_/////___WD[[[[",
+"[[[[[[DKKKPPKKKKDK[[[[",
+"[[[[[[SDDDDSDDSSCD[[[[",
+"[[[[[KCKDKKKDDDKS[[[[[",
+"[[[[[DDSDDDDDDKKS[[[[[",
+"[[[[[DSKDDDDDKDKC[[[[[",
+"[[[[[KDDDDDDDDDDS[[[[[",
+"[[[[[CP/WWWWWWTWNNZ[[[",
+"[[[Dc9STPTPTPTWWj427S[",
+"[[Dziq0000000pag8<%@2N",
+"[DcE(!ERRRRUYGtFn2##O<",
+"Db)]]]]]]]]]~ewePa;@X#",
+"V']]]]]]]]]]`yru]Q0@ #",
+"BRILITRRW^!E!RHUILhO @",
+"jAZVBmBnmmNmnmMvzh6o #",
+"jZZmBnnnbnbbbbvxxg6o +",
+"lmmnbnbbbvcvxxxvjs6O 3",
+"jBnnvcvxvcvxvxzjhd8o+C",
+"lsdgfgdhgdhhjhjkhg6+l[",
+"S9%@$%&&&=--::>>:-:l[[",
+"[[C511,:;;;**%++.2c[[["
+};
diff --git a/examples/textedit/filesave.xpm b/examples/textedit/filesave.xpm
new file mode 100644
index 000000000..71cbd331a
--- /dev/null
+++ b/examples/textedit/filesave.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray100",
+". c #cab5d1",
+"X c #c1c1c1",
+"o c #848200",
+"O c Gray0",
+"+ c None",
+"@ c Gray0",
+"# c Gray0",
+/* pixels */
+"++++++++++++++++++++++",
+"+OOOOOOOOOOOOOOOOOOOO+",
+"+OooOXXXXXXXXXXXXOXXO+",
+"+OooOXXXXXXXXXXXXOXXO+",
+"+OooOXXXXXXXXX.XXOOOO+",
+"+OooOXXX..XXXXXXXOooO+",
+"+OooOXXX..XXXXXXXOooO+",
+"+OooOXXXXXXXXXXXXOooO+",
+"+OooOXXXXXXXXXXXXOooO+",
+"+OooOXXXXXXXXXXXXOooO+",
+"+OooOXXXXXXXXXXXXOooO+",
+"+OoooOOOOOOOOOOOOoooO+",
+"+OooooooooooooooooooO+",
+"+OooooooooooooooooooO+",
+"+OoooOOOOOOOOOOOOOooO+",
+"+OoooOOOOOOOOOXXXOooO+",
+"+OoooOOOOOOOOOXXXOooO+",
+"+OoooOOOOOOOOOXXXOooO+",
+"+OoooOOOOOOOOOXXXOooO+",
+"+OoooOOOOOOOOOXXXOooO+",
+"++OOOOOOOOOOOOOOOOOO++",
+"++++++++++++++++++++++"
+};
diff --git a/examples/textedit/main.cpp b/examples/textedit/main.cpp
new file mode 100644
index 000000000..db2ad21a4
--- /dev/null
+++ b/examples/textedit/main.cpp
@@ -0,0 +1,22 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "textedit.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ TextEdit * mw = new TextEdit();
+ mw->setCaption( "Richtext Editor" );
+ mw->resize( 640, 800 );
+ mw->show();
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( tquit() ) );
+ return a.exec();
+}
diff --git a/examples/textedit/textbold.xpm b/examples/textedit/textbold.xpm
new file mode 100644
index 000000000..8398e2eca
--- /dev/null
+++ b/examples/textedit/textbold.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * bold_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ......... ",
+" ... ... ",
+" ... ... ",
+" ... ... ",
+" ... ... ",
+" ... ... ",
+" ........ ",
+" ... .... ",
+" ... .... ",
+" ... ... ",
+" ... ... ",
+" ... ... ",
+" ... ... ",
+" .......... ",
+" ",
+" ",
+" ",
+" "};
diff --git a/examples/textedit/textcenter.xpm b/examples/textedit/textcenter.xpm
new file mode 100644
index 000000000..837152f67
--- /dev/null
+++ b/examples/textedit/textcenter.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * center_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ",
+" "};
diff --git a/examples/textedit/textedit.cpp b/examples/textedit/textedit.cpp
new file mode 100644
index 000000000..a64c9d94c
--- /dev/null
+++ b/examples/textedit/textedit.cpp
@@ -0,0 +1,455 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. 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( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name )
+{
+ setupFileActions();
+ setupEditActions();
+ setupTextActions();
+
+ tabWidget = new TQTabWidget( this );
+ connect( tabWidget, SIGNAL( currentChanged( TQWidget * ) ),
+ this, SLOT( editorChanged( TQWidget * ) ) );
+ setCentralWidget( tabWidget );
+
+ if ( qApp->argc() == 1 ) {
+ load( "example.html" );
+ } else {
+ for ( int i = 1; i < qApp->argc(); ++i )
+ load( qApp->argv()[ i ] );
+ }
+}
+
+void TextEdit::setupFileActions()
+{
+ TQToolBar *tb = new TQToolBar( this );
+ tb->setLabel( "File Actions" );
+ TQPopupMenu *menu = new TQPopupMenu( this );
+ menuBar()->insertItem( tr( "&File" ), menu );
+
+ TQAction *a;
+ a = new TQAction( TQPixmap::fromMimeSource( "filenew.xpm" ), tr( "&New..." ), CTRL + Key_N, this, "fileNew" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new TQAction( TQPixmap::fromMimeSource( "fileopen.xpm" ), tr( "&Open..." ), CTRL + Key_O, this, "fileOpen" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileOpen() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ menu->insertSeparator();
+ a = new TQAction( TQPixmap::fromMimeSource( "filesave.xpm" ), tr( "&Save..." ), CTRL + Key_S, this, "fileSave" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new TQAction( tr( "Save &As..." ), 0, this, "fileSaveAs" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) );
+ a->addTo( menu );
+ menu->insertSeparator();
+ a = new TQAction( TQPixmap::fromMimeSource( "fileprint.xpm" ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" );
+ connect( a, SIGNAL( activated() ), this, SLOT( filePrint() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new TQAction( tr( "&Close" ), 0, this, "fileClose" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) );
+ a->addTo( menu );
+ a = new TQAction( tr( "E&xit" ), 0, this, "fileExit" );
+ connect( a, SIGNAL( activated() ), this, SLOT( fileExit() ) );
+ a->addTo( menu );
+}
+
+void TextEdit::setupEditActions()
+{
+ TQToolBar *tb = new TQToolBar( this );
+ tb->setLabel( "Edit Actions" );
+ TQPopupMenu *menu = new TQPopupMenu( this );
+ menuBar()->insertItem( tr( "&Edit" ), menu );
+
+ TQAction *a;
+ a = new TQAction( TQPixmap::fromMimeSource( "editundo.xpm" ), tr( "&Undo" ), CTRL + Key_Z, this, "editUndo" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editUndo() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new TQAction( TQPixmap::fromMimeSource( "editredo.xpm" ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editRedo() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ menu->insertSeparator();
+ a = new TQAction( TQPixmap::fromMimeSource( "editcopy.xpm" ), tr( "&Copy" ), CTRL + Key_C, this, "editCopy" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new TQAction( TQPixmap::fromMimeSource( "editcut.xpm" ), tr( "Cu&t" ), CTRL + Key_X, this, "editCut" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+ a = new TQAction( TQPixmap::fromMimeSource( "editpaste.xpm" ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" );
+ connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) );
+ a->addTo( tb );
+ a->addTo( menu );
+}
+
+void TextEdit::setupTextActions()
+{
+ TQToolBar *tb = new TQToolBar( this );
+ tb->setLabel( "Format Actions" );
+ TQPopupMenu *menu = new TQPopupMenu( this );
+ menuBar()->insertItem( tr( "F&ormat" ), menu );
+
+ comboFont = new TQComboBox( TRUE, tb );
+ TQFontDatabase db;
+ comboFont->insertStringList( db.families() );
+ connect( comboFont, SIGNAL( activated( const TQString & ) ),
+ this, SLOT( textFamily( const TQString & ) ) );
+ comboFont->lineEdit()->setText( TQApplication::font().family() );
+
+ comboSize = new TQComboBox( TRUE, tb );
+ TQValueList<int> sizes = db.standardSizes();
+ TQValueList<int>::Iterator it = sizes.begin();
+ for ( ; it != sizes.end(); ++it )
+ comboSize->insertItem( TQString::number( *it ) );
+ connect( comboSize, SIGNAL( activated( const TQString & ) ),
+ this, SLOT( textSize( const TQString & ) ) );
+ comboSize->lineEdit()->setText( TQString::number( TQApplication::font().pointSize() ) );
+
+ actionTextBold = new TQAction( TQPixmap::fromMimeSource( "textbold.xpm" ), 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 TQAction( TQPixmap::fromMimeSource( "textitalic.xpm" ), 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 TQAction( TQPixmap::fromMimeSource( "textunder.xpm" ), 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();
+
+ TQActionGroup *grp = new TQActionGroup( this );
+ connect( grp, SIGNAL( selected( TQAction* ) ), this, SLOT( textAlign( TQAction* ) ) );
+
+ actionAlignLeft = new TQAction( TQPixmap::fromMimeSource( "textleft.xpm" ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" );
+ actionAlignLeft->setToggleAction( TRUE );
+ actionAlignCenter = new TQAction( TQPixmap::fromMimeSource( "textcenter.xpm" ), tr( "C&enter" ), CTRL + Key_E, grp, "textCenter" );
+ actionAlignCenter->setToggleAction( TRUE );
+ actionAlignRight = new TQAction( TQPixmap::fromMimeSource( "textright.xpm" ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" );
+ actionAlignRight->setToggleAction( TRUE );
+ actionAlignJustify = new TQAction( TQPixmap::fromMimeSource( "textjustify.xpm" ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" );
+ actionAlignJustify->setToggleAction( TRUE );
+
+ grp->addTo( tb );
+ grp->addTo( menu );
+
+ menu->insertSeparator();
+
+ TQPixmap pix( 16, 16 );
+ pix.fill( black );
+ actionTextColor = new TQAction( pix, tr( "&Color..." ), 0, this, "textColor" );
+ connect( actionTextColor, SIGNAL( activated() ), this, SLOT( textColor() ) );
+ actionTextColor->addTo( tb );
+ actionTextColor->addTo( menu );
+}
+
+void TextEdit::load( const TQString &f )
+{
+ if ( !TQFile::exists( f ) )
+ return;
+ TQTextEdit *edit = new TQTextEdit( tabWidget );
+ edit->setTextFormat( RichText );
+ doConnections( edit );
+ tabWidget->addTab( edit, TQFileInfo( f ).fileName() );
+ TQFile file( f );
+ if ( !file.open( IO_ReadOnly ) )
+ return;
+ TQTextStream ts( &file );
+ TQString txt = ts.read();
+ if ( !TQStyleSheet::mightBeRichText( txt ) )
+ txt = TQStyleSheet::convertFromPlainText( txt, TQStyleSheetItem::WhiteSpacePre );
+ edit->setText( txt );
+ tabWidget->showPage( edit );
+ edit->viewport()->setFocus();
+ filenames.replace( edit, f );
+}
+
+TQTextEdit *TextEdit::currentEditor() const
+{
+ if ( tabWidget->currentPage() &&
+ tabWidget->currentPage()->inherits( "TQTextEdit" ) )
+ return (TQTextEdit*)tabWidget->currentPage();
+ return 0;
+}
+
+void TextEdit::doConnections( TQTextEdit *e )
+{
+ connect( e, SIGNAL( currentFontChanged( const TQFont & ) ),
+ this, SLOT( fontChanged( const TQFont & ) ) );
+ connect( e, SIGNAL( currentColorChanged( const TQColor & ) ),
+ this, SLOT( colorChanged( const TQColor & ) ) );
+ connect( e, SIGNAL( currentAlignmentChanged( int ) ),
+ this, SLOT( alignmentChanged( int ) ) );
+}
+
+void TextEdit::fileNew()
+{
+ TQTextEdit *edit = new TQTextEdit( tabWidget );
+ edit->setTextFormat( RichText );
+ doConnections( edit );
+ tabWidget->addTab( edit, tr( "noname" ) );
+ tabWidget->showPage( edit );
+ edit->viewport()->setFocus();
+}
+
+void TextEdit::fileOpen()
+{
+ TQString fn = TQFileDialog::getOpenFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+ if ( !fn.isEmpty() )
+ load( fn );
+}
+
+void TextEdit::fileSave()
+{
+ if ( !currentEditor() )
+ return;
+ TQString fn;
+ if ( filenames.find( currentEditor() ) == filenames.end() ) {
+ fileSaveAs();
+ } else {
+ TQFile file( *filenames.find( currentEditor() ) );
+ if ( !file.open( IO_WriteOnly ) )
+ return;
+ TQTextStream ts( &file );
+ ts << currentEditor()->text();
+ }
+}
+
+void TextEdit::fileSaveAs()
+{
+ if ( !currentEditor() )
+ return;
+ TQString fn = TQFileDialog::getSaveFileName( TQString::null, tr( "HTML-Files (*.htm *.html);;All Files (*)" ), this );
+ if ( !fn.isEmpty() ) {
+ filenames.replace( currentEditor(), fn );
+ fileSave();
+ tabWidget->setTabLabel( currentEditor(), TQFileInfo( fn ).fileName() );
+ }
+}
+
+void TextEdit::filePrint()
+{
+ if ( !currentEditor() )
+ return;
+#ifndef QT_NO_PRINTER
+ TQPrinter printer( TQPrinter::HighResolution );
+ printer.setFullPage(TRUE);
+ if ( printer.setup( this ) ) {
+ TQPainter p( &printer );
+ // Check that there is a valid device to print to.
+ if ( !p.device() ) return;
+ TQPaintDeviceMetrics metrics( p.device() );
+ int dpiy = metrics.logicalDpiY();
+ int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins
+ TQRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );
+ TQFont font( currentEditor()->TQWidget::font() );
+ font.setPointSize( 10 ); // we define 10pt to be a nice base size for printing
+
+ TQSimpleRichText richText( currentEditor()->text(), font,
+ currentEditor()->context(),
+ currentEditor()->styleSheet(),
+ currentEditor()->mimeSourceFactory(),
+ view.height() );
+ richText.setWidth( &p, view.width() );
+ int page = 1;
+ do {
+ richText.draw( &p, margin, margin, view, colorGroup() );
+ view.moveBy( 0, view.height() );
+ p.translate( 0 , -view.height() );
+ p.setFont( font );
+ p.drawText( view.right() - p.fontMetrics().width( TQString::number( page ) ),
+ view.bottom() + p.fontMetrics().ascent() + 5, TQString::number( page ) );
+ if ( view.top() - margin >= richText.height() )
+ break;
+ printer.newPage();
+ page++;
+ } while (TRUE);
+ }
+#endif
+}
+
+void TextEdit::fileClose()
+{
+ delete currentEditor();
+ if ( currentEditor() )
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::fileExit()
+{
+ qApp->tquit();
+}
+
+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 TQString &f )
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setFamily( f );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textSize( const TQString &p )
+{
+ if ( !currentEditor() )
+ return;
+ currentEditor()->setPointSize( p.toInt() );
+ currentEditor()->viewport()->setFocus();
+}
+
+void TextEdit::textColor()
+{
+ if ( !currentEditor() )
+ return;
+ TQColor col = TQColorDialog::getColor( currentEditor()->color(), this );
+ if ( !col.isValid() )
+ return;
+ currentEditor()->setColor( col );
+ TQPixmap pix( 16, 16 );
+ pix.fill( black );
+ actionTextColor->setIconSet( pix );
+}
+
+void TextEdit::textAlign( TQAction *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 TQFont &f )
+{
+ comboFont->lineEdit()->setText( f.family() );
+ comboSize->lineEdit()->setText( TQString::number( f.pointSize() ) );
+ actionTextBold->setOn( f.bold() );
+ actionTextItalic->setOn( f.italic() );
+ actionTextUnderline->setOn( f.underline() );
+}
+
+void TextEdit::colorChanged( const TQColor &c )
+{
+ TQPixmap 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( TQWidget * )
+{
+ if ( !currentEditor() )
+ return;
+ fontChanged( currentEditor()->currentFont() );
+ colorChanged( currentEditor()->color() );
+ alignmentChanged( currentEditor()->alignment() );
+}
diff --git a/examples/textedit/textedit.doc b/examples/textedit/textedit.doc
new file mode 100644
index 000000000..53279b93e
--- /dev/null
+++ b/examples/textedit/textedit.doc
@@ -0,0 +1,18 @@
+/*! \page textedit-example.html
+
+ \ingroup examples
+ \title Text Edit Example
+
+ This example displays a text editor with the user interface written
+ in pure C++.
+
+ A similar example which uses \link designer-manual.book Qt
+ Designer\endlink to produce the user interface is in the \link
+ designer-manual.book Qt Designer manual\endlink.
+
+
+ See \c{$QTDIR/examples/textedit} for the source code.
+
+*/
+
+
diff --git a/examples/textedit/textedit.h b/examples/textedit/textedit.h
new file mode 100644
index 000000000..7b2031f03
--- /dev/null
+++ b/examples/textedit/textedit.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TEXTEDIT_H
+#define TEXTEDIT_H
+
+#include <qmainwindow.h>
+#include <qmap.h>
+
+class TQAction;
+class TQComboBox;
+class TQTabWidget;
+class TQTextEdit;
+
+class TextEdit : public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ TextEdit( TQWidget *parent = 0, const char *name = 0 );
+
+private:
+ void setupFileActions();
+ void setupEditActions();
+ void setupTextActions();
+ void load( const TQString &f );
+ TQTextEdit *currentEditor() const;
+ void doConnections( TQTextEdit *e );
+
+private 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 TQString &f );
+ void textSize( const TQString &p );
+ void textColor();
+ void textAlign( TQAction *a );
+
+ void fontChanged( const TQFont &f );
+ void colorChanged( const TQColor &c );
+ void alignmentChanged( int a );
+ void editorChanged( TQWidget * );
+
+private:
+ TQAction *actionTextBold,
+ *actionTextUnderline,
+ *actionTextItalic,
+ *actionTextColor,
+ *actionAlignLeft,
+ *actionAlignCenter,
+ *actionAlignRight,
+ *actionAlignJustify;
+ TQComboBox
+ *comboFont,
+ *comboSize;
+ TQTabWidget *tabWidget;
+ TQMap<TQTextEdit*, TQString> filenames;
+
+};
+
+
+#endif
diff --git a/examples/textedit/textedit.pro b/examples/textedit/textedit.pro
new file mode 100644
index 000000000..eeb206785
--- /dev/null
+++ b/examples/textedit/textedit.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = textedit
+
+CONFIG += qt warn_on release
+
+REQUIRES = full-config nocrosscompiler
+
+HEADERS = textedit.h
+SOURCES = textedit.cpp \
+ main.cpp
+IMAGES = editcopy.xpm editcut.xpm editpaste.xpm editredo.xpm editundo.xpm filenew.xpm fileopen.xpm fileprint.xpm filesave.xpm textbold.xpm textcenter.xpm textitalic.xpm textjustify.xpm textleft.xpm textright.xpm textunder.xpm
diff --git a/examples/textedit/textitalic.xpm b/examples/textedit/textitalic.xpm
new file mode 100644
index 000000000..329e66d3e
--- /dev/null
+++ b/examples/textedit/textitalic.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * italic_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ..... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ..... ",
+" ",
+" ",
+" ",
+" "};
diff --git a/examples/textedit/textjustify.xpm b/examples/textedit/textjustify.xpm
new file mode 100644
index 000000000..75b4a274a
--- /dev/null
+++ b/examples/textedit/textjustify.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * block_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ................. ",
+" ",
+" ................. ",
+" ",
+" ................. ",
+" ",
+" ................. ",
+" ",
+" ................. ",
+" ",
+" ................. ",
+" ",
+" ................. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ",
+" "};
diff --git a/examples/textedit/textleft.xpm b/examples/textedit/textleft.xpm
new file mode 100644
index 000000000..a63e7cef1
--- /dev/null
+++ b/examples/textedit/textleft.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * left_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ",
+" "};
diff --git a/examples/textedit/textright.xpm b/examples/textedit/textright.xpm
new file mode 100644
index 000000000..3e896bd7a
--- /dev/null
+++ b/examples/textedit/textright.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * right_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ............. ",
+" ",
+" ................. ",
+" ",
+" ",
+" "};
diff --git a/examples/textedit/textunder.xpm b/examples/textedit/textunder.xpm
new file mode 100644
index 000000000..ec962a74c
--- /dev/null
+++ b/examples/textedit/textunder.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * under_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ..... .... ",
+" ... . ",
+" ... . ",
+" ... . ",
+" ... . ",
+" ... . ",
+" ... . ",
+" ... . ",
+" ... . ",
+" ... . ",
+" ... .. ",
+" ... .. ",
+" ...... ",
+" ",
+" ............ ",
+" ",
+" ",
+" "};
diff --git a/examples/themes/fileopen.xpm b/examples/themes/fileopen.xpm
new file mode 100644
index 000000000..880417eee
--- /dev/null
+++ b/examples/themes/fileopen.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *fileopen[] = {
+" 16 13 5 1",
+". c #040404",
+"# c #808304",
+"a c None",
+"b c #f3f704",
+"c c #f3f7f3",
+"aaaaaaaaa...aaaa",
+"aaaaaaaa.aaa.a.a",
+"aaaaaaaaaaaaa..a",
+"a...aaaaaaaa...a",
+".bcb.......aaaaa",
+".cbcbcbcbc.aaaaa",
+".bcbcbcbcb.aaaaa",
+".cbcb...........",
+".bcb.#########.a",
+".cb.#########.aa",
+".b.#########.aaa",
+"..#########.aaaa",
+"...........aaaaa"
+};
diff --git a/examples/themes/main.cpp b/examples/themes/main.cpp
new file mode 100644
index 000000000..bf4c31b7e
--- /dev/null
+++ b/examples/themes/main.cpp
@@ -0,0 +1,28 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qwindowsstyle.h>
+#include "themes.h"
+
+#include "metal.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication::setColorSpec( TQApplication::ManyColor );
+ TQApplication a( argc, argv );
+
+ Themes themes;
+ themes.setCaption( "TQt Example - Themes (TQStyle)" );
+ themes.resize( 640, 400 );
+ a.setMainWidget( &themes );
+ themes.show();
+
+ return a.exec();
+}
diff --git a/examples/themes/marble.xpm b/examples/themes/marble.xpm
new file mode 100644
index 000000000..1c0804962
--- /dev/null
+++ b/examples/themes/marble.xpm
@@ -0,0 +1,470 @@
+/* XPM */
+static const char *marble_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 240 240 223 2",
+/* colors */
+".. c #959595",
+".# c #c5c5c5",
+".a c #adadad",
+".b c #dedede",
+".c c #b7b7b7",
+".d c #d2d2d2",
+".e c #bebebe",
+".f c #c9c9c9",
+".g c #b8b8b8",
+".h c #d6d6d6",
+".i c #9e9e9e",
+".j c #eaeaea",
+".k c #b2b2b2",
+".l c #cecece",
+".m c #a5a5a5",
+".n c #e4e4e4",
+".o c #c4c4c4",
+".p c #d9d9d9",
+".q c #b1b1b1",
+".r c #d8d8d8",
+".s c #e0e0e0",
+".t c #d6d6d6",
+".u c #b6b6b6",
+".v c #bfbfbf",
+".w c #cbcbcb",
+".x c #a5a5a5",
+".y c #d1d1d1",
+".z c #cdcdcd",
+".A c #aaaaaa",
+".B c #9a9a9a",
+".C c #dedede",
+".D c #aeaeae",
+".E c #e6e6e6",
+".F c #d3d3d3",
+".G c #c8c8c8",
+".H c #bababa",
+".I c #c4c4c4",
+".J c #cccccc",
+".K c #bcbcbc",
+".L c #f0f0f0",
+".M c #b5b5b5",
+".N c #e3e3e3",
+".O c #c2c2c2",
+".P c #adadad",
+".Q c #c9c9c9",
+".R c #e1e1e1",
+".S c #a2a2a2",
+".T c #d1d1d1",
+".U c #bebebe",
+".V c #dbdbdb",
+".W c #dbdbdb",
+".X c #c8c8c8",
+".Y c #b9b9b9",
+".Z c #a8a8a8",
+".0 c #d3d3d3",
+".1 c #9f9f9f",
+".2 c #c1c1c1",
+".3 c #ebebeb",
+".4 c #b4b4b4",
+".5 c #d9d9d9",
+".6 c #cecece",
+".7 c #e8e8e8",
+".8 c #d6d6d6",
+".9 c #c5c5c5",
+"#. c #b0b0b0",
+"## c #dadada",
+"#a c #c5c5c5",
+"#b c #d1d1d1",
+"#c c #afafaf",
+"#d c #b1b1b1",
+"#e c #cbcbcb",
+"#f c #c1c1c1",
+"#g c #eeeeee",
+"#h c #9b9b9b",
+"#i c #c6c6c6",
+"#j c #c0c0c0",
+"#k c #cbcbcb",
+"#l c #bdbdbd",
+"#m c #a1a1a1",
+"#n c #b7b7b7",
+"#o c #a7a7a7",
+"#p c #e6e6e6",
+"#q c #c9c9c9",
+"#r c #bbbbbb",
+"#s c #e2e2e2",
+"#t c #b8b8b8",
+"#u c #cdcdcd",
+"#v c #d3d3d3",
+"#w c #cfcfcf",
+"#x c #e0e0e0",
+"#y c #d5d5d5",
+"#z c #bdbdbd",
+"#A c #cecece",
+"#B c #c0c0c0",
+"#C c #b7b7b7",
+"#D c #e5e5e5",
+"#E c #c4c4c4",
+"#F c #e3e3e3",
+"#G c #d3d3d3",
+"#H c #dddddd",
+"#I c #dddddd",
+"#J c #acacac",
+"#K c #a3a3a3",
+"#L c #eaeaea",
+"#M c #e1e1e1",
+"#N c #b9b9b9",
+"#O c #d5d5d5",
+"#P c #bababa",
+"#Q c #d7d7d7",
+"#R c #b5b5b5",
+"#S c #d1d1d1",
+"#T c #c6c6c6",
+"#U c #dcdcdc",
+"#V c #b4b4b4",
+"#W c #c6c6c6",
+"#X c #a8a8a8",
+"#Y c #a0a0a0",
+"#Z c #cbcbcb",
+"#0 c #bfbfbf",
+"#1 c #cbcbcb",
+"#2 c #a4a4a4",
+"#3 c #c0c0c0",
+"#4 c #bbbbbb",
+"#5 c #9c9c9c",
+"#6 c #a2a2a2",
+"#7 c #dcdcdc",
+"#8 c #c3c3c3",
+"#9 c #9d9d9d",
+"a. c #aaaaaa",
+"a# c #d5d5d5",
+"aa c #eeeeee",
+"ab c #b6b6b6",
+"ac c #b0b0b0",
+"ad c #b3b3b3",
+"ae c #c9c9c9",
+"af c #e9e9e9",
+"ag c #bdbdbd",
+"ah c #a0a0a0",
+"ai c #b0b0b0",
+"aj c #e8e8e8",
+"ak c #cacaca",
+"al c #c3c3c3",
+"am c #dbdbdb",
+"an c #d0d0d0",
+"ao c #d8d8d8",
+"ap c #c7c7c7",
+"aq c #dcdcdc",
+"ar c #c7c7c7",
+"as c #f0f0f0",
+"at c #a3a3a3",
+"au c #bfbfbf",
+"av c #d9d9d9",
+"aw c #dfdfdf",
+"ax c #d3d3d3",
+"ay c #c0c0c0",
+"az c #cacaca",
+"aA c #b3b3b3",
+"aB c #cfcfcf",
+"aC c #dadada",
+"aD c #b2b2b2",
+"aE c #e2e2e2",
+"aF c #d7d7d7",
+"aG c #c4c4c4",
+"aH c #b8b8b8",
+"aI c #cdcdcd",
+"aJ c #a6a6a6",
+"aK c #d2d2d2",
+"aL c #cecece",
+"aM c #acacac",
+"aN c #dfdfdf",
+"aO c #d5d5d5",
+"aP c #c9c9c9",
+"aQ c #bcbcbc",
+"aR c #c6c6c6",
+"aS c #cdcdcd",
+"aT c #bebebe",
+"aU c #f2f2f2",
+"aV c #b6b6b6",
+"aW c #e4e4e4",
+"aX c #c3c3c3",
+"aY c #e2e2e2",
+"aZ c #d2d2d2",
+"a0 c #dddddd",
+"a1 c #dcdcdc",
+"a2 c #ececec",
+"a3 c #eaeaea",
+"a4 c #cccccc",
+"a5 c #c7c7c7",
+"a6 c #c2c2c2",
+"a7 c #cccccc",
+"a8 c #a8a8a8",
+"a9 c #e7e7e7",
+"b. c #e4e4e4",
+"b# c #d9d9d9",
+"ba c #bababa",
+"bb c #cfcfcf",
+"bc c #d4d4d4",
+"bd c #d0d0d0",
+"be c #aeaeae",
+"bf c #e1e1e1",
+"bg c #d7d7d7",
+"bh c #cfcfcf",
+"bi c #b8b8b8",
+"bj c #e6e6e6",
+"bk c #c5c5c5",
+"bl c #e4e4e4",
+"bm c #d4d4d4",
+"bn c #dfdfdf",
+"bo c #dedede",
+"bp c #ececec",
+"bq c #bababa",
+"br c #bcbcbc",
+"bs c #b0b0b0",
+"bt c #cccccc",
+"bu c #a6a6a6",
+"bv c #c1c1c1",
+"bw c #bcbcbc",
+"bx c #ababab",
+"by c #d7d7d7",
+"bz c #b7b7b7",
+"bA c #b2b2b2",
+"bB c #b4b4b4",
+"bC c #bfbfbf",
+/* pixels */
+"aYbla9a9a9.7#D.N#L#La9.7a9#D#D.7#D#D#DaY#x#xa0ama0ama0am#xbnbnbnaYaYaYaYaY#DaYaYaYbn#x#x#xaY.N#Da9a9a9a9a9a9a9a9a9.7a9a9a9#Da9#D#L#L#L#L#L#La2#La2a2a2a2a2a2#ga2#ga2#ga2a2#ga2a2#L#L#L#Lafa9a9a9bl#Dbl#Da9a9a9#L#L#Laf#L#Laf#L#L#L#L#L#L#L#L#L#La2#La2a2a2#La2#L#L#Laf#L#Laf#L#Laf#L#Laf#L#Laf#Laf#Laf#Laf#Laf#L#D#DblblaYaYaCa0.t.Fb#bnbnaCbnblblblblblaYaY.RaYblblblblblblblbla9a9a9a9a9a9#pa9a9#pa9#pa9#pa9#pa9#pa9a9bl#D#D#D#pa9#pafa9a9a9a9#L#Lafa9a9a9#D#D#pbl#U.V.Vb#.8am#xbn#IaYbl.N.N#x",
+"am#I#Da9a9a9bj#D#La9.7#D#Da9#D#D#p#DaYaY#xbna0amamamb#a0a0a0a0bnawaYaYaYaYaYaYaY#xbnaY.R#xaYaY.Nafa9afa9afa9afa9.7a9.7a9bja9bja9#Lafa2afa2af#L#L.3#La2#La2bpa2#La2#ga2a2#ga2a2#g#L#Laf#L#La9afa9bl#Dbl#Da9afa9#L#Laf#L#Laf#L#Laf#L#L#L#L#L#L#L.7a2#La2a2#La2#La2#Laf#L#Laf#Laf#Lafajaf#L#Laf#L#L#Lafajafajafajaf.na9#s#Daw#xbnaCb#bg.Vbnbn.RaYaY#Mbl#pblaYblaYaYaYblblbl#D#Dbl#D#paf#pafa9#pa9afbla9#pa9#pa9#pa9#pa9#p#D#p#Da9#D#pa9#pa9#Da9#Da9af#L#La9.7#D#s#D#MaYbnaCb#aOb#aC#x#UaYaY#M#DaYbf",
+"aOambn.sa9bja9.7a9.7a9#Da9bj#D#D#D#DaYaY#x#xa0amaFaFbgb#aF.Va0.VaYaYaYaYaYaYaYaYbn#xaY#xaY.N#D#Da9a9a9a9a9a9a9a9a9bja9#Da9#Da9#D#L#L#L#L#L#La2#La2afa2a2a2a2#ga2#g#La2bpa2bpa2#L#L#L#L#Lafa9a9#p#DaY#D#Da9a9.7a9af#Laf#L#Laf#Laf#L.7#L#L.7#L#L#L#La2a2a2#La2#L.3#Laf#Laf#Lajaf#Laja9#Lajaf#Lajafaja9#La9#La9#La9a9a9blaYaYaYawa0b#b#.paYaYblaY.Rbla9#pblblaYblaYa9#p#D#pa9#pa9#pa9a9a9#pa9a9#pa9bl#pa9#pa9#pa9#pa9#pa9a9#D#Dbla9a9a9a9a9#pa9a9a9#L#Lafa9a9#D#D#Da9awbn.pb#bgamaCbn#xaw#D#D#D.N#x",
+"amamaC#x#D#s.7.7a9#Da9#D#D#D.N.N#xaYaYaY#xbna0a0aOaFb#aOb#bg.Vambna0bnaCa0aYaYaY#U.RaYaYaY#Dbl#Da9a9#La9af.7afa9.7a9.7a9bja9bja9#L#L.3#L.3#Laf#Lafa2#L#La2#La2bpa2a2#ga2#ga2a2#g#L#L#L#Lafa9afa9.Nblbl#Da9a9afa9#Laf#L#Laf#Laf#L#L#L#L#L#L#L.7#L#La2#L#La2aja2#Laj#Lafaj#Laf#L#Laf#Lafafajafaf#Lafaj#Lafajafaj#Laja9.n#D#MaY.R#xbga0bnbn.RaYbl#Ua9#pa9#D#Dbl#D#Dbl#Dbl#Dbla9#Da9a9#pafa9af#pa9#p#pa9#pa9#pa9#pa9#pa9#p#D#pa9#Da9a9af#pafa9af.7a9#Laf#L.7a9#s#D#saYaY#Ua0aObgao#x#IaYbl#D#s#D.sbf",
+"amaOama0.N.Na9a9bja9#Dbj#D#D#DaY.N#x#x#x#xbnaCa0#H.Vbgb#b#aFbgambnbn#Ubnbnbnbnbn#xaYawaYbl#Da9#Da9a9a9a9a9a9a9a9a9bja9#Da9#sa9#D#Laf#L#L#L#La2a2a2afa2#La2#ga2a2#g#L#g#La2bpa2#L#L#L#Laf#La9a9#pbl#Dbl#Da9a9.7a9#Lajaf#Lajaf#Lajafafajafafajafaf.j#L.3a2#Laf#La2af#Laf#Laf#Laf#L.n#L.n#La9#L#Lafa9afa9aja9#La9af.7afa9#Dbl#IaYawa0a0#UbnaYblblaY#pa9#pa9#D#D#D#Dafa9afa9af#pa9#pa9afa9#pa9a9a9a9#pa9#pa9#p#pa9#pa9#pa9a9#D#Dbla9a9a9a9a9a9.7a9.7af#Laja9a9#D#D#saYawbnaCb#aobn#x.Nbl#s#D#D#D.N.N",
+".CamaOao.WaY#D.7#s#Da9#D#D.NaY.N#x#I#xbn#xaY#x#U#xa0a0a0bgamb#ambga0ama0am#xa0a0.RaYaY#Dbl#Dbl#Da9a9a9a9afa9afa9.7a9#D.7#Dbja9.7af#La2#La2af#L#La2a2a2a2a2#L#g#L#ga2a2#ga2#ga2#g#L#L#L#Lafa9a9a9#Dawbl#Da9a9a9.7af#Laf#Laf#L#Laf#L#Laf#L#Laf#L#Laf#L.j#La2afajaf#Lafajaf.Eafaj#Laf#Laf#Lafaja9aj#Lajaf#Laf#Lafajafajaf.n#DblaYaYaCbn#xbnaYaYaY.Rbla9#p#Da9a9.7#La9a9a9a9a9afa9afa9a9afa9afa9afa9#p#pa9#pa9a9#pa9#pa9#p#D#pa9#Da9afafafaf.7a9a9.7#L#Lafa9.n#D#s#D#D#x#Ua0aCaC#x.saY.s#D.7a9.Ebj.N",
+"#xa0.8a#.8.Cbf.N#D#D.N.NaY.N.saY#x#xaY#IaYaYaYaYaYaY#x#x#xa0aCam.Vb#bg#yb#.Va0bnaYaYblaY#Da9#D#Da9afa9af.7a9a9a9.7a9bja9#s#Da9.7ajaf#Laf#L#La2#L.3#La2#La2a2#ga2a2bpa2#L#g#La2bp#L#L#Laf#La9af#paYbl#D#Da9a9a9a9#L#L#Laf#Laf#L#Lafafafafaf#Lafaf#La2#La2afajaf#Lajaf.7af#Lafa9aja9aja9#L.n#Lafafa9#L.n#L.n#La9#Laf#La9a9#Mbl#xaY#x#IaYawaYaYaYaYblbl#pa9a9.7#L.7afaf#Laf#Lafa9afa9a9a9a9a9a9a9a9a9#pa9#pa9#pa9#pa9#pa9a9#D#D#Da9af#Lafa9a9a9.7af#Laja9a9#D#D#D#M.N#I#xaCa0#UaY#D.NaY#D.n.7bj#Dbj",
+"#x#xa0#vbcaq#xbf#D#D.Nbl.s.NaYbf#x#x#xaYaYaYaYaYaY#M.NaY#x#x.Ca0b#bgb#bgbg.V.p.VawaYblbl#Dbl#Dafa9a9a9a9afa9afa9.7a9#Da9#D#s#Da9af#La2#La2#Laf#La2#La2#La2bpa2bpa2#ga2#ga2#ga2a2#L#L#L#Lafa9a9a9aYaYbl#Da9afa9a9ajaf#Lajaf#Lajafafaj#Lafajafafajafa2#La2#Laf#Lafa9#Lafaja9aj#Laf#Lafajaf#Laf.7afaj#Laf#Lafajaf.Eafajaf.n#Dbl#MaY#IaY#xaY.RaY.RaY#FaYa9a9a9#L#L#Lafa9afafa9#Laf#L#La9afa9afa9afa9#pa9#pa9#pa9#pa9#pa9#p#D#p#Da9a9afa9a9.7a9#L.7.7.naf#La9.n#D#s.N.N#x#UaCbnaY#s#DaY#sa9.7b..7#DaW",
+".7aw#x.CaoaB.y.5#s.N#I.Ca0a0ama0#x.N.NaY.NaY#D#Dbl#DblaYawaY#U.CbgbmaBaSaZbma0a0blaYaY#Dbla9a9#Da9af.7afa9a9a9a9bl#D#D#D#D.N#D#D.7a9a9a9a9a9#La9afafafafafaf#Lafa2#La2#L#L#L#La2a2a2af#La9a9#D#DawaY#sbla9b..7#La9a9a9a9.7a9a9a9afa9af.nafafafafafajafajafajafajafaja9a9bl#MaY#s#Da9#Da9#sa9.na9.7af.Eaf.7af#Lafafa9a9bl#M.NaY#Ibn#UaYaYaw#Da9a9.n#p#pa9a9.7.7.7.7a9.7a9.7a9a9#Lafafaf#Lafa9a9a9#pa9a9#pa9#pa9a9a9a9afa9.7af.7.7.7afa9a9a9a9a9a9#L.na9.na9.na9.n#Maw.Nawaw.N#D#D.E.7bj.7#Dbjb.#D",
+".7#D.s#x.5.y#va#.NaYbf.Ca0ao#xbn.s.N.N#D#D#Da9#Dbl#Dbl#DaYaYaYbn.p.taBan#uaZ.FbgbnawaYawbl#D#D#D#D#Dbl#D#D#D#D#D#Dblblawbl.N#D#Da9a9a9.7af.7a9a9afafafajafaf#L#L#La2a2a2a2a2#La2#La2af#La9#D#D#DaYaY#D#D#Da9a9.7a9a9.7a9a9a9.7a9#Lafafafaf#Lafafaja9af#pafa9af#pajaf.na9#s#DblaYa9a9.na9a9a9#Da9aj#Lafaj#La9aja9ajaf.nbl#DaYaw#xa0#x.b#xaY#D#D#p#p#p.na9a9a9#L.7a9a9a9a9a9.7a9#Lafafafafafafa9af#p.na9#pa9a9a9afa9af.7a9#L.7#L#La9a9.7a9a9.7.na9a9a9.na9.na9.na9#D#MaYaw.N#s#D.n.7.7.n.7.E#D#D.7",
+".7a9aY#xaCam#v#vaCaqa0aqama0#UaY.NaY#D#D#D#D#D#Da9#D#D#Dbl.NaY#Ibnambm#SaZa#a#b#aCa0a0#x#x#xaYbl#D#Da9#Dbl#Dbl#DblaYaYaYaYbl#D#Da9a9a9afa9afafafafafafafafaf#Laf#L#L#Laf#Laf#Laf.j#L#L.n.7a9#s#Daw#x#M#Da9#Daj.7a9.na9.7.na9a9.naf#Lafajafafajafafafajafajafafaf#pa9bl#Mbl#Daw#D.n#Da9#D.na9.na9a9af.7afafajaf#Lafa9a9#sblaY#x#IbnbnaYaYawbla9a9#p#pbl#pa9#D.7.7a9.7a9.7a9a9#L#Lafaf#Lafafa9a9a9a9#pa9.n#pa9a9a9afa9a9#L#Laf.7afa9a9a9a9.7a9a9a9.naf.na9.na9.na9#M.Nawaw#D#s#D#Daj.7aj.7#D.7b.a9",
+"a9#saY.s.Ca0aF#v#v.5#vaF.8a0#x#D#D.N#D#Da9bja9.7a9a9bl#D#DaYaY.N.R#Uama#aFaOaFaFb#b#b#a0aCa0#I#xaYblaYblbl#DblaYaw.R#IaYawaY#D#Da9a9a9a9a9a9a9a9a9#p.na9af#La9.7af#Laf#Lafajaf#L#L.3#La9#D#D.NaYaYaYbl#D#D.7a9.7a9.7a9a9a9.7a9.7a9a9a9a9.na9#pa9.n#pa9#pa9#p.na9#sbl#s#Dbl#DblaYa9a9a9.Ea9a9bja9a9.na9#sa9#Da9#Da9.nblbl#D#M#x#x#U#x#UaYaY#Da9#sa9#p.na9a9.7a9a9#La9a9#La9#L#L#L#Lafafa9#La9afa9#pa9#pa9a9a9a9.7#Laf#L#L#L.7#L.7.7a9.7.na9a9.na9.7.n#D#D#s#D#M#D#Mbl.s#D.s#Da9#D.7.na9a9.n.7#D.7",
+".N.N.NaY#Uaqamaoa#aB.0a#ambn#xbl#D#D#D#D#Da9.7a9a9.7a9#D#D.s.NaYaY.RaCamamaF.5b#amaob#amama0a0a0#IaYawaYaYaYaYaYbnbnbnaYaYaYbl#D.na9a9.7afa9a9a9a9af#paf.na9afa9.n.7#La9.7a9#L#Laf#La9a9#D#D.N.NaYaY#Dbl.n#D.7af.7a9.na9.na9a9.na9.na9a9#pa9.na9a9a9.na9.na9a9a9aY#MaYbl#sbl#s#D.n#Da9#Da9#sa9.n#Da9a9.7a9.na9.na9a9#DawaY#x#x#xbnbnaYawaYbla9a9a9a9#pa9#Da9a9.7a9.7af#L#L#La9#Laf#Laja9.7a9.7a9a9.n#pa9a9.7#Da9a9#L#La9#Laf.7afa9a9a9.7a9a9bja9#sa9#D#M#D#M#D#sbl#saY#saY#s#D#s.7a9.E.7#D#D#D#D",
+"#I.N#I#xamaCamaFaB.Gaz#u.8am#xaY#D#D#D.7a9bja9.7.7a9.7a9#D#D#D.N#Ubna0aCama0amao.Va0amaCama0aC.Cbnbnbnbn#x#Ubn#Uam#Ua0awaYaYaw#D#pa9a9#pa9a9a9#p.na9a9a9a9a9.7a9.7a9af.7afa9a9a9aj#La9.E#D#D#saYaY#Mbl#Dbja9.7.7a9a9a9.7a9#sa9#D#p#D#pbl#sbla9#D#sblbl#Dblbl#sblawaY.N#MaYbl#Dbla9.Ea9.na9.7a9a9#D#s#D#s#D#D#D#D#D#MaYbl.Naw#x#Ibn#I.R#xaY#Da9#Da9a9a9a9.na9a9a9.7a9a9#La9#La9a9#L#Laf#La9a9#Dbj#pa9a9a9#Da9.7.7afafa9.7a9.7#L.7a9.7a9a9#sa9.na9#D#D#D#s#D.sbl#Dawbl#saY#sbj#Da9#s#D.Nbl.saY.s.N",
+".Cbf.C.Cam.5aoa#.la5.G.waZ#va0.C#D#D#D.7a9a9#L#La9#L.7.7.7#D#D#D#x#x#x#x#x#xa0bnam.Va0.Va0a0#xbnaY#x#Ia0a0aCa0aCa0ambnbnaYawblbl#Dbl#M#Dblbl#D#Mbl#pa9a9#Da9a9.7a9.7a9.7a9.7a9a9#La9.n#D#D.NaY.NaYaY#D#Da9#Daja9.7a9a9a9a9.7a9.n#D#M#D#sbl#sblbl#D#M#D#M#D#M#D#M#x#xawaY#Dawa9#Ma9#Da9#Da9#sa9#s#D#D#D#D#D#s#D#sbla9blaw#x#x#xa0#UbnaYawaYbl#D.na9a9a9a9a9#Da9#pa9#La9#L#La9.7af#L#L#L.7#L.7.7.na9a9#D#s.7#D.7.7afa9#La9af.7a9.7.na9.na9a9a9#Da9#s#Dawblaw#D.sbl#sbl.s#D#D#s#D#saY.Naw#xaYbf#x#x",
+"aqaoamavam.8a##v.5#Saza7.w#u#vam#Da9#D.7a9.7a9a9.7#L.7#La9bj#D#D.Cbn#xbnaYaY#x#x.pb#.Vamaobnbn#xbnbn#xbn#xbn#xa0a0b#aCa0aw.R.Nblaw#Dbl#Dbl#Dblbl#pa9#Ma9a9.nbja9a9a9#La9a9a9.7a9.na9#D#D#DaY.N.NaYaYbl#D#sa9a9#La9.Ea9.7a9a9#Da9#M#Dbl#Mbl#sbl#s#Mbl#sbl#D#MaY#sa0#I.NaYaYblbl#Da9a9.na9.Ea9a9a9#D#D#s#D#s#D#D#D#Dbl#saY#x#xaC.Ca0#x.R#xaY#D#Da9a9a9a9a9a9#p.na9a9a9a9#La9#La9a9#L#L#L.7#La9.7.7a9a9a9#Da9.7af.7a9afa9.7a9.7#L.7a9a9bja9#s.7.na9#sbl.s.saYaw#saY#saY#saY#s#D#s#D#xaY#x.W.C.C.Waq",
+"amaFaOaFaOaFama0aY#x.8.0#u#uan#uam#xaY#Da9a9.7a9#Laf#L#La9#D#D.sbl#D#sbl#xaYaw#x.Rbn#Ub#.Va0b#b##Ubnbnbnbna0#xbnbnaYaYaYbnbn#UbnaYaYblaYblawblawa9.n#p#pa9#pafafa9a9a9.na9a9a9a9bl#Dbl#Dbl#sblblawaY#D#Da9.7.7#Laf#Laf.n.7#D.7#D.NaYawaY#xbn#Ua0#U#Ubn#UbnaC#UaY#xawaY#M#D.na9ajaY.N#Dbla9a9.na9.nbl#DblaYaYaw#x#MblaYawbn#Ibna0.b#U.RawaY#Mblbl.na9a9a9a9a9afa9#Dbj#D#D#D#D#D.7#Lafa9afa9.7#Da9#sa9a9a9#Da9.7.7afa9a9a9a9#D#s#D#D#Daw.N.NaY.NaY#D#sbl#saY#saY.N.na9#D#s#DaY.N.N#I#x.CamaoaFbya#",
+"bgb#amam.5aCa0.C#M#xa0aFaZ#uaB.0aO#xaY#Dafa9a9a9#L#L.7af.7#D#D#D#D#DaY#D.N.N#xaY.Cbna0a0b#aFb#aF.Vbnbna0#Ubnbn#x#U#x.R#xawaYbn#x.R#I.Raw.RaY#x.R#p#p#pbl.na9a9a9a9a9a9#Da9#s#D#M#Dblbl#sblbl#DblaY#Dbla9#Da9af.7ajaf#L.7a9.n#Da9#M#DaYaYaYaYbnaCbn.paCa0bgaoaC#UaC#I#xaY#MaYblbl#Mbl#M#D.na9a9.n#D#M#D#M#DaY#DaY#M#pawaY#Ibn.Ca0aYbnaY.RaYblbl#Da9a9.na9afa9a9af#D#D#D#D#D#Da9#Daf#L.7a9.7#Da9#D#pa9.na9a9b.a9.7.7a9.7a9bja9#D#D#D#D#DaY#Daw#Daw#D#D#M.N#saY.saY#sbl#sbl.Naw.Nawbna0aCa0.8a#aF.5",
+"amamaCa0a0#x#xaYblaY#Ia0bc#u#ua#amam#x#D#Da9.7a9#Laf#La9a9.7#D#Dbl#D#D#MaYaYboaYbna0a0aoamb#aOb#b#am.Va0bnbn#Ubnbn#xaYaY.R#xawaYbn#UbnaCbn#Ubn#U.RawaYblaYblawbl#D#D#D#Dbl#Dbl#Dbl#Dblbl#Dblbl#DaYaw#D#Da9bj.7#La9#Lafa9a9bja9bj#D#MblawaYaw.R#Ubn.V.8#vaB#S#waOaoa0aC#x#x.N#I.NaY.NaY#D#D#D.n#Dbl#sbl#Dbl#saYaYblawaYaYbnbnaCbn#U.baYawaY#M#Dbla9.na9a9.na9.na9#s#D#s#D#s#D#D#D.na9a9a9a9#D#D#D#pa9a9#Da9#D#L.7a9.na9#D.n#D#D#D.saY.saY.NaY.saY#sbl#s#Daw#DaY.NaY.NaY.saY.NaY#x.Wa0a0a0aOam.8a#",
+"#x#x#x#xaYaY.N.N.7#D#x#xb#aZ.ya#amaObn#Da9#Da9bj#L#L#D.7#Da9.7a9a9.nbl#D#DaYaY.NaC#xa0.Vamb#aFaF#vaFbga0a0bn#xaY#Ubn#U#xaYaYaYaYbn#xa0a0a0a0aCa0bn#Ubn.baYaYaYaYbl#D#M#Dbl#D#Dbl#Dbl#s#D#D#D#D#MaY#Dbl#D#Da9.7a9ajafaj.7a9a9#sa9a9#M#DaYaYaY.b#xbgb##vaBa7.Q.z#S.5aO.8aoao.Ca0.W#x#I.Naw.NawaY#DawaYblawaYaYawaYawaYaY#U.C#U.Ca0aY#x.RaY#xblbl#D#Dbla9a9a9a9a9a9#D#D#D.NaY.N#s#Da9a9#sa9a9#M#Dbl.na9a9a9a9bja9.7a9a9a9.7#D#D#D#saY#DaY#Daw#DaY.N#M#D#s#Dbl.s.N#M.Naw.N#xaY#x#I#x#Ua0a0aCamama0am",
+"aYaYbl.s#D#D#D#Da9#D#s.N.CaOa#aF.5ao#x#Dbl#Da9#Da9a9.7a9.7a9a9.7a9a9a9#Dbl.NblaY#x#xbna0a0amaFaFbmaFaFamaCbn#U#xbnbnbnaY.b#x.R#xaYbn#xbnaCa0bna0#Ubn#Ubnbn#I#xaY.NblaYaYawaYaw#Dbl#Dbl#D#M#Dbl#DaYaY#Dbl.na9.7a9#La9#La9a9bja9#D#MaYblawaY.R#x#U#S#SaB#uaz#u#vaO.8aOaOaOaOaOaOaO.Caoa0.W.C#I#x#I#x#I#x#x#I#x.NaY#x#Ubn#UbnaCbnaC#I.R#IaYawbl.sbl#M#D#Ma9#D.n#Dbl#D#D#s#D#D#D#D#D#Ma9bl#D#D#DblaYa9#p#sa9#D.n.7.7.na9#s#D#s#D.NaY.saY.saY.NaY.saY#s#D#p.s#saYaY.N#IaYaYaw#x#IaY#I#x#x#I#x#x#x#x#x",
+"#D#D#D.7.7.7.7.7.7a9a9#DaY.CaO.y.5.5bnaY#D#D#D#D#D#Da9bja9a9.7a9a9a9#Da9#sbl.N#MaYaY#xawbna0aCb#aOaFbgb#b#a0a0bn#Ibnaw#xaYaYaYaY#Ubn#IaYaYaYaYbnbn.R#xaw#x.R#Ibnaw#IaY.sbl.Nbl.N#D#M#Dbl#D#M#DblawaY#M#D#D#s.7a9aj#L.na9.n#D#s#D#DaY#IbnaY#UbnaCaB#SaB#u#uaBaO.5amaoam.8.5aO.y#1#1#u.yaOamamaoamamamaC.C.C#xbn#x#Ua0aC.CaCa0#Ia0.R#x#UaYaYblaY.N#D#p#D#sbl#Dbl#D#s#D#D#D#D#s#D#Da9#p#MblblawaYaY#Ma9bl#sa9bja9.7#Da9a9.7a9#Daw#DaY.saY#Daw#DaY#D#M#D#sbl.N#saY.saY#xbo.N.N.s.N.Naw.N#D#D#D#Da9#D",
+"a9.7.7af#Lajbp#L.7#L#La9#DaYa0#va#a0a0.Cbl#D#D#Dbj#D#Da9.7a9#L#L.na9a9a9a9#D#D#Dbl#DaYaY#xaYbna0b#aFb#b#aob#aoambnbnbnbn#U#x.R#xaY.RaY.R#IaYaYawblblaYblaYaYaYawbn#I#x#UaYawbl#Daw.N#D#D.NaY.NawaY#xbl#D#D#Da9.Eafaf#La9#D#D#D#D#I#x#xaCa0aCaoaO.FaO#v#u#u#uaFbgaC.Caoa0ao.5aB.z.U.Oaz.y.y#vbm.y#v#v.5amaoamao.8amaoa0aoa0#Ua0#x#U#xbnaw.N.saY#sbl#Dbl#Dbl#D#M#D#D#D#D#D#D#D#D#D.nbl#Dbl#xaYaYaY#pbla9bl#D#s.7.7.na9#Da9#s#D.NaY.NaY.Naw.Naw.Naw#D#M#D#D#Maw.Naw#x#IaYaY#s#Da9.nbj.7.7b..7.7bp#L",
+"#L.7#L#Lbpbp#Lbp.7#L#L.n#D.N.C.5a#amaCaoaY#D#D.N#Da9#Da9#La9#Lafafa9a9#Da9bl#Dbl.n#D.nblawaY#x.Ra0.Vbgamb#amaFaF#Ubn#U#xbnbnaYaYawaYawaYaYblaYaY.bblaYblblblaYaYaYaYaY#I#x#I#x#I.NaYaY.sbl.sbl.NaYaw.N#M#D#sa9.7a9a9.na9.n#D#s#D#xaCa0aoaob##SaBaOaF#S#uaB#v.5aoa0aCamaoao.8#v#v#3ar.wanazaz#3#C#3aX.w.yaOam.8amaCambga0aoa0aCbn#U#x#IaYaw.NaY.NaYaY#sbl#sbl#D#M#D#D#D#D#s#D#D#DblblaY#MaY#IaYawbl.nbl.n#D#Da9#D#Da9.Ea9#D#D#Daw#D#saY.Naw.NaY.N#M#D#s#D.saYawaY#I.N.N#sa9a9.7af#L.E#L#Laj#L#L#g",
+"#L#L#L#L#La2bpa2#L.j.7.7#D.Nbf#IaFaBa7an.5a0#Daf#D.7#D.7a9a9#L#L#D#Da9#D#M#D#Dbl#Dbl#Dbl#Dbl#sblaw.RbnaCb#aOaFa#bg.VambnaCbnaw#x.RaYaYaY.baYawbl#pbl.n#Da9a9#D.7#s#D#D#D#D#D#MaYaw#IawaY#x.N#I#x#IaYaY#D#Da9.na9aja9.n#D.N.N#x.CaCb##vaB#uaBaB#v#SaOaOaOaObg.8am.W.WaCaCamaOaB#u#a#faz#Sa#aBaBaz#u#u#uaz.w.wa7#u#uaB.yao.5aC.C#Ia0.pa0aCbnawaY.sbl#saYaYaY#DaYaY#D#s#D#D#D#D#D#D#s#D#sblaY#x#I#x#D#D#D#Da9.n#D#sa9#D#D#D#s#D#D#D#sbl#s#D#saY.saY#MblaY.C.W#I.N#s#Da9#sa9.7.na9.7#L#L#L#L#L#L#L#L",
+"bpaj#Lbp#Lbp#Lbpa2#L#L.7#D.Nbfbf.Va#an#uaB.8bn#D#Da9#Da9.7a9ajafa9bl#Dbl#D#D#M#D#D#Dbl#D#Dbl.NblaYawbnamb#aFbm#Sb#.Vaobn#xbnaYaY.baY#MaYblaYblaY#pbl#p.n#Da9.n#D#D#D#s#D#s#D#D#saY.s#x.s#I#x#Ibn.W#I#xaw.N#s#D#D#D#D.NaY#I#x.WaCaCaCaF#SaB#v#SaOaOaOb#aOb#bgamao#x#I.CaCao.8#u.w.OaG.G#SaBaBbmaB#v#v#va#aB#u.G.Galbk#Taz.w#v#v.5bg.5bga0ao.C#IaYaY#Dbl#DawaY#D#M.NaY#D#s#D#D#s#D#D#MaYblaY#I#x#x#M#s#D#s#D#D#D#D#Dbj#s#D#D#D#s#D#D#s#D#Daw#Daw.N#M#s#x#I.Cbf.s#D#D.n.7a9.7a9.7.E.7#L.7#L.7#L#L#L",
+"#Lbp#L#g#La2bpa2a2#g#La9bj#D.Nbf.RaCaOaZ.yaFa0aY#D#D#s#Da9a9a9a9#D#Da9#Dbl#D#Dbl#D#M#D#D#M#Dbl#saY#xbnaCa0aOaF#Sb#bg.VbnaCbnaY#xaYaYaY.baYblaYbl#Ma9#p#Da9a9#D.7#D#sbl#Da9#Da9#D#D#D#saY.N#I#I#Iaoao.W#xaY.Naw.N#I#I#U.WaCaoamaobnaCaO#vaF#vaOaFbgambgambg.5.8amav.WaC.CaoaF#uaza6.OazaZaB#vaF#vaFaFam.5aF#v#SaB.G.O#3bv.G.GaPaP.w#u#vaFama0.C.C#IawaYawaY.NaYaYaY#MaYaYaYblaYawblaYaw.NaY#I#x#I#D.N#M#D#D#s#D#s#D#s#D#D#s#D#Dbl#s#p#saY#s.Naw.Nblaw#I#xaY.N.N#sa9.7a9.Ea9.Ea9#L#L#L#L#L#L#L#L#L",
+"#La2bp#L#Lbp#Lbp#L#L#L.7#Dbj#D.NaYbna0aoa##vam.C#D#D#D#D.7#D.7a9a9#D#Dbl#D#Dbl#Dbl#Dbl#Dbl#D#DaYaYaYawbna0b#aO.Fbgb#ama0bnbn#IaY.bblawblaYaY#MaYa9#p#sa9a9#Da9#Da9a9a9a9a9.na9a9#s#D#D.saY.NaY#x.C.C.C.W#I#x#I.WaF.8a0a0a0a0aCa0aCaCb##vaFaO#vbgaob#aoaoamaoaCam.W.Caoa0.8#v#ubkab#aan#vaZ#vaFa#aoaobga0aoamamaOa#aBaZ#u.w.w.G#3#3#a.w.y.yaOb#aCbnbn#I#xbn#UaYawbfaYbfaw#x.s#xaY.NawaYbl#x#Ibn#I#Daw#D.s#D#s#D#D#D#D#D#D#D#D#s#D#D#Dbl#saY#saY.saYaw#xaw.N#s#D#D.7.n.7a9.7a9.7#La9aj.7#L.E#L.7#L",
+"bp#L#L#g#L#g#La2#g#L#L#L.7#D#DbjawaYaCamaoa#.8aF.N.s#D#D#D.n#Da9#sbl#D#D#M#D#D#M#D#M#D#Dbl#sbl#saYaY#x#UbnaCb#b#bgb#bga0aCbn#x.RaYaYaYaYawblaYbl#p.n#pa9a9.nbja9.7a9.7#sa9#D.7.na9a9#D#D#D#saY.s#x#I#I#x.C.Wa0aoaoama0.W.C.Wa0#Ibn.paO#S#v#v#S#Sbgaoaoa0aoa0avaCaqaoavao.8#v.w#T.Y#3an#va#aOamaOa0bnaoambgamaoam.pa0bgb#aoaFaO.ybk#T.GaXaz.waBbyaCa0a0bnaCa0#Ibn#I#x#x#x#x#x#xaC#x#I#x#I#x#I.C#IaY#saY#saY#D#M#D#s#D#M#D#M#D#D#D.n#M#D.s#DawaYaw#x#IaYaw#sa9.7.n.7#L.7aj.7#L#L#L#L#L#L#L#L#L#L#L",
+"#L#g#L#g#g#gbp#L#L#L#L.7af.7.7.7#D.N#xaob#.8a#a##DaY#D#D#D#Da9bjbl#D#Dbl#Dbl#D#DaY#DaY#D#M#DaYaYaYawaY#x#Ibna0aCbgb#bg.VaCbn#U#xaw.Raw#FaYblaYbl#D#p#Da9#Da9a9#Dafaj#Laf#Lajaf.7a9#Da9#sa9#D.Nbl.NaY.NaYaY#I.C.Wamaoaoaobga0aoa0aCam#vaBa##SaBaBaobgaoaoaC.Waqaoav.8ao.5aOaBazaX#4alaza##vaOam.5aC.Wa0.Wa0aob#.8bnaCaCaCaC.W.WaC.y.yaB#ubkbkaX.Oazae#vaO.5ao.pbga0a0a0#Ua0aCa0ao.CaCaCa0#IaCa0#IaYaw#D.sbl#s.N#s#Dbl#D#s#D#D#sbl#D#D#saYaw.saw.NaC#xaw#D#sa9.n.7a9aja9#La9aja9#L#L#L#L#L#L#L#L#L",
+"#Lbp#ga2bpa2#L#g#L#L#L#L#L#L#LafbjaYaY#xama0.5aO.N.NaY.s#D#D#Da9#Dbl#s#Dbl#Dbl#D#M#D#M#DaYblaw#D#MaY#I.R#U#x#U#Ub#b#bga0aCa0#x.R.Raw.RaYawaYblaw#p.n#pa9.na9#Da9aja9af.Eaf#Lafajafaja9#Da9#s#Daw#D#s#D#s.NaY.NaY#U#Ua0.paobgb#bgaO#vaB#u#u.y#ua5aObgaoamaoamaoavam.8.8#v#v#u.w.GaTbw.G.0#vaFaoamaoa0aoama0aqamaoamaCaqaC.W.W#I#Iaxbgaobg#va7.Oau.U#3#3a5#uaB#vaFaoaoa0amaCamaob#aoamaoaoa0aC#Ibn.sawaY.sbl#saY#s#D#s#DaY#saY#D#D#s#p#s#DawaY#Iaw.C#I.N.naf.Ea9.7aj#L#Laj#L#L#Laj#L#L#L#L#L#L#L#L",
+"a2#L#g#g#g#gbp#L#L#L#L#L.7#L.7#L.N.N.s#x#xao.5b#.NaY.N#D#D#D#D#D#M#D#Dbl#D#D#sbl#D#Dbl#Dbl.sblaY.NaY#x#I#x#U#UaC.Vbgb#bgaCaC#U#I.R#x.baY.RaYblaYa9#pa9#Da9#Da9bjaf#Laf#Laf#L#La9#La9a9a9.7#Da9#D#sa9a9a9#D.NaY.Na9#paY#Ua0aoaO.yaBaBazazan#u.Gbk.daOaO.8aoavao.8.8.8bd.yaL#uazaX#0#4#TaZaOaO.5aoa0.Camaoamaoamambcby.8.C.C.W.W.W#U.rbgaO#S.yaB#uaP#3.U#3arbk#u#vaFbgbgaob#aob#bgamaOaoaoaoaC#U#IawaY.sbl.s#D#Daw#DaY#s.N#M#D#s#D#s#D#M.NawaY.s#xaC.C#Ma9aj#L.7.naf#Laf#Lafaj#Laf#L#L#L#L#L#L#L#L",
+"#g#g#Lbp#Lbp#Lbpa2a2#L#L#L#L.7#L#D.N.NaYbo.C.C.W.Vbn.N#Dbjbj.E.7#D#D#D#D#s#D#D#D#D#s#D#s#D#D#D#sawawaYaw#x#U#xaCa0aCa0aC.Vamb#a0aYaw.RaY#M#p#M#pajafaj#pa9a9#Mbl.na9a9a9a9a9a9afajafaja9#D#s#D#Dbl#D#s#D#s#D.n#Dbl#saYaYaw#x#IaCaOaB#1a5.w.wbkaV.Qbt.ybcbc.8bcbcaBaB#u#uaz.waP#T.O#zbw.6aF#vaOaFambga0amamaOaoaOaoaCa0.WaC.W.C#I.WaCaoaOaoaOaobg#v#v#S#1.Q#3agaV#1aB.8aOamaoaCbg#v.8aoa0aC#x#U#Iawaw#D.s#D#s#D#s.N#saY#s#Daw#D#Mbl#saYaw#x#I#xaC#D#sbj#D#D.7#s.7.7.E#L.7#Laf#L#La2a2a2#ga2#g#g#g",
+"#gasbp#g#Lbp#Lbp#L#g#L#L#L.7af.7#D.NaYbf#x#x#x#xaCbn#I.N#Dbja9.7#D#D#D#D#D#D#D#D#D#D#D#D#D#s#D#DblawaYawbn#I.WbnaCa0.pa0aoa0aoam#UbnaYaYaYblblbl#paf#p.n#pa9bl#Da9a9a9aja9af.na9.7af.7a9a9a9#D#sa9#M#D#D#D#D#D#D#D#D#M.NaY#x#x#xa0am#vaB.z#u#Ebi#nbCaX.Q.y.y.QaXbka5#u#u.w.wbkaP.O#4#4.wa##v.5a#aoamambg.5aO.5a#aoamaC.WaC.W.W#IaCaC.WaCaoaoaoao.8bg.8#v#v#u#uaPagagaXbka5aBaBaB.y.z#S.8bgaoamaC#x#IaYaw#D#sbj#D.sbl.sbl.N#saY.s#D#MaYawaY#U#x#Ibj#s#Db.#Db.#Dbj.na9#La9aj.7#L#La2#ga2a2#g#gas#g",
+"#ga2#ga2#g#g.7bpa2a2#L#L#L#L.7#L#D#D.N#M.N#I#x#xa0a0#x.s.N.N#D#D#D#s#D#D#D#D#D#s#D#s#D#D#s#D#D#M#D#MblawaYaw#x#I#Ubn#Ua0.pa0.pa0aCbn#Ubnaw.Rawbl.n#p#p#pa9a9bl#Dafa9a9#pa9a9a9afajafaja9.7#D.n#D#Dbl#D#s#D.n#D#s#D#D#DaY#saYaw.N#UbnaCaOaO#vaBbkbq#Rbqag#3.U#zaVau#Tazazbkbkbv#3#E#0ab.2#uaOaF#vaFaOaOaFaObyaO.8aCaCaC.C.W.W#I.W.WaCaC.WaC.WaCaCaCaCaoao.8.8#v#vbbbbap#3.U.U.U#4a5#E#1#SaFaOaOaFaC.W#x#IaY.s#D#saY.s#xawawaY.saY.sbl.NaY.s#x#x#Ia9.7.E.7.E.7.n.7a9#L.E#L.7#L#L.7#L#L#L#L#ga2bpbp",
+"#g#g#L#gbp#g#Lbp#L#g#L#L#L#Laf.7#Da9#D#DaY.N.N.sbn#Ua0.C#x.N#s#D#D#D#D#D#s#D#D#Da9a9.na9a9a9a9#Dawbl#saYawaY#U#x#U#x#Ubn#Ibna0aCa0a0#UbnbnbnaY.Rbl.n#D#p.n#pa9bla9af.nafa9afa9a9#Laf#La9a9a9bja9a9a9.na9a9.7a9.7a9a9#s#D#DaY.Naw#xaw#xaCamaoaOaB.v.O.Obqadbx.abzbi.U#3#T#3bvagag#3#4#caT.w#vaF.y#v.5#vaOa#ao.5.5aC.CaC#I#I#I#Ibo#I#Iaw#Iawaw#I#U#7.W#IaC.WaCav.W.8#v#v.y.w.G#T#3.Oag.O.w#uaB.ya#aoamaC#x#I#x.N.s#xaw#I#x#Ibfaw.Nbl.s.Naw.NaY.saY.E.7af.Eaf.7#L.E.7aj.7#La9aj#Lafajafaja2#L#ga2#g",
+"#ga2#ga2#Lbp#Lbpa2a2#L#L#L#L.7#La9.7a9#D#D#DaY.NaY#xa0#U.CaYbl#D#D#D#D#D#D#D#D#Da9a9#Da9#sa9.na9#D#M#Dbl#saYawaYawaYaYawbn#Ibn#IbnaC#xbn#Ibna0bnblblbl#Dblbla9a9.na9a9a9a9.na9a9af#L#L.na9bja9#D.na9a9a9.n.7.n.7.Ea9.7a9#s#D#D#D#sblaw#IaCaobg.d.O#ia5.G#zadadadabadaVaVbq#3#3bvbqaba8.YbkaBaO#uaFaOaFao.5aoaqaC#I#I#Iaw#I.s.sawbobo.sbo.sbobo.s#M#M.s#7aw#Iaw#I#U#IaCao.8aO#v#u.Q#3biag#3aXazaZ#vaOam.C#x#I#IaY#I#x#I#I#x#I#xaw.Naw#D#s#D#s#Da9#Laj#L#Laj#Laj#L#La9#L.E#L#L.7#Laf#Laf.7#L#L#L#L",
+"a2a2#L#g#L#L#L#La2bp#L#L#L#L#L#L#L.7#La9.7#Da9#D#DaYbnama0#xaY#s#D#D#s#D#D#D#D#Daj#Lafajaf#La9a9.na9#M#D#MaY#MaYbl#MawaYaYaYaw#x.RaY.b#xbnbn#Ibnaw#xawbl#D#Ma9#pafa9afa9afa9afa9aj#Laf.7a9.n#Da9ajafa9aja9#L.7#Laf#L.E#L.7.Ea9#sblawaw#xaCaCaO.8aBazbka5.Gbk.U#3biad.a.a.DaVaVaV.M#d.S.Yaz#u.0.y#vaF.8a0.W.C#I.C#Iaw.Naw.s.s.s#s#s#s#s#s#s#s#s#s#s#s#s#M#s#s#s#s.n.n#M.raC#OaO#w#u#E.vbkazbkbkbk.w.yaOamaC.C.C#I#I#I#x#I#x#I#x#Ibf.s.N#s#D.7a9.E#L.E#L.E#L#L#L#L.7aj.7af#L#L#L#Laf.nafaj#L#L#Lbp",
+"#gaa#ga2#L#L#L#Lbpa2#L#L#L.7#L.7#Laf#L#L#La9.7#D#saY#xa0ama0aYaY#D#D#D#D#Da9#D#Daf.7aja9#L.n#Laj#p.n#p#Dbl#s#DaY#sbl#D#MawaYaYaY#Mblbl.baYawbnbnaYaYaYaYbl#D#pa9a9a9a9a9a9a9a9a9afafaja9a9bja9#Dafafajaf#L.Eaf.Ea2#Lafaja9a9#s#D#sawaw#IaC.WaoaoaO#uae#1#u#uaz#u.O.Ubi.D#d.D#J.D.abu#6.Y.G.w.yaZ.8aoam.W#xaw#I.saw.saw.s.s#s#sbj.Eb.#sb.b.#sb..E#s#s#s#s.s#s.E#s#s#s#s.r#U#IaCaCbd#1#SaOao.ya5bkaza5.waOamaoaC#x.WaC.W#I#x#I#x#I.Naw#D#D#s.7#L.7#Laj#L#Laj#Laj#Laja9#L.E.7.n.7.Ea9a9a9a9a9.7#Laf",
+"a2#g#L#g#L#L.7#La2#g#L#L#L#L#L#L#La2#Laf#Lbja9a9#DaY.C.VaFa0#xaw#D#D#D#D#D#D#D#Dajafaf#Laf#Lafaf#p.nbl.n#Dbl#M#D#Ma9#M#DaYaw#Dawbl#MaY#Mbn.RaYawbn#xaw#x#Mbla9.naf#paja9af.nafa9aja9#La9a9a9#s#Daja9#La9#Laf.7#L#Laj.n#L.7.n.7#s#Daw#x#I.CaC.8.8#v#v#v#vaO.z#1.z.Gbk.O#zbibBbBad.x#5#9.YaPaz.y.0bgaoam#Iaw.N#s#Dawaw.s#s#D#s#s#s.E.7.E.7.E.E.E.Eb..Eb..E.E.E.E.E.s.saw#IaC.WaC#Oam.d#vao.8aFaO.8.G#3.OaB.8amaCaCaC.Wa0#I#I#I#I#x.s.N#s#D.na9.n#Laj#L#Laj#Laj#Laj.7#L.7af#L#Laf#Lafa9a9.na9a9.7.7",
+"#L#L#L#L#L#L#L#L#La2bpa2#ga2bp#L#L#L#L#L.7a9.7.7.NaY#xbnao.VaF.V#xaY#Ma9.na9a9#D#La9aja9aja9aj.7.na9.na9.na9.na9#p#s#p#D.na9a9.n#p.nbla9#sbl#saYaYaYaYaYaYaYaYaY#pa9#p#pa9#pa9.nafafaja9#D#D.N.N.nafajafaja9ajafajaf.7.na9#D.n#D#Dawaw#I.W#IaCaCaobdaO#v#v.y.y.y#u.QaX.9#TbC#r#r.aatatbB.2aX.GanaC.W#Ibobf.sbf#I#s#s#s#sb.b.bj#s.7.E.E.E.7.Ea9.Eaj#Lajajajajajaj.s#s#I.s.s#I.s.WaCaCaCaCa0.W.W.W#v#vbtbkbk#uaB.0aObgaoaoamaC.C.W.n.na9.E.7.E.7#Lbjb..Ea9aj#L#La2a2.jbpaj#L.E.7bjajaf#La9#Laf#Laf",
+"#L#L#L#L#L#L#L#L#L#ga2a2bpa2a2a2#L#L#L#L#L.7#L.7#DaY#Ibnb#b#aOb##xaY#D#Da9.n.7#Dafajaf#Laf#Lafafa9aja9a9.na9.na9.na9.na9#p.na9a9afa9.n#p#D#M#DblaYawaYaw#xaw#xaY#p.na9a9a9a9#p#pafaf#pa9#D#s.N#sa9a9#La9#Laf#Laf.7aja9.n.7.n#Da9.saYaw#x#I#x.W.WaCao.8.8aObc#v.y#v#ubkbvbvaXbvbC.k.Dai.UaXbv.Ga7aOaoaNboaWbo.s.Nb.#sb.#D#s#sbjb.b.a9b.a9.E.7.Ebjajaja2aj#Laj.naj#D#s.sbo#I.sbo.saCaCaC#I#I#I.W#xavaoaO.y.z#1bkbkaBaBaO.5aoaoav.Wa9#s#L.E#L#L.7.E.7#D.7.E#L#L#Laja2bpa2#L#L#L#L.7af.7afajafaj#L#L",
+"a2#La2#ga2#ga2#ga2#L#ga2a2#g#L#g#L#L#L.7af.7a9.7#Daw#x#xam#SaZa#aC#xaYa9a9a9#Da9aja9#L.n#L.n#Lajafa9.naf.na9a9.na9a9.na9.na9a9.n.na9a9.na9#D#D#saY#x.R#xaYbn#x#xblblbl#Mblbl#Dbl.n#p.nbl#D#D.N.N.naf.nafaja9#L.n#L#La9.7.n#D#s#saYaw#I#I#I#U#Ia0.Wao.8aObc.8.y.y#u#ubk#3bCapbkag.kbqaX.Q.Qbka5#u#v#vamava1bob..E.na9b..E#s.7.E.E.7.E.7.E.7.E.7.naj#L.jaja2ajajaj.n#D.s#I.s#I.saY#I#U#x#I#x#x#Ibo#x#I.CaoaO#v.y#1bkbk#u#vbcam.C#I#sa9.n.7.E#L.E.7#s#s.7.n#Lajbpa2bp.jbp.j#Laj#L#Lajafajaf#La2afa2",
+"#ga2#ga2a2a2#g#La2#ga2#g#L#ga2a2#L#L#L#L.7.7#La9#D#D#xaCaF.0aZana0#xaYbla9.na9#D#Laf#Laf#Laf#La9af#L.na9af.nafa9ajaf#Laf#Lajaf#Lafajaf#L#D.n#D#DawaYaY#IaY#I#x#IaYawaYaYaYawaYawbl#Mbl#D#sbl.s#Da9.na9.7afajaf#Laf.Ea9.Ea9#sa9#s.N#I#x#I#x#Ia0#I.Wao.8.8aObc.ybba5bkaXaX#3bvag#n.c.#bt#baLbcbdaBaB.y#vam.Wbfb..7#s#s#s.7.E.E.E.7#s.E.E.7.n.7.E.7aj#g.ja2.jaja2#L.E.n#s.s.s#I.s.s#x#I#I#x.s#I.Nbo#x#I#I.CaoaoamaObkaz.Q.z#v.8.Wbf.N#s.N#s#D.sa9.E#D#D.E.7#L#Laj#Laj#g#L#g#L#gbp#L#L#L#L#L#La2bpa2",
+"a2bpa2bpa2bpa2a2#g#La2bpa2a2bpa2#L#L#La9#L.7a9.E.7aYaY.Cam#vaZaZaobn#xbla9a9a9#s#L.n#L.n#L.n#Lajaf#Laf.na9a9ajaf#L#Laj#Laf#L#Laj#L#L#Laj.7a9.7a9#D#Dbl.NaYaY#xaY#xaY#x#U#xbn#IbnblaY#MaY.NaY#s#D.na9aja9af.7af.E#Laja9a9b.#D#s#Daw#x#I#I#x#I.Wbn.Wa0aoao.5.8.y.QazaX#3.O#3aVai#n#8aLax#O.W.Wao.8#1aB.y.5.Ca1bo.sbo#D#sb.#D.E.7aj.7.E#D.E.7.E.7.7.ja2.j#gbp.jaj.j.7#s#s#s#s.N.s#Iawaw#D.saw.N.s.s#D.s#x.W.WaoaC.8.0.y#v#v#v.d.8ao#I#Ibf.s#Db.bj.7#Dbj#L#Laj#L#L#La2aj#gaj#ga2asasa2a2a2a2#La2a2#g",
+"#ga2a2a2#ga2a2#ga2a2#ga2a2#L#ga2#L#L#L#La9.7.7a9.7.N.s#xamaF#va#.5am#x.N#D.na9.7af#Laf#Laf#Lafa9#L.n#La9.naf#Laf#Lajaf#L#Laj#Lafa2ajaf#Laf.7.7.na9.n#D.nbl#D#DawaYawaY#U#x#U#x#UaYaw.Nblaw#D#D#sa9.na9.nafajaf#Lafaj.7.na9#sa9#saY#I#I#xaC#xao.CaCavaoao#v.yaI.Qae.O#zaV.Dah#Xag#b#O.r#7#7#7.W#QaObdaB.y#vaoaqbo#Ibobf.N.Ebj.E.7.E.E.7.E.7.E.7.Ebp.j#g#g.ja2#L.j.E.7#s.nb.#s#D.saw.Naw.s#D.s#s.N.s.sbo#I.C.Wam.8bgbgamao.C.8axbcaxaoaobo.N#s#Db.#s.7.E#L#L#L#Laj#L#g#La2#gas.jasbp.j#L#g.j#g#L#g",
+"a2asa2asa2aa#ga2#g#L#g#Lbpa2#L#L#L#L#L.7.7.n.7.7a9.saYaY.Wa0amam.5am#IaYbla9a9a9aja9aja9aja9ajaf#Laf#L.na9#L.n#Lajaf#L.jafa2a2.ja2a2#Laj#Laja9#L#Laf#Lafa9.n#D#DaY#xaYaYaYawaY#U#xbnawaY.Naw#D#sa9.na9af.na9.na9.Ea9.na9.E#D#s#D#I#x#I#x.WaCaoaoao.8.8.8.y#1#1.Q#T#3bq.D#m#haibkavao#7aE.sbo.W.W.s.Wbd.GazaBbc.8##avbobfbobjbjb..7.7.E.7.E.7.E.7#g.j#g.j#g.jaja2.Eaj.n#D.nb.#sb.#D#s#s#D#s#D#s#s.s.N.N#I#x.Wam.WaC#x#I#xaCa0av.8.8.8ao.W#Ibo#s#s#Dbj.7#Lajaj#L#Laj#gaj#g#gasasaU#g#g#ga2bp#ga2#g",
+"a2a2#ga2a2#ga2a2a2#ga2aja2bp.ja2#L.7#L#L.7a9.7a9bj.N.N.N#xa0a0aCaF.5bnaY#D.na9.7af#Laf#Laf#Laf#L.n#L.na9.naf#Laf#Laja2#La2aja2#La2aja2#Laf#L.E#L#Lajafaj#La9#L.nblblbl#MblaYaYawbn#U#x#xaw.N.s#D.nafa9.na9a9a9.na9aj.7#sa9#sa9#s#x#I#x.Wbnavamaoao.8aObd.ybt#ubbag.O#3bA.iaJ#3bbav.h#7b.b.boa1#IaE#I#QaB#uaPaz.Gbcbcavavbobfb.bj.E.7.E.7.7.E.7#L.j#g#g#gaj#g.jajaf.E.n#s#s#D.E#D#s#s#D.s#Db.aW#sbf.Nbo.C.Wav.Cam#Mblaw#x#Iaoaqaoaqavavaoav.s.Nb.#D#s.7.E#L#Laj#g#Lbpa2asas.jaUaU#ga2bpa2#g.jbpa2",
+"#ga2#g#g#ga2#g#ga2#g#g#ga2#g#Lbpa2#L#L#L#L#La9.Ea9a9#saY#I.C.Wam#x#U#x#IaY.N#D#Daj#Laj.7.7a9.7.7a9#Laf#L#L#L.n#Lafafafajafaf#Laj#L#L#Laj#Laf#Laf.jaf#Laf#Laja9#Da9.na9#Da9.n#D#DawaYawawaYaY#MaY.7.n.7.n.7.Ea9.7ajaf.Ea9#s#D#D#D#Ibn#UaCaoao.8#vao.d.d.y.z.y#1bbagaX#3aAbx.caLav#7#I.s#7b.#sb.b..sbo#Iav#QaOaKbtau.GaZaFaq#Ibf.s.7.n#L.E#L.7aja3.Ebp.jbpbpajbpa3#s#D#s#s#s#s#D#sa9.n#D#s#D#s#D#s#x#Iaw#I.N#s#s#D#saY#saYaY#I#I#I#I#U.W#IaC.8ao.C#sa9#L.7.n#L#L#L.ja2.j#gasasas.jas#g.jas#gas#gas",
+"a2#ga2#ga2#g#ga2#ga2a2bp#ga2bp#Lbpa2#L#Laja9.7#La9#D#D.N#x#x.C.CbnbnbnaYaY#D#D#D#L#La9aja9.7.E#D.nafajaf.Eafafaj#Lajaf#Lafajafaf#Lafajaf#L#Laj#L#La2afaj#La9a9.na9bja9.na9#D.na9awblaYawaYawaYawa9.na9.Ea9a9.na9ajaj#L.n#D#s#s.N#U#Ibn.WamaO.8#v#OaObdbd.yaLbb.Q#8.v#3aV.abCbd.8#7#7.sb..sb..sbj#s.s.s#I.Cav.8.8#u#uaB.ybcao.Wbf#D#s#D.7.E.7.Ea3ajbpajbpajbp#L.E#s#D#s#D#s#D#s#D.n.7#s#D#s#D.s.N#x#I.NaY.s.N#s#D#s#D#M.N.s#I#x#I#x#I#x#IaCbd.8ao#s#D#s#L.7aj#L#L.j#gas#g#g.j#gas.jas#gas#g.j#g#g",
+"#g#La2#ga2#ga2bpa2bpa2#L#L#L#g#La2aj#L#L.7.7a9.7.n#D#saY.s.N#x#I#x#xawaY#Ibl.N.Naf.E#La9.7#sa9#D.n#Laf#Laf#La9afaf#Lajaf#Lafaj#Laj#L#L#Lajaf#Laf.j#Laf#Laf#La9a9a9a9.n#Da9.na9#D#D#s.N#s#D#s.N#s#D.Ea9a9.Ea9.7.na9.na9#s#D.s.N#x#Ibnbn.Waobg.8.8.d.d#vbd#v.z#1bb.QaX#3aA.kaXbcao#7.s.sb.b.b.b.#s#s#D.s.N.s#x.CavaFam#v.y#u.ybyby#Ibf.s.Nb..7.E#L.7.E#L.7.E.7.E.7#s#s#D#s#D#s#D#s#D#s#D#s#D.s.N.s#x#IaYbo.s#D#saW.n.7#s#D#s.N.s.s#I#I#I.CaCax#vaO.saw#s#D.n#Lafaja2a2.j#gas#g#g#g#g#g.j#g#gas#g.j",
+"#ga2#ga2#g#L#ga2#ga2#g#L#g#L#L#L#g#L#L#L#L.n#L.7#D#D#D#DaYaY.N.NawaY#xaY#x.NaY#Ma9.7a9.Ea9#D#Da9a9af.7af.Eafaj#Lajafafafaj#Lafaf#Lafaj#Laf#Laj#La2af.j#Laf#La9.7a9.7a9.7a9#Da9a9#s#Dbl.saY#saY#s#D#s#D.na9.Ea9.7a9.n#D#s.N.s#xbobna0aCa0am.8aOaO.8#vbd#vbd.yaL#1.Qbk.Obi#R#8#v.rbo.saE#sb.#sbjb..7.E.n.E#s.s#I#xbo.Wavbc.y#u.yanaoaq.Cbo.N#D.E.7.E.7#L.E.7.E.7#s#D#s#D#s#D#s#D#D#s#s#s.N#s.Naw.N#x#xaw.N#s#D#sbj.n.7.E#DaE#saYboaCaCaoaoaoao#Oao#Iawaw#s#D.n.7a9aj#g#L#g.j#ga2#g.jas#gas.j#gasas",
+"a2bp.jbpa2#ga2bpa2bpa2#L#Lbp#L#L#La2#L.7#L.7a9.7#s#D#D#D#D#s.NaYaYaY.s#x.s#xaYaY#D#s#D#D#D#s#D#sa9ajaf#Laf#La9af#Lajaf#Lafajafaj#L#Lafaj#L#L#L#L#L.jafa2#Laja9a9.na9a9.na9.na9#s#D#D#s#D#s#D#s#D#sa9#sa9#Da9.n#D#s#D#D.saY#xaY#IamaCamaobgaObcbdaOax#vbd#v#v.yaL#1.Qa5#3#R.vbc.W#7#s.sb.b.bjb.bj.E.7.Ea9bj#s#Daw#s.Nbo.C.8#van#ubc#v.8a0bf.s#D#sbj.7bj.7#D.7#sbjawaY#saY#s#D#s#Daw#DaY.saY.NaY.saY.saY.N.s#D#s#D.Ea9#s#s.N.sboawao.8.d.daoaC#I#x.sawbo#M#D#Daj.7#L#L.jbpa2bpa2#g#g#g.j#gas#gas#g",
+"#ga2#ga2#g#L#g.ja2#g.jbpa2aj#Lbpaj#L#Laj#Laf.7af#D#D#s#D#D#D#D#D.N.saYaY#xaY#x#IaY.N#D#D#s#D#Da9#L.na9.na9ajafajaf#Lafajaf#Laf#Lafaj#L#Lajaf#L#La2a2a2#Laf#La9a9.7a9.7#Da9bja9a9.7#sa9#D#s#D#s#D#s#D#D#s#D#s#D#sa9#s.NawaY#I.C.WaF.8b#ao.8bg#vbd.8#vbd#vbd#v.d#v#1#1.wagbi#8ao#O.saE.sb.#sb.#s.Eaf.Ea9.E.n#D#s#Db.#s.N#Iaqambca#aB.y#vaO#I.Cbf#I#s#Db.#Db.#Dbj#saYawaw#D.saY#M.N#M.N#saY.s#x.s#x.s#x.s.N#s#Db.#D#Db..N.s.N#Ibo.W.CaoaxaoaxaCaC#I#x#I#I#Iaw#s#D.n#Laj#L#Lbp#L#L#L.j#ga2#g.ja2.j#g",
+"#L#g#L#g.j#ga2bp#g#L#g#L#Lbp#L#L#La2.7#L.7.Ea9.EaY#D#D#s#D#s#D#saYbl.NawaY#UbnbnawaYawbl#D#p.na9afa9.n#La9#La9#Lajaf#Lafajafajaf#L#Laf#L#L#La2.ja2#La2#L#Laf.7a9a9a9a9.na9.na9a9.7a9#s#D.n#D#s#D#s.N#sbj#D#D#s#DblaYaw#x#I.CaCamaOaF.8.8aO#vbdaO#v.d#vaO.8aObd#v.zaBa5.O#r.Q#O.Wbo.s.sb.aEbjb.bjb.a9.E.7.n#s#D#s#D#D.s.N#Ibf.W.C#v#va#aOaF.8aoam.s#D#s#D#s#D#s.saYawaYaYawblaYaw#DaYaYaYbl.N#x#xaY.saY.N#s.N#saWawaY#I#x#I#x#IaC.C.WamaCaC.W#I#I#I#x#I#I#I.s#sa9.E#L.E#Laja2bpa2a2.j#ga2#ga2#ga2",
+"aj#g.ja2#g#L#ga2#ga2#ga2bpa2#L#L#Lajaf.Eaf.7a9.7aY#s#D#D#D#Da9a9.saY.saYbn#x#xa0#I#x.NaY#M#Da9.na9aja9a9.nafajafafafajaf#Laf#Lafaj#Lajafaja2#L#La2.3#L.jaf#L.na9.7.n.7a9bja9#D.n.7#sa9.n#D#s#D#s#D#s#D#D#s#D#s#DawaY#Ibn#Ia0aoa0#v#vaOaFaObd#vax.ybc.d.8.8.8.8bd.y#1a5aX.v#1ao.W#7.saE.s#sb.#Db.#s.7.E#D#s#D#sa9#s#D#s#D#s#D.s.saFaFamaO.y#v#v.5#I#Iawbf.s#x.s#xawaYawaYblaw#DblaY#Mbl#saYaw#x#I#x.Naw.N#sbj#s#D#I.WaC.WaC.Wamao.8aoao.W#IaY.NaY.N.N.s#D.saw#s#D.n.Ea9aj#Laj#Laj#ga2#gas.j#g.j#g",
+"a2#ga2#ga2aj#L#L.ja2a2aj#L.E#Laj#pa9a9#pa9.n#pa9#M#Dbl#Dbl#MaYaYaYawaYaYawaY#UaYa0.p.VbnaYawa9#La9a9ajaf#L#Lafaj#L#L#Laj#Laj#L#Laf#L#L#L#L#La2#La2a2#La2#La2#L#L#L#L#L.Ea9.7#s#D#La9.E#D.na9.na9.n#s#D#saw.Naw#xaw#I#x#I#U.CaCaoao.VaoaoaO.8aO.8#Oaoaxao.haC#Oao.daO#uagbibk#vav.W#I#s.E.Eaj.Ea3aj.n#L.E.7.nb.#s.N.saY.N#I.N#IaY#I#I.C.8#v.yaBaPaBa#aFa#.5aqaqaN#xbfbf.N.NaY.Naw.NaYaY.Naw.NbfaYawaYaYaw#x#I#xa1#U#I#U#I#x#I.N.s#D#s#D#Dbj#sbj.E.7.Ea9.7.7#L.7.7.7.7.E.7#L.7#Lbpa2.jas#g#gas#gas",
+"a2.ja2#L.j#L#La2a2#g#L#Laf#L.7#La9#pa9a9#pa9#pa9bl#Dbl#sbl.NblawblaYblaY#xaYaY#Ubna0b##UbnaY.n.7#s#Da9.na9.n#Laf#Lajaf#Laf#Lafaj#Lajafaj#L#L#L.j#L.j#La2af#La9a9#L.7#L#La9.7a9#Da9.Ea9.n.7.n.7#s.na9#M#Daw#x.s#xawbn#I#U.CaCaCaCaobgaCaoaOaOax#vao.hao.W.W.Wav.haoax.y#E#zagapbc.Wbo.s#s.E.Ea3.E.7aja9.Ea9b.a9.EaY.Naw.Naw.Naw.N#I#x#Ia0amaF.yaBa7#u.ya#aoaqavaq#x.C#x#I.Naw.NaYaw#x#I#I#x.s#xboaYaY#I#x#I#x#IbfblaYbl.NaY#D.N.N#Dbj#sbj.Ebj.7bja9#L.E#Laj#Laj#L.E#L#L.7aj#La3ajas#g.jas.j#g.j#g",
+"a2#gas.ja2#L#Laja2#Laj#L#L#La9.7.na9a9#Da9#Da9a9#s#D#D#s#D#s#D#Dbl#sbl#D#M#DaYaYaY#Ubga0bnaY#s#D#s#Da9a9.na9ajafaj#Laj#Laj#L#Laf#L#L#Laf#L.j#L#La2a2#La2#Lafa9a9ajafaja9a9#s#D#s#Da9.n#D#sbl#s#D#M#s#D#Maw.N#I#I#I#I#x#I#IaC.CaC.paCaCaoao#O.8ao.h.W.W.W.W.W.W.W#I#Q#v.w.Obiagbk.W.r#I#sb..E.E.Eaja9.E.n.7.n#D.saY.saY.Naw.NaY.Naw.N.s#xaCaq.8aF#Sa7a7#u.yaFam.5ao.Ca0.C#x#x#x#Ibn.R#x#x#xaY#xaY#Ibn#UaC.W#xbf.sbl#s#D#sa9.Ea9.7.E.7.7#L#L#Laj#Laj#L#L#L#L#L#L#Lbpajbp#Lbpbp#Lbp#g#gas#g#gas#gas",
+"a2.ja2#La2aja2#L#L#Laf#L.Ea9aja9a9a9a9.na9a9.na9#D.n#Da9#Da9a9.na9a9#sa9#D#D#D#saY#xaCa0#U#x.N#s#D#D.na9a9.n#La9#L.n#Laf#Laf#Lajafaj#Laj#Laf#L#Lafajafafaj#L.Ea9#La9a9.n#D#D#D#D#D#s.Nbl#D#s.N#M#D#M#D.saYawaw#IaY#I#U#I#x#IaC.WaC.CaC#IaCavao.W.Wav.W.Wbo#I.W.Wbo.W#Q.y.w.Uau#3bd.8bo.s#s#sbjb.a9.E.n.7b.#sbj#s.Naw.Naw.NaY.saY#s#s#D#I#x#Ia0aoaFa#aBaBaBa##va#aoa0aoa0aoa0aC.Ca0#xaCbn#I#xaw#xa0aCa0#x.Caw.N.Na9a9a9a9.7a9.Ebj#L#Laj#L.E#L.7#L#L#Laj#L#Laj#Lajbp#L#Lbpajbpaj#Las.j#g.jas#g.j#g",
+"a2a2a2.ja2#Laf#Lajaf#Laja9a9.7a9a9.na9a9a9a9a9a9.7a9.7.n.7.7a9.7.7#L.7a9#s#D#D#D#D#Mbnbn#x#xaY.N.s#D#D#sa9a9#Laj#L#L#Laj#Laj#L#L#Laf#Lafaj#Laj#La2a2afajafafa9a9a9.na9#Da9#s#D#D#MaYblawaYawaYbl.s.Naw#D.saYawawawaw.s#I#I.C.W.W#U#I#I#x.WaC.W.W.W#I#Ibo#xbo#I#Ibo.Wavbc.y#u.G#3.Qbc.Wbfaw.s#sbj.n.7.n.7#s#D.s#D.saY.NaY.N#M.NaYb.#D#s#Daw#Ia0#UaFaOamam.5.8.yaB.8aO.5ao.5amam.8amaCa0a0#x.C#I#Iaoam#I#xaY#D.N#Da9.7.7.7a9.7.7.7aj#L#L#L#L#Lajbp#Lbp#L#Laj#L#L#L#Lajbpaj#L#Lbp#L.j#gas#gas#gas#g",
+"a2a2.j#La2#L#L#Laf#Lafa9a9a9#D#D.7#Laf#L#Lajafaj.7aj#L#L#L#Laj.7aj#Laj#Lbj.7.7b.a9#D#D#xaCa0.W.NaYaw#D#Da9.na9af#Lafajaf#Laf#Lafaj#Laj#L#L#Laf#L.3ajaf#La9aj.7a9a9a9a9a9bl#DblaY#DaY.NawaYblawaY.NaYaw.sbl#s#Maw.N.saw#x#I#I#I.C#I#x#I#I.W#Ibo#Ibo.Wbf#Ibo#Ibfbo#Ibo.W.8#Qbc.ybkbv.Q.8#I.s.s#s#sb..nbj#s.N#sbj#saY.Naw.saY.NaY.s#D#s.Nbo.N#I#I#xaCamao.Ca0b#aobyaOaF#v#vaB.y.ya#aOaF.5aCa0aC.CaCbn#xaY#D#D#D.7#D#Laj#L#Laj#L.7#L#Laj#L#Lajbp#Laj#L#gaja2bpa2bp#g.jas#gas#gas.j#gas#g#g#g.j#g.j#g",
+"a2.ja2#L.j#Lajafajafa9a9a9#Da9.n#L#L.7#L#L#L.7#Laf#L#L#Laf#Laf#L#L#L#Laj#Laj.7.7#L.n#DaY#x.W.C.C.s.NaY#s#D#Da9#s#Laj#L#Laj#Laj#Laf#Laf#Lajafaj#Laja2afajafafa9.na9#pa9#M#Dbl#DaYaYaYawaY#xaYaYaYaw.Naw#D#sbl#s#M#s#saY.s.s#x#I#I#Iawawawbo.N.s#I.s.s.sbo.N.s.s#I#I#x#Ia1.Wao#vaLbkap.yaobo.N.N.s.7#s#sbj#s#D.sbjaY.saY.Nbl.saY.N.s.N.s.N.N#I#x.sbfbf.C.WaCaqamaq.5aoa##v.0#u#u#ua##vaOaFama0#x#xaYaY#D#Da9.7#L.Eaf#Lafaj#Lbpbp#Lbpa2bp.jbpa2#L#ga2aj#g#L.jbp.j#L#g#g.j#g.j#gas#g.j#g.jas#gas#gas",
+"a2#L.ja2a2#L#L#Lafafa9.na9a9a9#D.7#L#Laj.7#L#L#L#L#Laj#L#Laj#Lajbpaj#Lbp#L.7.7bj#L.7#DaY#xa0.C.WaYaw.N#D#D#D#sa9aj#L.Eafajaf#Laf#Laj#Laj#L#L#L#L.3#L#Laf.7#La9a9a9a9#p#Dblbl.NblawaYaYaYaYawaYawaY.NaY.sbl#sa9.n#D#D#saw.s#I#I#xaw#x.saY.s.s.N.s.N.s.Naw#D.s.N.sbn#I#Iboa1#b.d.8#Tap.Qbcbo#D#sbo.nb.#D#s.Nb.#D.s.Naw.Naw.NaY.Naw.Nbf.s.N.sbfaY.N.saY.sbf.C.Waqavbga#a#a#.yaZ.0anaBbm#vaOaobn#I#xblaY#Ma9a9af#La2#L#L#Lbp#Lbpaj#L#g.ja2bpa2aj#gaja2#g#L#g#L#g#L#g.j#gas#gas#g.j#gas#gas.j#g#g.j#g",
+"as.j#g#La2aj#Laja9ajaf#L#L.n#Laf#Laj#L#L#La2#ga2#ga2a2a2#ga2a2#g#L#Lbpaj#Laj#Laj#D.s#DblaY.VaObm.C#IaYaw#D#s#D#Dbl#Ma9a9af.7aj#Lajaf#Laf#Lajafaj#Lajafaj#Laj#L#Lajafa9a9.7#sa9#DaYaYaYaYaY#xaY#x.N#s#D#s#D#s#Db..n#sbj.n#D.sbfbo.s.s.N.s.N.s.s.N#s#D#s#D.s.N#Ibf.s#Ibo#I.Wav.8bcbta5.U#3aB.5.W.N#x#I#x.saY.s.N.N.s#D#Ma9b..E.7.nbfaw.NaY#xaY#Ibf#D#s.N.N#x.Waqavb#ambga#aO.0.y.yaoaCa0#x#xaY.N#D.Ebj.7.7.7.7.7.7#ga2#ga2#ga2#g#ga2#ga2aj#g#g#L#g#g#L.jbp#Lajbp#L#g.jas.jas#gas.j#ga2#ga2#g.jas#g",
+".ja2#Laj#L#L.7.7af#Lafajaf#Laf#Lbpa2#La2#L#L#Lbp.ja2#g#ga2#ga2#g#L#L#L#L#L#L#L#L.7#D.NaYaYaobmaZamaCbn#x.NaY.N.N#Mbla9.nafajaf.7a9#Laj#Lajaf#L#Laf#L#L#Laf#Lafaja9af.7.n#Da9bja9#xawaYaYawaYaYaw#Dbl#s#D#D#s.7.n.7b..nbj#sbj.s.saw.s#D#saw#D.s#D#s#s.s.N.sbfawbf#Ibf.sbo#Iav.8bc#uaz#3bi.G#vaq.W#I#x#I#x#x#x.s#DaY#s#D#s#D#s#Db.aY.saY.N#I#I#x#x#I#x#I.C.WaqamamaFaObm#vaBaZ#va#bna0#xaYaw#D#D#Dbj.7.7.7.7.7.7.7#g.ja2#g.j#ga2bpa2a2a2#g#La2#L#g.j#g#gajbpbp#Lbp.j#gas#g#g.j#gas#g.j#g.ja2a2#ga2",
+"#L#L#L#L#L.na9.n#Lafajaf#L#L.ja2#L#Lbp#Laj#g#L#L#gbp.j#L#gaj#ga2aj#g#Lbpajbp#Laj.7#D#sblaYb#aOa7b#amaoa0aC#x.baYbl#Mbla9#D#L.na9aj#Laf#L#Laj#Laj#Lajafaj#L#Laj#Lafajaf.7a9a9#Da9#Dblblblblblblbl#D#s#D#D.n.7.E.7.E.7.7.E#s#s#D.s.N.s#Db.#D#s#D#sbj#s#D#s.N.sbfboaYbo#Ibf.Wavbcbc.wa5au.M#3.w#v.5#Ibn#I#IaY.s.N.N#saY#s#D.s#D.s.NawaYawaY#I.C#Ibn.Wa0amamao.5.8.5#uanaB.ya#aoama0awaYaY.NaY#D#D#D#L#L#Lbp#L#L#L#Laj#gbpa2bpa2.j#g.j#L.j#L.jbp#g#Las#ga2#ga2aj#L#L#g.j#g.j#ga2#g.ja2#ga2#g#Laj#Laj",
+"#D.na9#sa9#Da9#Daj#L#L#Lajaf#L#L#g.ja2#g#g#g.j#ga2a2#g#ga2#ga2bp#ga2#ga2#ga2#g#g#Lb.a9aY#UambmaZaO.t#SaFb#a0a0#UblaY#s#D.na9.7.n.7aj#Lajaf#Laf#Laf#L#Lafaj#Laf#L#Laf.7af.7.n.7#D#M#D#D#D#D#D#D#s#D#Da9#sa9.Ea9aj.7.E.E.7.7b.#sbj.s#s#D#s.N#saW#s.N#s.Nb..N.Nbo.N#xbo#x#I.Wav.8.yaz#T#3#z#z.O#uaF.CaC.C#x#I.Naw#D.sbl.saY.s.Nbo#Ibn#U#x#Ua0#Ua0aCb#am.8a##va#aBan#u#u.0aFama0#xaY.NaY#D#s#D.7.7.7#Lbpaj#Lbpajbp#Lbp#L#L#L#Lbp#L#L#L#L#Lbp#L#Lajbpas.ja2.j#ga2bp#Laja2#L#La2aja2#L#L#L#Laj#L#Laj#L",
+"a9a9a9a9a9.na9a9#Lafajaf#L#La2a2aj#g#ga2#L#g#L#g.j#g#g.j#g#g.j#ga2#gaj#ga2#ga2#g#L#L#L#s#xb#aOa#.t#SaZaBbmbga0bnawaYblbl#Da9.n.7#Laf#L#Laj#Laj#L#Lajaf#L#L#Laj#Lajafajaf#La9a9a9#D#D.na9a9.na9a9a9.na9.7a9.E#L.Eafaj.7.E.7.nbj#s#Db.#Dbj#sbj#sbj#sbj#D#s.N.s.N#x.W#xbo#xavambcbb.O.O#a#a.Oba#3aBamaoa0.W#x.s.N#saY#saY#I#x#I#x#IaCa0aoamaob#aoamaF#v#vaB.0aB.0#ua#a#.5ao#xaY.Nbl#sbl#Da9.7.n.7.7aj#L#L#L#L#La2#Laj#Laj#L#g#L#L#Laj#Laj#L#L#Lbp#L.j#g#L#L#Laj.7#L#Laj#Laj#Laj#Laj.7aja9#La9aja9a9",
+"#Da9#s#L.n#L#L#Laj#L#L#g#L.jbpa2#ga2#g.j#gas#gas#g#g#g#g.j#g#gas.j#g#g#g#g.jas#g#gaj#L#D#xaOaZan.FbmaBaZbmaFb##UaYblawaY#s#Da9.7.n#Laj#Laf#Lafajaf#L#Lajafajaf#L.3#Laf#La9aj.7a9#Ma9a9#Da9#Da9#Da9#D#La9aj.7aj#L.E#Laj.7.Ebj.nb.#s#D#sbj#s.N#s#D.s#D#sbj.N.sbf.s.C.Wa0.Wam.8.ybb#a.O.GaPaz.M#C.faOaoaq.W#xaw#D.s#D#I.N#I#xaCamaoaFaO#vaO#S.y#S#v#v#S#va#aOaFaOaFamaoa0#xaY#D#sa9#D#Da9.7.7#L#L#La2#L#g#L#g#Lajbp#L#Lbp#Laj#Laj#L#Laf#L#Laj#Lajbp#L#Laj#L.n.7a9#sa9.n.7.nbj.nbj.na9a9a9.na9#Da9a9",
+".7#L#L#L#L#Laja2#L.jbp.j#L#g#L.j#g#g#gasas.jas#g.jas.jasasas.jas#gas.jasas#gas#gasbp#L.7awam.yan.Fbm.TaZaBaFam.R#IaYawbl.N#s#D#D#Lajaf#Laj#L#L#L#Lajaf#L#L#L#Laj#L.jafajafafafaja9#Da9a9a9a9a9.n#Lajaf.E#L#Laj.7.j#Laj#L.E.7.E#D#saW#D#sbj#sbj#Db.#DaE#D.sbf#IbfaCaq.Waoao#v.y.wbkaz.w.waz#3biau#uaOamao#xboaw.N.s#x#I#xaCambgbg#uaBa7#ua7an#ubh#vaFaOama0aCa0a0a0bn#UaY#sa9af#L#sa9.7a9aj#Lbpaj#g#L.j#gaj#g#L#Laj#Laj#L#L#Lbp#L.E#L.E#L#L#L.7#L.n.7a9#D#D.N.s.Na9#s#Da9#sa9#D.n#D#D#s#D#D#s#D.7",
+"aj.7aj#gaj#gas.ja2bpa2#L#gaja2bpas.jas#gas#g.jasasasasas.jasaU.j#gas#gas#gas#gas#g.ja2#LaYa0.0aZ.Fa#aBaZa#aFbn#UaYaY.N#MaY#D#D#Daj#L#Laf#Lafajafajaf#L#Lajafaj#L.3#La2af#L.Eaf.7a9a9.n.7a9.n.7a9af#Laf#Lafaj#L#L.j#g.E#L.E.7#s.Ebj#s#sbj#D.s#Db..N#s#D.s.sbf.s#Iaqa0ao.C.8#vbbaPbk#u.w.Q.w.wau#N.Q.yavam#I#x.sawaY#I#IaCaoaoaO#vaz.Gaz.GazaS#uanaoaCa0.Wa0.CaC.CawaY#Da9a9#La9aja9a9.7aj#L#L#Lbpaja2bpa2bpa2#Laj#L#L#L#L#Laj#Laj#La9#L.7.7.E.7.E#D#D.N.s.N.s.N#x.7.7.n.7a9#sa9#D#s#D#D#D#D.7#D#D",
+"#g#g.j#g#g#g.j#g#g.j#g.j#g#g#g.j#g#gas#gas#gas#g.jasasasas#gasasas#gas.jas#g.jas#g#g#ga2a9.C#SbhaFbgamam.8amaCa0aYaYaY#Da9.E#Laja9#Laj#Laj#L#L#L#L#Lajaf#L#Laf#Laja2ajaf#Lafa9a9.na9a9a9a9.7a9a9af.n#Lajaf.7#L.E#Lbpaj#g.n.7#s.N.s#DaY.saY.Naw#x.saYbo#x#x#I#x#I.8amaob##v#u.G.2bkaz#ubbaP.w.G.2.u.Oa#aoav#Ibfboawbo#xaoamaBan.Gba#a#ua#ao.5#Qaq.W#x#x#x#I#x#xaY#xawaYbl#D#M#Da9a9a9a9a9.7a9a9a9#L#Lajaf#Lajaf#La9.n#D#saY.NaYaY.N#sbl#D#MaY#M#D#D.n#Da9#D#D#D.n#Laj#L#L.E#Laj#L.7aj#Laj#Laj#Laj",
+"#g.j#gas.j#gas.j#ga2a2#ga2.jas#gas.j#g.jas#g.jas#g#g.j#gas#gas#g.jas#gas#gasas#g#g#La2.j.7bnaF#ub#b#amb#ama0bn.CaY#M.N#sa9.na9#Lajaf#Laf#Lafajafaj#Laf#Laj#Laj#La2afafaj#L#La9.7a9.7a9.7a9a9a9.7afafafa9#L.n#L.7ajaja2.j.7.E#D.N#Daw.Naw.N#I#x#x#I#x#I#x#IaC.CaC.5bg.8aO.0.w#T.2.G#u.ybbbb#u.GaX.e#z#SaoaC.s.W.W#I#Iaoam#v#u.G#TarazbmaoamavaN.C#x#xawaY#x#IaY.saY#Daw#D#Da9a9a9#sa9.na9a9.na9.na9a9a9#sa9#Da9#sa9a9a9#D#Mbl.NawblblaY#MaYaYaYaw#D#D#s#D#D.n#D#D.n#La9ajaf#Laf#Laj#L#L#L#L#L#L#L",
+"#g#g#g#gas#g#g#ga2.j#g.j#gas#g.j#g#gasas#g.jas#g.jas#gas.jas#gasas#gas#gas#g#gasa2aj#g#La9aYa0bmbgambgama0.C#x#xawaY.N#Da9.7#L#Laf#Laj#Laj#Laf#L#Lafaj#Laf#Laf#Laja2#Lafaf#L.na9.na9a9a9.Ea9a9.7ajafajaf#L.7#L.7bp.Ebp.Eaj.7#s.Naw.Naw.Naw#x#I.N#I#x#I.C.Wa0aoamao.5ao#vaBazal#3aB#vaF.y.yaB#u.wa6#z.w.8.C.Wam.CaoamaO#v#uaz.G.GaBaFama0#xawbfa1aY.NaY.NaYaY.NaY.N#D#D#D#Da9a9a9a9.7#D.n#D.7a9a9#D#s#D#D#D#s#D#Da9.na9a9#D#Daw.N#D#s#D#D#D#s#D#D.7.7.7.7.E.7.7.7#L#Laj#L#Laj#L#L#Laj#Lajbpaj#Lbp",
+"as.jas.j#g.jas.ja2#ga2as#g.j#gas.j#g#g.jas#g#gas#g.j#g#gas#gas#gas.j#gas.jasas.j#ga2#gaj#LaY#Uamb#ama0a0aCbn#Ibn.Nblaw#Da9aja9aj#Laj#L#Laf#L#Lafaj#L#Laj#L#Laj#L.3aj.3#L#L#La9.7a9a9.7a9a9.7a9a9afa9#La9aj#L.n#L.E.7aj#L.E#D.sbfaw#M.NaY.s#x#IaY.C.W.C.W.Caqaqao.5aoaF#v#uaz#T.o#vaO.8.8bcbcaB#ualbaa5#vaoa0avaoaF#vbm#uaz#u#uaZa0am#x#M.N.N.N.N#D.Naw.N#s#D#D#D#D#sa9#Da9.n#L#L.na9a9.7a9a9.7#s#D#D#Da9#Da9#D#s#Laf.7a9.n#Da9a9#L.7#L.7aj.7#L#Laj#Laj#L#L#Laj#L.j#L#La2#La2#La2ajbp#Lbpa2#L#ga2",
+"#g#g#g#gas#g#gas.j#g.j#g#gas#ga2#gas.j#g#g.jas.j#gas#g.jas#gas#gas#gas#gas#gas#gaa.j#g#L#LbjaY#Ua0aCa0a0#xbn#xawbl.N#D#Da9.7#L#Laf#Lafaj#Laj#L#Laf#Laf#Lafajaf#L#La2#Lajaf#La9a9.n.7a9a9a9a9a9#Lafafajafaf.7#L.7#L.7#Laja9#saY#IaY.saY.saY#I#x.s.C#xaC#x.Caoaqamao.8a##v#u.Ga5azaOaOaoao.8#v.ya5ba#z.w#vao.Wam#vaB#uaB#uaZa#aF.5#xawaYbla9.E#D#sa9#sa9#D.7.7a9#s.7a9.7.7#L#L#L#L#L#Lajaf#L#Lajafa9.7.na9a9.7a9a9.7aj#L.7#L.E#Lajafajaf#Laf#Lajaf#L#L#L#Laj#L#L#L#La2aj#gaj#gaj#g#La2.jbp.jbp.jbp",
+"as.jas#g.jas.j#ga2as#gas.j#g.j#g.j#gas#ga2#g#gas#g.jas#gas#gas.j#gas#gas#gas#gas#g#ga2bp#L.na9bla0bnbn#UaYawaYaYaYbl#Da9.n.7afaj#Laj#L#L#L#Lafaj#Laj#Laj#L#L#L#L.ja2a2a2af#L.n.7a9a9a9a9.7.n.7a9afaf#Lafaj.7af.E#Laj#L.Ea9aw#x#IaY.saY.NawbfaY#x#I#x#I.C#I.C.Wa0.8am#v.0#u.G.w#uaO#v.8#Q.8bdbb.Q.K#z#u#vaFaoaBa7a7#u#SaFaoamaCbnaYaY#Da9aja9a9bj.7a9.7a9.Ea9.7.7af.7#L#Laj#L#La2ajafaf#L#Lafafafaj#Laf#Lajaf#L#La9#L#Laj#La2a2a2#ga2.j#g.ja2a2#gaj#gaj#g#La2bp.j#g.j#ga2#ga2#g#g#g.j#g#g#ga2a2#g",
+"#g#g#g.jas#g#gas.j#g.jas#gas#ga2as.j#g.j#g.jas#ga2#g#g.jas#gasasas.jas#g.jas#g.jasaa#g#Lbp.7afajbn.RaYaYaYaYaYaYbl.N#D#D.7#L#L#Laf#Lafaj#L#L#L#Laf#Laf#L#La2#L.3#La2#L#L#Lafa9a9.n.7a9.7a9a9a9.7afaf#Laf#La9aj.7.7.7aja9#saw#x#I.N#saY#I.NaY.s#I#x#I#x#I#xaC.CaoamaO.yaB.waz#uaZ.8bc.8.8#Q.y.Q.w#4#4.wa##vaB.Qaz#vaFama0#x#x.N.s.N#D#sa9.7a9.E#D.E#L.7aj.7#Laja9aj.7#L#L#La2.ja2af#Lajafajafaj#Lafafajaf#Lafajaf#L#L#La2a2.j#ga2.jas#gas#g.jas#gasa2#g.j#g.j#g#g#g#g#g.j#g.jas.ja2#gas.ja2.j#g#g",
+"as.jas#g#gas.j#ga2as#g#gas.j#g.j#g#g#ga2a2#g#g.j#g.jas#gas.jas#g#gas#gasas#gasasa2#g.jbp#LajafafaYbnaYaYblaYaY#MaY#D#sa9a9.7#L#L#Laj#L#La2afa2#L#L#Laja2#Laf#L#La2.j#L.3aj#La9.7a9a9a9a9.n.7a9a9afaj#La9aj#L.7#L#D.na9#s.naw#x#Ibl.Naw.Naw.NaY#xawaYaw#x#I#xaC#I.8aO.yan.w.G.w#vb#by.8.8bc.ybb.Qay.Y.G#u#1a5.GaBamamaobn.s#Da9.7aY#Da9.7a9.7.7#Da9aj.7af.7af.7#L.7afaj#La2a2a2.j#Laf#Laf#Laf#Laf#La2#La2#La2a2a2.7.j#La2#gaa.jasas#gas.jasasas.j#g.j#gas#gas#gas.jas.j#gas#g#gas#ga2.j#ga2#ga2a2",
+"a2#ga2.jas#gasas#gas.j#g#g#gas#g.ja2a2a2.ja2a2#ga2#ga2.jas#gas#gas#gas.j#gas#gas#g.j#ga2bp#L#Laj#L.naY.R#xaYaY#D#Dbl#D.7#saf.7.n#L#L#L#L#Laj#L#Laja9#La9aj#L#L#La2a2a2.j#L#Lajafa9#sa9.7a9a9a9.E#Lafafajafa9.na9aj.na9#s#D.N#IaY#s.sbl.s#D#s#D#s.N#I#x.W.Cavam.5.8aF.0azal#T.w.0.8#v.8byaKbbaIaP#aba#N.O.GazaB.5#xaw.N.NaY#D#D#s.7.n.7#L#La9.7a9#L.7af.E#L.E#L#L#L#L#La2#La2bpa2#L#Laj#La2#L#Laja2aja2#ga2.jbpa2as#gas#gas#gas#g.j#g.j#g#g.j#gas#ga2.j#g.j#g.j#g#ga2#g#ga2.j#ga2a2#g#ga2#g.j#g#g",
+"#g.j#g#g#g.j#gas.j#g#gas.j#g.j#ga2a2#ga2#g.ja2a2#g.jas#g#gas#gasas.j#gas#gas.j#gasasas#g.j#g#Lbp#La9#Dbl.RaYaY#D#D#Da9#D.7a9.7#L#L#Lbp#L#Lbp#L#L#L#L#L#g#La2a2#Las.ja2a2#Laf#L.7a9.7.na9a9.7a9a9af#L#La9#Lafaja9.na9.n#D.s.s#x#I.Nbl.s#D#M#DaY.saY#I#xaC.Caqao.5bgaO#uaz.G.G#u.y#x.W.8#v#v.y.0.ybabaay.f#uaB.8a0bfaYaY.N.N#D#D#Da9.7.7af.7.7af.E.7aj.7#La9#L.n#L#L.jaf#L#gaja2#L#La2#Lafaj#La2#L#g#g#L#g#L#ga2#g#gas#gas.jas#gasasas#gas#gas#g#g.j#g#gas#ga2as#g#ga2#g#L#gbpa2bp.j#L#gajbpa2bpa2",
+"a2a2#g.jas#gas#g#gas.j#g#gas#g#g.ja2a2.ja2a2a2.jas#gas#gas#g.jas#gasas#gas#gasas#g#g#ga2#g#L#La2#La9a9#DaYbl#Dbl#Da9#Da9a9.7#L#La2#g.j#g#ga2#ga2.j#ga2.j#g#g#g#ga2a2#g#La2aj#L#L.n#Da9a9.na9a9.7#Lajafajaf.7a9.naf.na9aE.N#I#Ibn.saY.Naw.NaY.saY#x#I#x.Wa0ao.5.8aoaO#u.G.Gaz#ua##IaCaCaobg#va7azaH#zaz#uaFam#x#xaw.N.N#D#D.n#D.7.E#L#L#Laj#L#L#Laf.7#L#L.E#L#L#L#L#La2#La2#L#gaja2#L#La2#L#L#La2a2#g.j#ga2#g#L.jas#g.jas#gas#gas#g#g.j#gas.j#g.j#ga2.jas.j#g.j#g.j#ga2.j#ga2#g#L#g#gaja2bp.j#L#g",
+"a2#g.jas#g#g.jas.j#gasa2#g.j#g.ja2a2#ga2#La2a2#g.jas#gas.jas#gas#gas#gas#gas#gasas.j#ga2#gaj#Lbp.j#La9a9#D#Dbl#Dbl#D.7a9.7.7af.7a2a2a2a2a2a2.ja2bpaj#Lbp#Lbpa2#L.j#g#La2#L.7#L.7a9a9a9.7a9.7a9.n#Lafaf.7afafaja9.na9.n#D#s#I#x#IaY.sawaY.saYaw.N#I#x#I.C.W.5av.5bgaOaB.G.O.G.y.5aO.8bgaFaB.Gau#N#zaz.0aFa0#x.NaY.N.N#D.n#D.7.7a9#L#La9#L.7#L.7#L.E#L#L#L#Laf.7#L#La2#L.jbpa2#La2#La2#Lajafa2#L.j#L#g#L#gaja2#g#g#gasasas#gasasas.jasasas#gas#gasa2.j#g#gas#gas#g#ga2bpa2bpaja2aj#ga2#L#g#La2bpa2",
+"a2#ga2#g.jas#g#g#gas.j#ga2a2as#ga2aja2.j#g.j#La2#g#g.j#gas#g.j#g.jas#g.jas#g.jas#gas#ga2#g#La2#L#L#g#La2a9a9#D#D#Da9#Da9.7a9#L.7a2.j#g.ja2aja2#L#L#g#ga2.j#L.j#g#La2#Laj#L#La9.7.na9.na9a9a9a9a9#L#Lajafaja9a9.naf.n#s#s.N#I#x#U#I#x#x#I#x#I#x#I#x#I#x.Wamao.5.8ao#v#u.Garaz#ua#.y.0#u#u#aau#3alaza#b##I#xaw#D#sa9#s.7a9.7a9aj#L#La2aj#L#Laf#La2#L#La9aj.7#L#Laja2#L#g#La2#L#g#Laj#L#La2#L#La2#L#ga2#ga2#g#g#L#gas#g#gas#gasasasas#g#g.jasas.j#g#gas#g.j#g.j#ga2.jbpa2bpa2bpa2bp.jbp.jbp.jbp.jbp",
+".j#g.ja2#g.j#ga2.j#ga2.j#g.j#g.ja2#ga2a2a2a2a2#g.j#gas#g.j#gas#gas#gasas#gas#gasa2.j#gaj#g#Lbp#La2#La2#L#La9#Dblbl#Da9bja9#L.7#L#L#Laf#L#L#Laf#Laj#L#L.7#L#L#L#L#L#L#L#L#La9#L.7a9#Da9a9.7a9.Ea9#Lafaf#Lafa9.na9.na9.E#D#s#x#I#I#I#I#x#I#x#I#x#I#x#I#x.WaC.5.8.8.5aBa5#a#TaPaPbk.U#3al#3#T.G.w.0aFaC#x#x.N#D#Dbj#Dbj.7.7aj#L#L#La2#L#La2#La2aj#L.7#L#L#L#L#Laf#Lbp.j#La2bpa2aja2#La2af#L#Laja2#L#g.jbpa2bpa2#g.j#gas.jasas.j#gas#gasasas#g#gas#ga2.jas#ga2#g.j#g#L#gaja2aj#gaja2bpa2#L#L#L#g#La2",
+"a2#ga2#ga2a2#g.j#ga2#ga2a2#g#g#g.j#L.j#L.j#La2a2#gas.j#gas#g.jas#g.j#g.j#g.j#gas.j#ga2a2#gaj#L#L.ja2#g.j#g#L#Dbl#Da9a9a9.7a9.7a9a9a9a9a9a9#sa9#Da9a9.na9a9a9#Laf#Laj#L.7a9.E.7a9.n.7.n#Da9a9a9a9#Lajaf.Eaf.na9.naf#Ma9.s.s#I#x#I#x#I#x#I#x#I#x#I#x#I.CaCaq.8am#vaO#u.G.Uay#3#3bv.M#C.O#u.y.5am.C#UaYaYaw.N#D.7.7.7.7aj.7#L#Laj#ga2#ga2a2.ja2a2a2ajaf.7#L.7aj.7#La2a2bpa2aja2bpa2#L#Laja2#La2#L#ga2bpa2.j#g#ga2#gas#gas#gasasas.jas#g.j#gas.j#g.j#ga2a2.ja2a2#gas.j#L#g#L#g#L#gaj#Laj#L.j#La2aj#g",
+"#g.j#g.j#g.ja2a2#ga2.j#g.j#g.j#ga2a2a2a2#g.ja2#g.j#gas.j#gas#gas#gas#gas#gas#g#ga2#g.j#L#g#La2bp#La2#gas#g#La9bl#D#Da9bja9.7.n.7a9b.#D#s#D#D#D#s#p.nbl#p.na9a9a9#L.7#L#L#La9.7.7a9#Da9.na9.n.7a9#Laf#Laf#Lafa9.na9.n.E#s.N.s#x#U#I#x#x#I#x#x#I#x#I#xaC.Wa0.8.8.8.yaB#T#4beaM.Y#T.fa7#uaOa0bf.s.N#Mbl#s#D#D.s#DaW.E#L#L#Laj#L#g#ga2a2.ja2a2a2aja2.7#Laj#Laf#L#L#L#L#ga2#L#g#La2#L#La2#L#L#L#La2aj#ga2#g#g#ga2#ga2as#gas#gas#g#gas#gasas.j#g#gas#g#g.ja2#g#g.ja2.j#L#g#L.jbp.j#La2aj#L#Lbpaj#g#L#g",
+"a2a2a2#La2a2.j#ga2.ja2a2a2a2#ga2#ga2#ga2a2a2#ga2asaa#ga2#ga2#L.j#La2#L#Lajafa2#L.ja2#ga2#La2#L#L#L#Laf#Laj#L#L#La9bl#Da9blaYaYaYblbl#DaYaYawaYaYblblblblblblbla9#Da9#D#sa9#Da9#D.na9.7a9.7a9a9.n#Laf.Eaf.Eaf.naf.na9#M#D#saY.saw.N#s#s#D#s#s#D#s.C#I#I.C#Iao.5#v#u.OaVadbi#3#1aBbdaO.W.C#IaYbf.N#D#s.7#L#L#Laj#L#Lbp#Lbpbpa2bpa2.j#g#g#Lbp#Lbp#L#L#L.7.7.E#L.7#La2a2a2.ja2#ga2.ja2#L.3a2a2#g#g#g#L#ga2#ga2#g#ga2#ga2#ga2.j#ga2#g#gas#gas#g.jas.ja2#g#L.j#L#g#g#L.ja2a2#L#L#L.7#L#L#L#La2#L#Laj#L",
+"a2a2.j#L.j#La2a2a2a2a2a2#ga2a2a2.ja2a2.ja2#ga2a2asa2asa2.j#L#g#La2#L.jaf.3#L#La2aa#ga2a2#L#Laj#Lafaj#L#L#Lbpaj#La9#D#p#Dbl#DaYaYbl#DblaYaw#xaYaYbl#Dbl#Dbl#Dbl#Da9#sa9#D.7#D.7#D.7a9a9a9a9a9.7a9.n#Laf#Laf#La9a9.n#s#D#M#DawaY#I#s#D#s#s#D#s#D#sbf#Ibf#I#Ia0bc.y.G#zad#4aXbk#v.8bgao.C#x.N#x.N.s.7bj#L.7aj#Lbp#Lajbp.j#L#gaj#g#L#gbpa2bp#L#La2#L#L#L#Laf#La9#L#L.j#ga2#ga2a2a2a2a2#La2aj#L#g#L#ga2#g#ga2#ga2#ga2#g#ga2#g#ga2bpa2as.j#g#g.j#ga2#g#L#Laj#Laj#Laj#L#gaja2ajafaj#L.Eafaj#L#Lajaf#L#L",
+"a2#La2a2a2.j#ga2.j#L.j#ga2a2#ga2#ga2#ga2#ga2a2asa2.jasa2#ga2#La2#La2#L#L#Laf.j#L.j#L.jafaj#Laf#Lafafaf.7#L#L#Lbpa9#pa9#D#Dbl.sbl#D#MblaYaYaYaYawbl#D#M#Dbl#D#Mblbja9bja9#D.n#Da9.na9.7a9.7a9.na9#Laf.Eaf.Ea9.n.n#D#M#saYaw#IaY#IaY.s#D#s#D#s#D#s#I#x#I#I.Cao.y#1#T#rbq.G#u.yaOaCamaC#xawaY.s.N.N.7aj#Lbp#Lbpa2#ga2#Lbp#L#g#L#g#L#ga2#gaja2bp#Lbp#Laj.7aj.7aja9#L#L#L#L#L#Laj#L#L#L.j#La2#ga2#g#g#L#ga2#g#g#ga2#g#ga2#g#ga2#g.j#g#gas#g.jasa2.j#gaj#L#Laj#L#Laj#La2a2a2#L#L#La9#Lajaf#Lajaf#Laj#L",
+"a2.ja2.ja2a2a2#ga2a2#ga2a2#g.ja2a2a2a2a2a2.ja2a2asas#ga2a2#L.j#La2aja2a2a2#Laf#Lafa2af#Laf#Lafajaf.E#Laj#L#Lbpa2a9.na9#Da9a9#D#Dblbl#DaYaYaYaYaY#Dbl#Dbla9#D#D#Da9#Da9#Da9bja9bja9.7a9a9.na9#Da9#D.na9a9a9a9#D#sbl#saYaw.s#x#I#I.saw.saY.s.Naw.N.s.s#IaCaoao#u.G#z.UaX#uaOaOao.W#x#IaY.N.N.N#D#D#L.7#Laj#La2#ga2#gbpa2bp.jbpa2bp.ja2#g#L#Laj#L#La9.7a9.7a9.7.7a9#L#L#Laj#L#L#La2af#La2#L#L#g#L#ga2#g#ga2#ga2#g#ga2#g#ga2bpa2bpa2#g.ja2#ga2#g.ja2#Laj#Laj#Laj#L#La2.j#Lajafaj#L.E#L#Laf#L#L#Laf#L",
+"a2bpa2#La2.j#ga2aja2a2a2.ja2#ga2#g.j#ga2#ga2#ga2a2aa#ga2#ga2bpa2#La2afaja2afa2#Lajafajafajafa9a9af#Laf#L#L#L#Lbpafa9a9a9a9a9#D#D#Dbl#DblawaYaYaY#D#Dbl#D#Dbl#D#Da9b.a9.7a9#Da9#Da9.na9.7#D.na9.na9a9#D.n#D#s#D#M.NawaY#I#x#I#Ia0#IaY#Iaw.Nawbo#x.s#x#I.WaF.yaz#3.a#4a5#v#vaoaC#IaYaY.saYaw#D#sbj#Laj#Lbp#L.j#g.jbpa2aj#g#L#g#L#g#g#L#g#L#g#Lbp#L.na9a9.na9a9.na9#Lajaf#L#L#L#Laj#Lafa2#L#g#L#g#g#L#ga2#g#ga2#ga2#ga2#ga2.j#ga2#g.jas#g.j#g.j#ga2aj#L#Laj#L#Laj#Laj#La2#L#Laf.7af#Laj#Lajafaj#L#L",
+"a2.ja2.j#L#ga2a2a2#ga2#ga2#ga2a2a2a2a2a2a2a2.ja2as.jasa2.j#La2#La2#La2a2#La2afajafafafafaf#pa9.n#Laf#L#L#L#L#g#Lafa9a9a9a9a9a9a9a9#DblaY#DaYawaY#D#M#D#D#M#Da9#Da9#Da9bja9.7#s.7a9.7a9.na9a9.7#D#s#D#s#D#Dbl#s.N#M.Naw#I#I#IaC.W#I#xbo#xbo.N#IaYbo.W.Wa0#vaz.Y#.aVapaOaO#O#I#I#xawbl.N#D#D.7a9.E#L#L#L#gaj#g#g#ga2bp#gbpa2bp.j#La2#g.j#L#La2#Lbpa9.7#D#D#s#Da9#D#L#L#L#L#L#L#L#L#L#La2#L.j#Lbpa2#ga2#g#g#L#ga2#g#g#ga2#gbp#g#L#g#g#g#ga2a2#g.ja2aj#Laj#L#Laj#Laja2#Lajafaj#Laj.7aj#Laf#L#L#Laf#L",
+"a2#La2#ga2.ja2#ga2.ja2a2a2a2#g.j#ga2#g.j#ga2#ga2#gaa#ga2#ga2aja2#L.j#La2#L.jafaf.3ajaf.n#p.n#pa9afajaf#L.7#L#L#L#L#La9a9#D.7a9#Da9a9bl#DblaYaYaY#D#D#D#D#D#D#D#Da9bja9a9.7#Da9#Da9a9a9#Da9#sa9a9#D#D#D#D#s#D#saYaw#I#x#IaC#x.WaC#I#I#x#I#x#I#I#xa1ao#Q.8.w#4.P.4#u#Sao.WaCa0bobfbl#s#D.na9#L.7#L#Lajbpa2a2#g.jasbpa2#L#g#g#L#gbp#ga2#g#Lajbp#Laja9a9#M#Dbl#D.na9.7a9.7a9.Ea9a9.7af.jaf#La2#L#L#g.j#ga2#ga2#g#L#ga2#ga2bpa2a2.j#g.j#g.j#g.ja2#g.j#Laj#Laj#L#Laj#L#Lajaf#L#Laf.7af#Laj#Lajafaj#Laj",
+"a2.j#L.j#La2#L.ja2a2#ga2#g.ja2a2a2a2a2a2a2a2a2a2asa2asa2a2a2bpa2af#La2afa2#L#Lajaf#pafafa9#p.n#p.7af#L#L#Laj#Lbpaf#La9.7a9a9bja9a9#D#Dbl#DaYaYaY#D#D#D#Da9#Da9#D#sa9a9bja9a9bja9.Ea9.7a9.Ea9a9a9#s#D#s#D#Dbl.s#Daw#x#IaC.WaCaCao.Wav#Ia1#I.Ca1#I.Cav.8aO.G#dbs#BaLaB.8aC#I.WaYbf#sbl#Da9a9.n#L.E#L#L.jbp.j#gasasa2bp.j#L#ga2bpa2#g#L#g#L#g#L#L#La9#Da9bl#s#p#Da9.7a9.E.7a9.7.7.n#Laf#L#L#gaj#L#g#ga2#g#gbp.j#ga2#g#ga2#g.jbp#gbpas#ga2#ga2#g.ja2.E#Laj#L#Laja2#Laja2aj#Laj#L.E#L.Eafajaf#L#Laf#L",
+"#L#L#L#L#La2bpa2#Laj#L#La2bpa2bp.L.L.jasaa#ga2#gaja2a2a2a2#La2#La2a2#L.j#La2afa2.3aj#p#Mbl#D#D.7ajaf#Laj#L#Lbp#Laj#Laf.n.7a9a9.7#pa9#p.NaYaYbl#Dbl#D#Da9#Da9.7a9a9a9a9afa9.7a9.7#Dbl#Dbl#D#D#D#D#xaYaYawaYaYaY#Ubn#I#I#I.Wao#v#vaC#I#x.W#Ibo.C.WavaoaZ.o.Yab#3.QaOaoaC.W#I#x.s.Nbl#sa9a9aj#La9#L#L#g#L#ga2#g#L.j#g#g#g#ga2bp#ga2.ja2#L#Laf#La9.7bl#DblblaYaYaYaYaj#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2#ga2a2a2#g#La2#La2#g#La2a2#L#L.ja2.ja2.j#L#Laj#L#L#Laj#Laj#Laj.3#Lafajaf#Lajafa9.na9a9.na9.na9",
+"#L#Laj#L#Laj#La2bp#L#gaj#L#L#Lajaa.jaaaaa2#ga2bp.3#L#L#La2#L.j#La2a2a2#La2#La2#L.3af#pblbl#Da9a9afaja2#La2#La2#L#Laf#L.7a9a9bja9a9#p#DblaYaw.Nbl#Dbl#Dbl#D#D.7a9a9afa9a9a9a9aj.7bl#D#D#sbl#Dbl#MaYawaY#xaY#xawaY#x#U#x#I.Cao.8aBaxav.W.C.Waoao.8aO#vaPay#daVbk.0#OaoaC.W#x#I.N.N#Dbl.na9a9#L.7aj#g.j#ga2bpa2#g#gasas#g.j#g#ga2#g#La2.ja2#Laja9a9a9a9bl#DaYawaYaY#La9.Eaf#L#Laj#L#L#Laj#L#L#L#L#Lbpa2#L#g#La2#g#L#gaja2#ga2#ga2#La2a2a2#La2a2.3#L.jaf.jaf.j#L.3#Laj.3aja2#Laj.3#Laja9af.n#L#Laf#L",
+"a9ajafaf#L#L#L#L#L#L#L#L#L#L#L#Laa#ga2#g.j#gbp#La2#L.ja2#La2#La2a2#La2a2a2#L.j#L.jaf.n#pbl#sa9.Eaf#Lafaj#Laj#L#Lajaf#La9a9bja9a9#Ma9bl#DaYaYbl#DaYbl#Dbl#Da9a9a9a9#p.naf.7a9.7a9.n#Da9#D#D#s#D#DaYblaY#MaY#MaYaY#MaYaw#I#IaC.8aObgaoaoao.8ambc#v#uar.M#d#4.G.y.8bgaoaC#x#I.N.N#s#pa9a9.7ajaf#L#La2bpa2.j#g#gaj#g#g#gas#ga2#g#L#La2a2#Laf#Laf#La9a9a9a9#D#Dbl.Nbl.E#L.7#L.7af.7#La9#L.7#L#L#L#L#La2#ga2#ga2#g#La2#L#ga2#L#g#L#Laj#L#Laj#Laj#Laj#Laf#L#La2afaj#Lajaf#Lajaf#Laj#Laja9afajaf#Lajafaj",
+"afaf#Lafajafajafajaf.Eaf#Laj#L#L#La2#L#L#gbpa2bp#La2#L.3#L.jafa2#La2a2#La2a2#L.3afaf#p#Mbla9a9.7afajaf#L#L#L#g#L#La9aja9a9#Da9.7#pbl#DaYaYaYbl#DaYblaY#Dbl#D#D#Dafa9afa9a9a9.7.7.7#Da9bja9#D#D#s#D#D#saYbl.NblaY#M#D.saw#I.WaOaB#vaO#v.8aOaO#v.y#3ad.Z#.#T#vav.haoaC#x#IaY.s#D#D.n#Dajaf.7#Laj#L#ga2#g#gbpa2#ga2a2as#ga2#ga2bp#La2a2a2a2a2#L#L#La9afa9#M#DblawaY#L.7af.E#Laj#L#L#Lajaf#L#L#L#L#Lbpa2#L#g#La2#gaja2#L#ga2#g#La2a2aj#L#L#L#L#Laf#L#Laj#Laj#L#Laf#Laj#L.7aj#L.Eaf.7.na9#D.n#Da9#Da9",
+"a9.na9a9a9a9#pa9a9a9a9a9a9a9a9.nafaj#L#L#L#Lbp#La2aja2#La2#La2a2#La2a2a2a2a2#La2aj#p#pbla9a9#Lajaf#Lafajafaj#L#Lajaf#La9.7.nbj#Da9blaYaY#x.N#DblaYblaY#DaY#Dbl#Da9a9a9a9.7a9.7.7a9.7.E.7.7.7.7a9#D#D#D#D#s#D#s#D.sbl#s.s#xaoaO#S.yaBaB#u#u#ubk#E#.ab#4#3.G.y.8bo#U#I#x.s.N#D#s#Da9#L.7aj#L#La2bp.jbpa2#La2#g#L#g.jas#g#ga2#Laja2#L.j#La2af#L#L#La9.7a9bj#Daw.Nbl.E#L.7#La9#L.7#L.7#L.7#L#L#L#L#La2#ga2a2#ga2#L#g#La2bpa2#La2bp#L#Laf#L#Lafaj.7ajaf#Laf#L#Laj#Laja9.na9.7afa9.Ea9a9a9a9a9a9.na9a9",
+"a9a9a9a9a9a9a9.n#paf#paf#p.n#p#pbl#D.na9a9#L#L#L#La2#La2#La2#La2a2a2a2#La2#La2afa9#p#M#pa9.nafa2afajaf#L#Lbp#L#L#Laf#La9a9#Da9a9#D#DaY#x#xaYaY#DblaYblaY#Dbl#Dblafa9afa9#Da9.7a9#L.7a9#Laf.7.n.7a9a9#s#D#D#D#D#D#s#D.s#x#I.8#Saz#u#u#uaZ.w.GbiaV#4.U#3ara5#vao.W#x#IaYaw#D#sa9a9#L.n#Laf#L#gaj#L#ga2#g.ja2#g.j#gas#gas#gaja2bp#La2a2a2a2#L#Laf#L#L#La9a9#Dbl.NaY.7#L.n#L.E#L#Lafaj#L#L#L#L#L#L#Lbpa2#L#g#L#ga2#ga2#ga2a2#gaja2#L#L#L#Laj.7#La9#L#L#Lajafaj#Laf#L.n.7a9.Ea9.Ea9.n#D#s#D#s#D#D#s#D",
+"a9.n#pa9.n#pa9#pa9.n#p.n#p#p#p.nblblbla9.na9#Laf#Lafa2aj.3#L.j#La2#La2#La2aja2#La9.nblbl#pa9#L.j#Laf#Laja2#La2aj#L#Laja9a9.7#D#s#p#DaY#x#x#xaY#DblblaYaYbl.Nbl#D#Dbl#D#Da9#Dbj#D.7#L.7#L.7af.7#L.7.na9a9.na9a9.n.NaYbobfaoaFaBazaz.w#uaP#3#4ad#4ap.O.O.O.w#S.8.5#Uaw#x.saY#s#D.n.7#L#Laja2aj#gas#L#gbp#gbpa2bpa2#gas.j#g#g#L#La2#La2#La2#L#L#L#L.7#L.7.7.E#D#s#D.na9#L.7af#L.7#L.7#La9#L#L#L#L#La2#ga2a2#ga2#L#g#La2bpa2#ga2#ga2.7a9.7#La9.7.7a9ajaf#L#Laf.7.na9#D.Ea9.7a9.7a9b.#D#D#D#D#D#D#D#D",
+".n#pa9#paf#p.n#p.n#p#p#p#p#p.n#p.b.R#Mbl#p.nafajafaja2#La2#L.3#La2a2aja2#L.3#L.ja9#pbl#Mbl.nafa2afajaf#La2#Lbp#L#Laf#La9.n#D#s#DblaYaY#xbn#xaY#DblaYblaYblaY#Dbla9bla9#D#D#D#Dbja9#La9#La9.7.7a9.7a9.7.7.7.E.7#D.N.sbf.Wam.y#uaz.Oar.Gal.Mbxadalbkbkbkbkbka7.yaF#I#IaY#s#Da9#s#Daj#Laj#L#g#L#g#g#gaja2a2a2#ga2#gas#gas#ga2#g#gaja2a2a2af#Laf#La9#Lajaf.7a9#D#s#Da9.Ea9.E#L.E#Laj#L#L#L#L#L#L#L#L#L#g#L#g#La2#ga2#ga2#ga2#L#g#La2#L#L#L.7#Laf#La9#L.E.7.7.Ea9.n.7.n.7a9.7.n.7.na9#D#D#s#D#s#D#s#D",
+"#Lafaj#L.7#L#L#Lafafajafaja9#pa9aYawaYaYawblblblafafaf#Laf#L#L#L.jaaafa2#L#Lafaf.n#F#M#pa9afaj.7#Lbp#Lbpbpaj#L.Eaf#Laj#D#D.N#D.N.naYaYbna0a0bnaY#DblaY#x#xaYaYblbl#D#Da9a9.7#L#L.7.7.7.7.7.7.E.7#Dbj#D.s.N.N#DboaY#MaY.W.8aZal#P#PaT#P#.a.ad.ObkaX.G.O#Taz#SaoaC#x#x#I.N.s#D.E.7af.7#L.E#L.Eaf#Laj#g#gbp.jbpa2aj#ga2#g#L#ga2#ga2#L#L#L#L#L#L#L#L.7#L.7a9.E#Da9#D.Ea9.7a9.7a9#La9#L.7aj#L#L#L#L#L#L#L#L#L#Lbpa2#L#L#g#L#ga2a2#ga2bpa2#La2#L#Laj#L#Laf#Laj#L.7#L.7af.7.E#L.7#L.7#L#sa9.7a9.7#L.7#L",
+".E.7.7#La9aj.7#Lafajafafafa9a9.nblbl#MaYblbl#Dblafajafaj#L.E#L#Laaa2a2aja2afajaf#p#p#pa9.naf.7#L#gaj#Lajbp.7#L.7ajafa9#D#D.NaY#xblaY#x#xama0a0aY#p#Dbl#xbnaYblaY#Dbl#Da9a9.7af.7.7.7.7.7.7.7.7.7#D#s#D.N.N.N.N.N#IaY.N#Iamanay.P.PaDaD#..M.O.G#u#u.w.GaP#u.ybgaCaC#x#IaY.N#s.7a9.7aja9#La9#L.E#L#L#ga2a2#ga2#ga2#g#L#ga2#ga2#g#g.7#L.7#L.7#L.7.7af#L#L#La9#Db.#Da9.7a9.Eaf.7a9.7#L#L#L#L#L#L#L#L#L#L#L#L#La2#L#L#ga2a2#g#L#g#La2#ga2#g#L#ga2#La2#L.7#L.7a9aja9#L.E#La9aja9#L.n#L.na9aj#Laja9aj.7",
+"#L#Lafaj#L#Laf#Lajafaf.Eaf#sa9a9a9a9#pbl.nbl.n#p.nafa9#Laf.7#L#L#L.ja2#La2af#L.n#p#Mbla9a9aja9#Laj#Lbp#L#L#L.7.7#D#D#saYaw.N#xbf#MaYaw#xbna0a0aYblaYaY#xbn#xaYaYbl#D#D#Da9#D.7#L.7.7.7.7.7.7.7bj#s.7#D#s#D.N.sbfa0#UaoaO.yan.2.g#m.AbA#4ar#u.0#u#S#vaBaB#uaB#v.5aoamaC#x#IaY.N.na9.7.E#L.7af#L#La2#g#L#g#L#gbp#ga2#ga2#g#g#ga2#g#L#L#L#L#L#L#L#L#L.E#L.7.7a9#Da9.Ea9.7a9.7.7#L#L#L.7#L#L#L#L#L#L#L#L#L#L#Lbpa2#La2bpa2a2#ga2#ga2#L#ga2a2a2#g#La2#Laj#L#L#L#L#L#La9#L.7#L.7aj.7#La9.7#La9.7#La9#L",
+"#L#L.7#L.7#L.7#Lafaf#Laf#La9a9.na9#Da9.n#Da9#D#Dafaf#Lafaja9aj#La2a2af#Laf#Laja9#p#D#p.na9.7aj#L#L#L#L#Laj.7.7b.#D#saY.NaYbf#x#x#DaYaYaY#xbna0#xaYaYaY#xaYaYaYaY#Dblbl#D#Da9.7.7a9.7.7.7.7.7a9.7af.7#D.N.s.N#x#IaF.8amaF.0#uaybe#.ba#aaz#ua##vaOaOaO#v#v.y#uaBa#b#bga0a0awaYbl#D.Ea9a9a9.E.7a9.7#Laj#L#gaja2a2a2#ga2#g#ga2#ga2#g#L#L#L#L#L#L#L#L#L#L#L#La9.Ea9.7.7.n.7.n#La9.n.7af#L#L#L#L#L#L#L#L#L#L#L#La2bp#La2#ga2#g#La2bpa2#ga2#L#g#L#ga2#g#L#L#Laf.7#L.7#L#L#Laj#L#L#Laf#L.7#L.E#L.n#L.E#L",
+"#L#Laj#L#L#Laj#L#L#Laj#L.7.7a9.7a9a9a9#Da9a9.na9.naf.Eaf#L.7#La9ajaf#Lajaf#La9a9#M#pbla9a9#L#L.7aj#Laj#Lbjbj#sbjaY.N.Naw.N.Nawbf#DblaYaYaY#xbn.CbnaYaYaYaY#xaYa0bl#D#D#Da9#D.7#L.7#La9#La9#L.7.7a9#sblaYaYbnaCa0.5amaFaB#u#a#4abarazaBa#aO.5ao.5aoaoamaOaB#u#uaZaCa0bn#xaYaY#Dbla9a9.na9a9a9#La9#La2a2#L#g#g#L#g#g#ga2#ga2#g#ga2#ga2a2#ga2a2#La2#L#L#Laf.7.7.7a9a9.7a9.7.7.7#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#g#La2bpa2#ga2a2bpa2#ga2a2#g#La2#L#L.7#Laj#L#Laj.7af.7#La9#L.7ajaf.7#L#L#L.7af#L",
+"#L.7af.7#La9#L.7a2#L#L.7#L.n.7.na9a9.na9a9a9a9a9afaf#Laf#Laf.E#Lafajafaf#La9.na9#D#p#sa9.n.7aj#L.7#L.7a9.Ea9#Da9.NawaY.N.NaY.N.N#D#D#D#MaY#x#xa0ama0#xbnaYaYbn.CaYaYaY#D#D#D#D#Da9a9a9a9.7#Da9#s#D.NaY#x.Ca0amamaFaB.f.Oau#aazan#v#vaFam.5aCav.CavaoaoamaOaB#uan.Ca0#xawaY.s#D#s#Dbja9bja9.7a9a9a2#La2#La2a2a2a2#ga2#ga2#g#ga2#ga2#ga2a2#ga2#ga2#L#L#L.7a9.7a9.7.Ea9.Ea9.7af.7af#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2a2#ga2#ga2#L#ga2#g#La2bpa2a2bp#L#L#L#L.7#L.7af#L#L#L#Laj#L#L#L#Laj#L#La9aj.7#L",
+"#L#L#L#Laj#L#L#Lajaf#Laja9.7.7a9.7a9a9a9a9.na9a9aja9#Laja9#L.7#Laf#Lafaja9a9#D#D.nblbla9b.#L.7.E.7.n.7.n#D#D#s#D#D#D#D#s#D#D.n#D#D#D#s#Dblawa0.Cama0a0aYaY#xa0amblaY#D.N#D#Dbj#Dbj#D#D#D#D#D#D#D.N#x#x#xbg#vbmaBbk#a#Ea7a7aZ#va#amb#ao.C.W.Cbf#IaqaoaoaoaO#SaZ#ubn#I#xaY.Na9a9.7a9a9a9a9a9a9a9a9#Lajaf#L#L#L#La2a2#g#g#ga2#ga2#ga2a2#ga2a2#ga2a2#L#L#L#L.7.Ea9.7a9.7a9#La9#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#g#L#g#La2bpa2#g#La2#ga2#ga2#ga2#L#L#Lajaf#L#L#L.E#L.7#L.7#L.7#L.7af.7aj.7af.7#L",
+".E.7.n#L.7#L.7af#L#L#L.7aj.7a9.Ea9a9a9.7a9a9.7a9afafafafaja9aj.7afaja9#La9a9#s#D#p#M#D#s#D.n.E.7a9.na9#D#sa9#D#D#D#s#D#D#Da9a9.n.N#D#D#Dbl#xa0ama0ambnaYaYbnama0aYaYaY.N#D#D#Dbj#D#D#D#D#s#D#Daw.C#I.Caobm.G#faG.yaBbh.l.taFb#.5a0a0aoa0#xbo#xboaqavaoamaC#Sa7an#I#x.N.s#Dbjaj#L.n#Da9#sa9a9a9a9#Laf#L#Laf#Laf#L#ga2#ga2#ga2#g#g#ga2#ga2#ga2a2#g#L#L#La9.7a9.7.7.7.n.7.7.7#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2#ga2a2#ga2#ga2a2#g#L#g#La2bpa2#L#L#L#L.7#L.7#L#Lafaj#L#Lafaj#L#L#L#La9#L.7aj#L",
+"#L#L#L#Lajafaj#Laf#Lafaf#Lafajaf#L.jafajaf#Laja9aj#Laj#L#L#L#Laj.7.7.E#Laj#L.7.7bl.NawaY.NaY.N.s#s#D#sa9bj.Ea9.Ea9.na9.n#D#s#D#Da9.n#D#D.saY.s#x.R.Rbn#x#x#xaY.NbnaYblbl.na9.7.7#D.N.N.N.Nbfbfbfavama#aSaG#z.G.0aoa0aC#xaCbn.Wbn#I#xaY#I#x#x#I#x#Ia0avao#v.0aBa7#IaYa9.7.E.7#D#Da9a9a9a9.7a9.7afa2a2a2a2a2#g#ga2#ga2#g#ga2#g#ga2#ga2#g#ga2#g#ga2a2#g#L#L#L.7a9.7.na9a9afaj#La2a2#L#Laf#L#L#La2#L#L#La2#La2#La2#La2#L#L#L#L#L#L#La2a2a2a2#g#ga2#g#La2#La2#Lajafa2.7#L.7af.7#L.7afaj#L#Lajafafaf#L",
+"#Lafajaf#L#Laf#Lajafaj#L#Laf#Laf#Laf#Lafajaf#Da9.7a9.7.7af.Eaf.7.na9a9a9.7.7.n.7awaYawaYaw.s.N#D#Da9#D.na9.7a9.7.n.7.7.7#D#D.7.7#Da9#s#D.N#x.N#x#Ua0a0bna0bn#IaYb#am#xaY.N.N.N.Nbj#D.N#I#xaqaoa0a0a#a7#fa6az.0.5bnaCbnbn#x#x#x#xaYboaYbfaw.NaY#I#x#Iao.8.5#v#u.T#I.N#sbja9bj.7bj#sa9.Ea9a9.7a9a9#L.ja2a2.j#ga2#g.j#ga2#g#ga2#ga2#g#ga2#g#ga2#g#g#ga2#L#L#La9aja9a9af.7af#L#L#L#gafa2#La2afa2#La2.3#La2#La2#La2#La2#La2a2a2a2a2#La2a2#L#g#La2bpa2bpa2#ga2#L#La2#L#L#L#L#Laj#L#L#La2a2afafaj#Lajaf",
+"#L#L#L#L#L#Laj.7af#Laf#Lajaf.Eafajaf#Lafa9a9.n#D#D.n#Da9#s#D#D#D#D#s#D#s#D#D#D#sbl#s#D.s#D#s#D#s.7aj.7#L.7aj.7#L.7af.Ea9#L.7a9.7.na9#D#D#D.NaY#xa0.Vaoamama0ambna#b#amambn#x.C.Cawbf#xa0amamaF#v#vaBazaSa7a#aq.W#x#x.s#xaw#xaw#x.N.NaY#xaY#x#I.N#I#xavam.8.yana7#U#x#D.7b..7a9#Da9a9a9a9.7a9af.7a2#La2#L#ga2#g#g#ga2#ga2#g#ga2#ga2#g#ga2#g#ga2#ga2#L#L#L#L.7a9.7a9a9a9#La2#La2a2#L#Lafa2#La2#La2#L#L#La2#La2#La2#La2#L#L#L#La2#La2a2a2a2#g#ga2#g#La2bpa2a2#Laj#L#L#L#L.7#L.7#L.7af#L#Laf#Laf#L#L",
+".7#L#Laj#L#La9#La9a9a9a9a9a9a9a9af#L#D.n#D.7#D.7#D#D.N.s.N.N.N.sbl.NblaYblaYawaY#M#D#Ma9#D.nbj.7#L#L#Laj#L#Laj#Laj#L#L#L.7a9.E.7a9a9a9#DaY.s.N#xaCb#a#aFa#amamam#vaFamam#xa0#xam.CaCamamaObma7aza7aZbm.tam.C.Cbfaw#xaYaY.NaY.NaY#DaY.s#xawbfaY#x#x#Iaqao.8aZ#ua7ao#xaw#Da9b..7#Da9#s.7a9af.7a9a9a2#La2#La2#ga2#ga2#g#g#ga2#g#ga2#g#ga2#ga2#ga2#ga2#g#L#L.E#L.7afa9afa9#Laf#L#ga2#La2#La2#La2#La2af#La2#La2#La2#La2#La2a2a2#La2#La2a2#La2#La2bp#g#L#ga2a2#g#La2#L#L#L#L#L#L#Lafaj#Lafaj#Laf#Laf#L",
+"a9a9a9a9a9a9a9.n.7a9.n.7a9a9.n#D.na9#s#D#D#D#D#D#D#D.sblaY#saY#DaY#MaY#saYblaY#D#D#s#D.7.n.7bj.E#L#Laj#La2#La2#L#L#L#L#L.n.7a9.7a9.E#D#D.NaY.N#Iamam#v.0a#aFa#a#bmbgamaCbna0aoa0amaF#vaBa7a7.l.TaFb#b#amam#x.Nbj#x.N.s.NaY.NaY.N.N.NaY#x.N#IaY#I#x#Iaoaq.8.ybhazb#bn.N.N.7a9#D#s.7a9a9a9.7a9#La9#Lajaf#L#L#Lbp#L#ga2#ga2#ga2#g#ga2#g#ga2#g#ga2#ga2#L#L#L#L.7a9.Ea9a9a9a2#L#La2#g#La2#La2#La2#La2#La2#La2#La2#La2#La2#L#La2#La2#La2a2a2#ga2#g#ga2#ga2bpa2a2#L#L#L#L#L#L#L#L.E#L.7a9a9a9a9a9a9.7a9",
+".7a9a9a9.n.7a9a9#s#Da9#Da9#D#D#D.7#D#D#DaY.Naw.Naw.NaY.NaY.NaY#s#D#D#D#D#s#D#s#D.na9a9.n.7.7.7#L#g.ja2#g.j#g.j#g.j.3aj#L.7aja9.Ea9a9a9#D.N.s#x#x.Cb#aF.yaZa#a##Sa##SaFamamaOa#aZazazaza7a7bmaFaFa0a0a0bn#IaYaY.Naw.NaYaY.N.N.Naw.NaY.Naw#x.N#x.N#x#I.Cao.5.ya7az.5aoaY.s#D.E#D#Da9.na9.7.na9a9a9#Laf#L#L#L#L#Lbpa2#g#ga2#g#ga2#ga2#ga2#g#ga2#g#ga2#g#L#L#Laf.7#La9afa9#L#L#La2a2#La2#La2#La2#La2#La2#L#L#L#La2#La2#La2#La2#La2#La2a2#L#g#L#g#L#g#La2a2bpa2#g.j#L#L#L#L.7af#L#L#La9.7a9a9.Ea9a9a9",
+"a9a9a9a9a9a9.na9#D#D#s#D#s#D#s#D#D#D.saY.s#xaY#x#D#M#D.nbl.nbl#Da9.Ea9.7a9.7a9.7#Laj#Laj#Laj#Laj#gas#gas#g#gas#ga2#L#La2af.7#L.7a9#s#D#D.NaYaYboa0a0aOa#a#a#aBbh.GaPa7az#uaS#TalbaaGa7aZaFaoambnaCa0#x#I#D#DaYaw.N.N.s.N.N#D.N.N.N.N#I.NaY.saY#I.N#I.C.8.5.ya7azaOb##x.N#Da9a9#sa9a9#D.na9.7a9.7a9a9.7#L#L.7bp#L#ga2#g#ga2#g#ga2#g#ga2#ga2#ga2#ga2#L#L#L#L.7a9.7.na9.7a2af#L#ga2#La2#La2#La2#La2#La2#L.3#La2#La2a2#La2#La2#La2#La2a2a2a2a2#g#ga2#ga2bp.ja2bpa2#L#Laj#L#Laj.7#L.7.na9a9.7a9a9.7a9",
+"afa9afa9.na9a9a9#s#D#D#D#D#D#D#D.saY.NaY.Naw.NaY.n#Da9a9a9a9a9#Daj.7#L#Laj#Laj#Laj#L#L#Laj.7bp.7as.jas.jas.jas.ja2.ja2#L#Laja9aja9a9#D#D.Naw.N#x#xa0am#va#a#bmaB#l#0.2.2.2#0ab.4arazaZa#aFa0.W.C#x#x.NaYaYaYblbl.N.N.N.Nbj#Dbj.NaY.NaY.N.NaY.NaY.NaY.Waqao.0#ua7aBaO.Waw#D.na9#Da9.na9a9a9a9a9af.7afa9.7#L.7.7bpa2#g#ga2#ga2#g#ga2#ga2#g#ga2#g#ga2#g#L#L#L.7.Eafa9afa9#L#L#La2#g#La2#La2#La2#La2#La2#L#L#L#La2#La2a2#La2#La2#La2a2#La2#L#g#L#g#L#g#La2#Lbpa2#La2#La9#L.7#Laf#L#La9.7.na9a9a9.na9",
+"#D#Ma9#Da9bl#M#DaYaYawaYblawaYaYaYawaYaYbl#D#D#s.7af.E#L.7aj.7#L#Lajbp#Lbp#L#L#L#ga2.j#g#g.j#g.j#g#g#g#g#g#g#g#g#ga2a2aj.7a9.7.7a9.na9#M#DaY.Nawbn#UaoaF#v.8am#va6a6ba#V.Z#oab.I.TbmaFaoam.C.C#I#x.s.N.N#D#D#D#DaY#DaYbl.NaY.N.s#D#M#D#D#s#D#D#s#Daw#x.CaC.5bc.yaBaZ#vam.Nbj#Db.#D#D.7a9.7#D#D.Na9a9.7a9#L#L#L#La2a2a2#ga2#ga2a2#L#L#L#L#L#L#L#L#Laf#L.na9a9#D#Da9a9a9a9#L#L#L#La2#La2#L#L#L#L#La2#La2a2a2a2#L#La2#La2#La2#La2#La2a2a2a2a2a2a2a2#L#L#L#L#L#L#L#L#L#L#L#L#L.7a9.7af#La9.7a9bja9#D",
+"bl#D#D#M#D#Dbl#D#MaYbl.saY.NblawaYaYaY#M#D#s#D#D.7#L.7#L#L#L#Laj#g#L#gaja2aj#gajas.jas#gas#g.j#gas.jas.jas.jas.ja2.j#L#Laf.E#D#Daja9a9#DaY.s#x#IaCamama##uazaz.G#.a..Z#Valarak#aaZ#Sa#ama0#U.C.CaYaY.NawaY#D#D#DaYaY.sbl.N.s.N.Na9a9a9a9#D#D#D#D#s.N.N#I.CaobybcbhaB#vaF.WaY.s.Nbl.s#D.na9#D#DaYafa9a9a9#L#L#L#L#ga2#ga2#gaaa2as#L#L#L#L#L#L#L#L#L#L#La9a9#D.7#D.na9#D#L#L#L#L#L#L#L#L#La2a2a2a2#L#La2#L#L#La2#La2#La2#La2#La2#La2a2#La2#La2#La2#L#L#L#L#L#L#L#L#Laj#L#Laja9.7.Eafaja9a9#sa9#D#D",
+"#D#M#Dbl#D#M#DblaY.NaYbl.NawaYaYaY#M#D#D#D#D.7afaja9#Lajbp#Lbpbp#Lajbp#Lbpbpa2bp#g#g#g.j#g#gas#g.j#g#g#g#g#g#g#ga2a2aj.7a9#Da9#Da9a9#s#D.s#x#I.Ca0aO#uazal.Y.A.1a.aHaGaz.Ta#bma##SaFaFbgama0.C#x.s.NaY.N.N#s#D#Dblbl#Dbl#D#D#D#D#Da9#D#D.7.E.7a9#D.saY#x.Wa0.8.5#S#uaB#S.5.C#x#x.NaYbl#Da9#D#D.Na9a9.7a9#L#L#L#La2asa2aaa2#ga2a2#L#L#L#L#L#L#L#La2af#L#La9.7a9#Da9a9.7#La9#L#L#L#L.3#La2#L#L#La2#Lafa2#La2a2#La2#La2#La2#La2#La2a2a2a2a2a2a2a2a2#L#L#L#L#L#L#L#L#La2.7#L#L.7af.7a9a9a9bja9#D#D#D",
+"aYaYaYawaYaYaY.saY#M.NawblaY#Daw#Dbl#D#s#D#La9.7#L#L#L#L#L#L#Lbpa2bpa2aj#ga2bpa2as.j#gas.j#g.j#g#gbp.j#L#gaja2bp.j#Laf#L.7#s.N#sbjb..N#Ibf.Waq.8#vaz#zaHbs.m.B.BauaSa#aFaFbgama0ambga#aFamam.W.CaYaY.NawaY#D#D#D#sbl#D#D#D#D.Nb.a9a9.n.7#La9.7b.#Da9.s.Nbo.C.Cava#aZaBaBaOaOb#ao#x#IaY#D.n#Da9#Da9a9a9#L#L#L#L#La2a2#ga2#ga2#ga2bpa2#ga2a2#ga2a2#La2af#L.7a9a9.7a9a9#D#L#L#L#L#Laf#L#L#La2a2a2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#L#L#L#L#L#L#L#L#L#L#Laf#L#La9.7.7a9.7a9#D#D#s#D#D",
+"aYboaY#x#x#I#x#x#I#xaYawaY.NaYaY#D#M#Da9.7.7aj#L#L.E#L#Lbp#L#L#Lajbp#Lbp#Lajbpaj#gas#g#gas#gas.j#L#Lbp#Laj#gbp#L#Laj.7a9.7#Dbj.N.N.sbo.Caq.8#v#u#3adbe.A#Y#9.PbranaBb#amamaYaYaYa0am#vbmaOb#.C#x.s.N.NaY.N#Da9#D#pa9.na9#Da9.7a9.7a9.7a9.7.7.7.7a9#D#D.N.N#xbo.Cb#aOaF#vbma##vbmamam#xbl#D#D#D#Da9a9.7#Laf#L#L#L#g#La2bpa2#L#ga2a2bp#Lbp#L#Lbpa2#L#L#La9a9.7a9.7a9af.7af.7#L#L#La2#La2a2#L#La2a2#La2#La2#La2#L#La2#La2#La2#La2#La2a2a2a2a2a2a2a2#L#L#L#L#L#L#Laj#Laj#L.7aja9#L.na9#D#s#D#D#D.N.N",
+"#x#x#x#I#x#x#IbnaYaY#IaYaY#MaY#M#D#D#Da9.7#L#L#L#L#L#L#L#Lbp.E#Lbpa2bp.j#L#g#L#g.j#gas.j#g.j#g#g#Lbpajbp#Lbp#Laj#L#Laj.7.n.N.N.sbf.C.Caoa#.w.ObB.u#.#oa8aMabalanaBa#a#a0#xaYaYaY.Wamb##Sa#b#a0.C#xaY.NaY.s#D#D#D.nbla9a9#D.n.7a9#L#L#L#Laj#L#L.7.E.7b.a9.s.N.N.s.Camam.8aF#vaZ#uaFb##xaYaY#D#D#sa9a9a9.7#L#L#L#La2a2#ga2#ga2a2#g#L#L#L#L#L#L#L#L#La2af.7a9a9.7a9a9a9#D#L#L#L#L#La2#La2#La2#La2a2a2a2a2#La2#L.3#L#La2#La2#La2#La2a2#La2#La2#La2#L#L#L#L#L#L#L.7#L#Laf#L#L#L.7a9.7bja9#D#s#D.N.saY",
+".CaC.Ca0.Ca0#x.CawaYaY.Nbl.N#D#D#Da9.E.7aj#Lbp#L#L.7#Laj#L#Lbp#Lajbpaj#Lbpaj#Lbp#gas.j#gas#gas.jbpaj.7#Lajbp#Lbp#La9a9#D.N.s.N#x.WaqaO#ubk#zaHbA#Pbsbeab#a#ua#ambm.Fa0bn#xaY.N.s.Nbnb#bmaBa#aC.Caw.NaY.NaY#D#D#D#pa9a9a9a9.7a9#Laj.7#L#L#L#L#L#Lbja9bjbj#D.7.N.Nbo.C.Ca0a##vana7an#Sa0aYawbl#D#Da9a9.7af#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Laf#La9.n.7#Da9.7afa9#L.7a2#L#g#La2#La2#La2#L#L#La2a2#La2#La2#La2#La2#La2#La2#La2a2a2a2a2a2a2#L#L#L#L#L#Laj#Lafaj#L#L.Eaf.7#La9#s#D#DaY.NawaY#x",
+".C#xa0#x.W#x#x#x#DaY#Dbl.sblaY.Na9#D#L.7#L#L#Laj#Laj#L#Lbp#L.7#Lbpa2#L#g#L#g#L#g.j#gas#g#g.j#g.jbp.7#La3#La3aj.7.7aj.7#s.N.N#Ibf.8aF.y#3ad.A.MaT.P#V#P#Tan.5.C#Ia0b#bga0#xbf#xbf.N#xa0bm.T#Sao#x#x.NaY#s.N#D#D#D#p.nafa9.na9#L.7#L#L#L#Lbpaja3#L.Ebj.E.7#sbj#sbjbf.s#xavama#aBana7aZbgbnaY#D#D.7.na9a9.7#L#L#L#L#L#L#L#Lbp#L#L#L#L#L#L#L#L#L#L#La2a2#L.7a9a9a9.7a9a9a9#L#L#L#g#La2#La2#La2#La2a2#La2#La2#La2#La2#La2#La2#La2#La2a2#La2#La2#La2a2#L#L#L#L#L.7#L.7afaj#L#L#L.7a9#LaY.Naw.Naw#x#x#I",
+"aY.saY.NaY#DaY.N.na9.na9a9a9a9aja9a9a9a9.7a9.7a9#Laf#L#Laj#L#gaj#Lajbpaj#Lajbpaj#Lafaj#L#L.7.Ea3#L.Ebj#D.s.N#Db..7.7.N.N.WamamaOakaybs#Y.maDbaaHaga7#SamamaC.C.CaYamb#aFb##xaY#D.n.Nawa0#vaZaZa##xaw.N#Daf.na9#s#Da9a9a9.7af#Laf#La2#g#g#L#Lbp#L#L#L#L#L#L.7.7.7.7bj.N.Caoam#vaZaz.fanama0aY#Ma9aY#D#Da9a9.7.7#D#L#La2#La2#L#L#La2a2a2a2a2a2a2a2.7afa9a9#D.7#D.7af#L#L#L#La2#ga2a2a2a2a2#ga2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#L#L#La2#La2#La2a2a2#La2#L#Lafa9a9a9bja9#D#D#DaY.s.N#x#Ibn#x#x#x#x#U#x",
+"aY.Naw#D#D#s#D#Da9a9a9a9a9afa9a9a9a9.Ea9a9.na9a9afajaf#La2#L#L#Lbp.7bp.7bp.7bp.7a2a2#Laj.7.E.7.E#L.E#D.s.N.Nbjbj.N.s.N#xa0aO#u#E#V#2....#KaD.YaGa7bmaFaFaoama0.CbnaCb#aOama0.N#D#Dbl#xa0bmaB#ua##x#xaY#sa9.7a9.7#D#D.7a9a9aj#L#L.j#La2bpa2#Lbp.E#Laj#L.E#L.7b.#Db.#D.s#xa0.8a##v.6azbhaOam#xaYbl#Dbl#Da9#Da9.7.7#La2#La2a2a2a2#La2a2a2a2a2a2#La2#L#L#L#D.7a9#Da9#L.3afa2#La2bpa2bp#g#L#g#La2#L#g#La2#La2#La2#La2a2#La2#La2a2a2#La2a2a2aja2#L#La2#Lafaj#La9.E#Da9#s#D#Daw.NaY#IaYaYaYawaYawaYaYaY",
+"a9a9a9a9.na9a9.na9.na9.na9.na9a9a9.7a9a9.7a9.7a9#L#L#L#L#Laj#L#Laj#Laj#Laj#Laj#L.jbp#L#L.E#L.Ea3.n#D.Nbf.Cbo.Caobf.CamaOaBaz#EaraQ#.#o.Abzay.Gana#aFaFaOamam.C.Wbna0a0b#ama0#I.N#D#M#x.CaoaZbhaBa0#IaY#Da9#s.7a9#sa9#Da9a9#Laf#L#L#ga2#g#L#Lbpbp#L#L#L#L#L.7.7.7.7#D.NaY.Cambga#a7.6#ua#b#aoa0#xbl#D#Da9.7a9#Laf#L#La2#La2a2a2a2#L#L#L#L#La2#La2.7afa9a9#D.7#D.7afaf#L#La2#L#L#ga2a2#ga2#ga2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#La2#L#L#Laf#L#Lafajaf#L#Lafa9a9a9#Db.#D#DaY#DaY.N.N.N.s#D.N#D.N#D#s#D",
+"aj.7aj.7.7.7.7.7#Da9#Da9a9a9a9.7a9#Da9#s#D#D.n#Da9a9.na9.7.7bj.7bp#L#L#L#L#L#L#Laj#Laj.E.Ebjb..N#MawaCaoaoama0.Cb##va7#a.Oaz#uaZaZanaz#e.6anaZaFaBaOaF.5amama0a0#xaCa0ama0a0#xaYbl.NaY#xa0#vaZ.lama0#x#Mbl#D.7#D#Dbja9.Ea9af#L#La2#L#La2bp.j#Lbp#Laj#Lbpaj.7bj.7#s#D.s#x.Wa0amamanaB.0a##va#bgamaYaY#Da9a9a9#L#L#L#Laf#L#L#L.7#La2a2#La2#L#La2#L#L#L.7a9.7a9#Da9#L.3#La2#L#L#La2bpa2#g#La2bpa2bpa2#La2#La2#La2#La2#La2#La2a2#La2.3#L#La2#Laf#L#Lafaja9a9.7#s#D#D#Da9.s.N.s.Naw#Dbj.7b..7b..7bjbj",
+"#L#Laf#Lajafaj#Laf.7.7.7.7.7a9.Ea9bja9#D.7a9bja9a9.7a9.7a9.7.Ebjaj#Laj.7.E.E.7.E.7.E#D.s#xbo.C.WaCamb#a#.y.0.yaB.Gazazazbhbma#aFaFa#a#aZaBa#.5.5#SaFambgama0amam#x#xbna0a0aCa0#xaYawaY#Ia0aO.lbh#vb#bnaY#s#D#s#D#Da9#Da9.7ajaf#Laja2bp#g#L#Lbp#Lajbp#L#L#Lbj.7.7#Da9#DaY#x.CaCam.5a#aOa#a##va#a##xawaY#Da9.7#L#L.7af.7#La9#Laf#L.7af#Laf#L#Laf#Laf.7a9.7a9a9#D#Daf#L#La2#L#L#L#La2a2a2#ga2a2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#L#L#L#Laf#Lafa9a9a9a9a9a9a9bj#D#D#D#D#D#D#Da9#Da9#D#s#L.7#L.7#L.E#L#L",
+"#Laj#Laj#L#L#L#L.7.n#La9aja9#L.7a9#s.7#Da9#Da9bj.n#Da9.7.E#Dbj#D#D#D#Da9#Da9#Da9.N#I#x.Wam.8.5#va#aBaP.G#a.U#4.Uaza7aZa#aFaFbmb#a#b#aFa#.8ama0ama0a0a0a0a0aC.Ca0#I#x#xa0b#a0a0a0aYaY.N.N#Iambm.lbmaFaobnaYaY#Dbj#D#s.7a9a9af#L#L#La2aj#ga2bp#Lbp#L#L#Lbp#L.7.E.7#D#D#D.saY#x.C.CaC.5am#v.5a#.0#va0bn#x.N#D#D.7.7a9.7a9.7a9.7.7a9#L#L#L.7af.7#L.7#L#L.7a9a9bja9#Da2afa2#La2#L#L#L#L#g#L#g#L#g#La2#La2#La2#La2#La2a2#L#L#La2afa2af#L#L#L.7a9.Ea9.7.n.7#Da9#s#D#D.N.N.sbj#sbjb..7bj#Laj#Laj#L#L.7#L",
+"bjbj.7bj.7.E.7.7.7.7a9.7a9.7a9.7#D#D#D#D#s#D#D#D#D#D#D#D#D.N.s.N.sbfbobf#Ibf#xboa0.8.5#v.yan.w.G#TabaMa8#cabalaZa#aFa#b#b#a0b#b#ama0aoa0a0#x#x.CawaYaY#Ubn#xaYaY#x#x#x.Rbna0a0amaYaY#D#DaY#UaF#GaZ#S.V#UaY.s#Dbj#s#Da9.n.7#La2af#L#La2#g#gajbp#L#Lbp#L#L#L.7bj.7a9#s#Dbl.N#x#x#x#x.C.Cam#va#a#.0aF.8a0#x#x#D#D#Da9#D.7#Da9a9.7.7#Laf#L#L#L#Laf#Laf.7a9a9.7a9#D#Daf#La2#La2#L#L#L#ga2#ga2a2#ga2bpa2a2a2a2a2a2a2a2#Lafa2#L#L#L#L#Laf#La9a9#La9a9a9a9#D.7#D#D#D#D#D.s.Nbja9.7.7a9.E#L.7.7.7.7aj.7aj",
+".7a9b..7.7bjbj#D.Eaf.7#L.7af.E#L#D#D#D#D#D#D#s#D#D#s#Dbj#D.s.N.N.C#x.C.C.C.W.C.Wby#vaBaz#T#4aH#..ga8bsbr.2al#TaZaFaFb#b#ama0a0a0.Cama0#xaY#x#x#xaYbl.NaYaYaYblaYbf#x#x#xbna0a0aobn#xaw#D.sa0.t#SbmbmaOa0#U.N#D#D#D#D#Da9a9#Laf#L#L#La2#L#g#L#Lbpa2ajbp#Laj.7.7.7#Dbl#DaY.N.N#Ibf.Naw.Cao.5.5a#a##va#ama0bf#D.N.N.7#Da9#D.7a9.7a9#L.7#La9#La9#L.7#L#La9.7a9bja9#Da2af#La2#L#L#L#L#g#La2bpa2bpa2#La2a2#La2#La2#La2#L#L#Laf#L.3#Laf.7a9af.7a9a9.7a9.7#D.n#D#D#D#D#Dbjbj#Dbj#s.7.E#La9.n.7.na9.7a9.7",
+"#Laj#Lafajafaj#La9#D#s#D#D#D#DaYaYaYawaYaY.NaY.N.C.C#x#IaYaY#M.namav.8.5#v.0.w.G#aau#4#4#z#3.Ga7#Z#0aM.gaTayaZa0a0a0a0#xbn#x#U#xawblawaY#D#M#D#D#D#Da9#D#sblaY#Mbl#Mblbl#DaYaYaYa0#IaY.N.NaY#Ua0.t.tbm.Fam#x.Nb.#Da9a9.7af#L#La2aj#L#L#L#L#Laj#L.7#L#L#L.7#L.7af.7.7a9.7.n#D#D.NawaYaY#x.CaCamao.0a#aB.0.taFb#.VaY#Da9a9af.7#D.N#Laf#L#L#L#L#Lafa9a9a9a9a9.7.7.7a2#La2a2a2a2a2a2a2a2a2a2a2a2a2a2#g#L#ga2a2#ga2a2a2a2a2a2#L#Laf.7#pa9a9a9#Dbj#D.N.na9a9a9b.#D#D#D#D#s#D#D#D#s#D#D.n.7#L#L#Laj#L.7",
+"aja2afaj#L.7.7#L#sa9#D#D#s#D#D.N#D#D#D.N.N.N.N#DaY.N#x#xaCamb#aF#SaZanaz.Galba.4.O#aaz#uaB.0aBan#Tbz.mab.2az.5#xa0bnaYaYaYaYaYaY#DaY.NaYbl#D#D#D#D.n#D#Dbl#Dbl.Na9bl#Dbl#DawaYaYbnaYaY#D.s.N#xaCbm.Fbm.tb#aC.N.Nbl.na9a9aj#L#L#L.7#L.7#L.E#L.7#L#L#L#L#L#L#Laj#La9aj.7.7.7#D.N#D#Dbl.N#xbn.Ca0ama##va##v#vbm#vaF#x#x#Da9a9#D#D#D#L#La9#L.7af.7#L#pa9afa9.7#D#La9#La2a2#La2#La2#La2#La2#La2#La2#La2#ga2a2bpa2bpa2a2a2a2a2a2#La9afa9.na9a9#D#D#Dbja9.nbj#D#D.NaY.saY.Nbl.sblaYaY.Na9.7#Laj.7.7#L.7",
+"#Laj#L#Laja9.E.7#La9.Ea9#D#D#s#Db.#D#D.Nbo.Caqaq.bbnbga#aZaS.G#q#t.HaQauaGar#a#a#vaOaF.5b#.8#vaB.2.A.1aDaka#amaYaYaYaYaYaYaY#D#D#D#D#s#D#D#D#D#D.7.7a9#D#D#D#Dbla9a9.n#D#D#D#Dblaw#xaw.N#DaYaYbnb#aF.taOb#.C#I.Na9a9.7a9a9#L.7#L#L#L#L#Laf#L#L#L.n#L#L#L#L#L#L#L#La9a9.7a9.Ebj#D#D#D.s.N#x#x.W.Ca0amamaFa##vbmaBb#bnaY#D#D#Da9bjaf#L#L#Laf#L#L#La9a9a9a9a9a9.7.7a2af#L#L#L#L#L#L#L#La2#La2#L#L#L#L#L#L#L#L#L#L#La2#L#Laf#La9.7a9a9afa9a9bj#s#D.Nbl.NblaY.NaY#xaYawaYawaYbl.sbl#M.7.E#L.7#L.Ea3.E",
+".7.7.E.7.Ebj.7.7.n.7a9.7#s.N.N#DaY.N#x.Cam.5a#aZaF#SaZa7arala6ay#W#W#kbhbmaFa#.5#x#x.CaCaoamaOaB#P#obsba#uam.C.NaYaYaY#D#D#D#D#Da9#Da9#D.7#Da9a9#La9.7.7a9bl#s#Da9a9a9bla9bl#D#DaY.NaYawaYaY#IaYa0aCb#.Va0a0#U.N#D#Da9.7a9.7aj#L#L#L#Laj.7#L#L#L#L#L#L#L#L#L#L.7#L#L.E#La9.7.7.7#D#D#DaY.s#x.C.C#x#Ia0aCama#a#aZa#.8a0#xaY#Da9af.7#Da9#D.7#Da9#Dafa9afa9.7a9#La9#L#L.3#L.3#L.3#L.3#Laf#L#L#L.3#L#L#L#L#L#L#L#L#L#L#L#L#La9.7a9a9a9#D.na9bl#DaY#s#x#x#x#Ia0#I#x#xawaYblaw.NaYaYaY.7#D.7.Ebja3.7.7",
+"#Db.#D#D#s.N.s.NaY.Naw.N.NaYbo#xa0b#a#bmaS#aa6.Kbaba#a.faZaFb#amb#b#ama0.C#xbf#xbobf.NaY#xao#v#u.q.qaGanamaYaY#DaY#sbl#Da9.7#L.7.7.E.7a9.E#L.7.E#L#L#La9.nbjbl#Da9a9.7a9.7#D#D#DblaY#xaYaY#IaYaY#xbna0bnbna0aCbn#sbl#Da9.7af.7a9#L#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La9.7af.7a9aj.7#D#D.N.Nbo#x.Nbl#Ia0am.5aO.0aB.0b#.CaYbla9a9a9.7a9.7a9.7a9a9a9#pa9a9a9bj.7.7#L#L#L#L#L#L#L#L#L#L#Laf#L#L#L#L#L#L#L#L#L.7#La9#Lafa9bja9#D#D#D#Dbl#DaYaYaYaYaY.C#xama0.CaC.C.C#x#xboaYaY.NaY.N#s.N#D.N.s.NaEaW",
+".N.N.s.N.Nbf#xbfaCa0a0a0a0amam.8aZbhazaGau#j.e.e.6ana#.5ambn#xaY#I#x#xbo.N.N#saW#x#Ibfaw#x.5aZ.G.q.KaBam#xaY.s#D.7#Da9.7.E#L#L#L#Laf#L#L#L#L#L#L#Laj#L#L.7#Da9#Da9.7a9#D#D#Da9#D#DawaY#IbnaYaY.Naw#xbnbnbna0bna0aY#D#D#Da9.7#L.7#L#L#L#La9#L#L#L#L#L#L#L#L#L#L#Laj#L#L#L.n.7.7.7#La9.E.7#D.N.N.N#saY.N#x.Wa0.5aF.0aZ#v.5a0aY#Da9.7#Da9bja9#D.7#Dafa9afa9.7a9#La9#La9#La9#La9#La9#La9#L.7a9af.7af.7#L.7.7#L.7af.7.7a9.7#D#D#D#D.N.saYaY#x#I#xbnbnaOaoaoamaCa0a0bn#Ibn#x#x#x#x#I#x#xaYboaY.N#xbf#x",
+"#x#xa0.CaCa0aoa0aFa##v#vaZ#uaZaZarazazanbmaF.5a0.C#x#x.N#D#D#D#D#D#D.Nblbj#D.N.sbf#x#I.CbgaBaz.2baazaF#x.n.7#Dbla9.7.7#L#L#Lajbp#L#L.E#La9#L.7#L#Lbp#L#L.7#L#D.E#L#L.E.7.7.7.7#Dbj.N#xbna0#I.N#DaYawbna0bnbn.V#U#D#D#D#D#D.7a9.7#Laja9#Laj#L#L#L#L#L#L#L#L#L#L#L#La2#L#L#L#Laf.7#L#L#La9.7#s.N.N.7#D.N.N#x.CaCaq#vaZaBa#aF#xaYbl#D#D#D#D#D#D#D#Da9a9a9a9a9a9.7.7#L#La9.7a9a9#L#L#La9a9a9.7a9.7#L.7af.7af.7a9.7.7#D#D#D#D#D.N.NaY#x#x.Ca0b#ambgamaOb#aCa0.C#I#xaYa0a0#xbn#x#xbna0aCa0a0a0ao.CaCaq",
+"aoa0aoaO.5.8aFaO#u#uaSazaG#3araza#a#amam.C#x.s.Nafaf#La9bjaWbfbf.N.NaY#xawaYaYaY#x.C#xaCamaB#aaT.GaF.C#D#La9#L#D.7#Laj#L#Lbpbp#Lajaf#L#La2#L.j#Lbp#L#Lbpa9.7#Da9.7#La9#La9.7a9.7#Dbl#xaCbn#xaY.s#D.N#Ubnbnbnbna0bl#D#D.7a9.7#L.7a9#L#L#L#L#L#L#L#L#L#L.7#L#L#L#L#L#Laj#L.7#L#L.7a2.7#L.7.7#D.N.Nbj#D.s.N.N#I.Ca0aFaZaBaZ#vam#xaY.7#Da9#D.7#Da9#Dafa9afa9.7a9.7a9#L#Lafa9#La9#L#La9af.7a9a9a9afa9a9#L.7.7a9#L.7af#D#D#D.N.N.NaY.s#xama0.8aF#Sa##va0a0a0#xbnaYaYawbn.WbnaCbnaCa0aCaFb#aO.5aOaF.8aF",
+"aZ.ya#amaoaFaB.Taka6aGaraBaFa0#xbnaYaYaw#D#Da9#D#L.Eaf.7a9aj.7.7aja9.n.7#D#D.sbfaw.N.Wam#v.w.Ga7.C#IaY#D#s.7.n#Laja2#L#ga2#ga2#g#L#Lajafaj#L#L#Laj#L#L.na9a9.na9a9a9.na9a9#L.Ea9a9#saYaY#x.C#x#xaYbn#x#U#x#xa0aCbn#D.7#L.7a9a9#paj#L#L#L#L#L#L#L#L#L#L#L#g#L#L#L#L#L#L#L#L#L#L#Laj#Laf.Ea9.7.7a9#Da9#D#D#DaY.NawaY.pa#.0.0a#ambn.N.N#D#D#D#D#D.7a9af#L#L.7#L#L#L#L#L#La9a9.7a9#Da9a9#Da9bja9bj#D#D#D#D#D#D#D#D#D#s#D.saY#xbn.8aFaZaBaZa#aFama0aqaC#x.N#MaY#x.Ca0aFb#b#amamb#.5aFaoaOaFaOa#bmaZ.y",
+"aZa#aOa##v#vaB.T#4#z#a#uaFa0aC#xaYawaYbl#Da9#Da9.7a9.7#L.7a9.7a9af.Ea9.7#s.N.N.N#D#Ia0.8a#bkaraZ#IaY.s#D#Da9.7#Lbpa2bpa2#g.j#ga2ajaf#L#L#Laja2#Laf.7#L.7a9.7#Da9afa9a9a9a9.7a9#La9#Dbl#x#x#I#x#xawaY#U#xbn#Ia0.CbgaYa9#L#L#Lafa9#Laj#Lbp#Lbp#Lbp#Lbp#L#ga2#g#La2#L#L#Laj#Lbpaj#L#L.7#La9.7.7a9.7.E#D#D#D#D.saY.N#Ua0#va##S.0aOamaY.N#D#D#Da9#D#Dafa9a9af#L#L#L.7af#Laf#La9#Da9.7a9a9.7#D#D#D#D#Da9bja9a9#D#D#s#D.N.N#x.Ca0aoaF#vaZbmbmaOa0.W.C#x.C#xbl.NawaY.CamaCamaCamamambgamb#.5aOa##Sa#.yaZ",
+"#vaFaO#v.ybmaZazbaauazb#a0#x#xaYaYaY#D#sa9#D.E.7aj#L.7aja9aj#L.7aja9.n.7#D#D.sbfaY.WaCam#u#3a7aFaYaY#D#D.n.7ajafaj#gaj#g#L#g#Laj#L#Lajaf#Laf#Laj#L#L#La9a9#Da9a9.na9a9.7.n.7.7a9.na9aY#x#x#x#x#xaYaY#x.R#IbnbnaC.t.VaYa9.7aj#L#L#Lbp#L#Laj#La2#L.j#La2#g#g#g#gajbp#Lbp#L#L#L#Lbp#L#L#L.7a9.7.7.7a9#D#s#D#DaY.NaYaYa0ama#a#.yb#a0.N.N#D#Dbj#D#Da9a9a9.7a9bja9.7.7a9a9a9#D.7#D#D#D#D#Da9#Da9#D#D#Da9a9.n#D#DblaYaY.8b#.8aOaFaOaFaOb#bgama0#x#x#x.N#U#x#I#x#x#xaoama0bna0bnaoam.5amaOaFaFaF#va##vaZ",
+"aOaOaF#va#a#az#faS#ubmb#a0#xaY#Dbl.n#Da9a9.7#L#L#L#L#L#L#L#Laj#L#L.Ea9a9#s.N.N.s#x.Wb##v#Ebk#va0aw#D#D#Da9#L#L#Lbpa2#L#ga2#ga2#g#Laf#L#L#Laj#Laf#L.7#L.n.7#D.na9a9a9a9a9a9.7a9#La9#sbl.NaY#xaYaYblaYaw#x#x#x.C.C.Fb#bnbl#Da9.E#L#Laj#L#Lbp#Lbp#Lbp#Lbp#L#g#L#g#L#Laj#Lbp#Lbp#L#L.7#L.n#L#L.7af.7#Da9#D#D#D.NaY.saY#Ibn.5a#a#aFambf#x.NaY#D#D#D#Da9a9a9.7a9.7.7#L#D.nbj#D#D#D#D.Na9b.bl#Daw#xaYaYaYaYaY#Ia0a0aoam#uanaBa##vb#bgb#bnbnaYaYaYaYblaw#x#x#x#Ua0.Wa0a0.W.C.Wama0ambg.5aFaFa##va#a##va#",
+"b#ao#vbmaB#uaz.Gb#b#ama0#xaw.N#D#Da9a9a9.E#L#Laj#L#Laj#L#L#L#L#L.Ea9.n#D#D.N.N#x#Iao.5#u.Oazam.C#Dbl#sa9ajaf#La2.jbp.j#L#gajbpaj#Laj#Lajaf#L#Laj#L.n#La9a9a9a9#D.na9a9.Ea9.n.7a9a9#DaYaw#x.sbl#D#sblaYbl#I#x#Ua0b#bgb#bn#D#D.7#Lbj.7.7.7.7.E.7.7#L.j#La2#g#L#La2bp#L#Laj#L#Laj#L#L#L#L.7af.7.7.7a9.7#D#D#s.Nbl.NaYaY.CaCby#va#.8#xbfaY.N.s#D#Dbj#D#D#D#D#D#D#D#D#D#D#D#D.Naw.NaY#D.NaYaw#x#xa0aoamamaFaF#v.0bbanaBaZ#vaFb#am#x#xaYaYaYaY#IaY#D#D#x#x.Ca0avamama0.C#x.Ca0aoamaFa##uaZaBaZ.y#S.0.y",
+".8aOa##Sazar#ua#a0am#x#x#x.N#D.7.na9#L#L#Laj#Lbp#L#Lbp#L#Laj#Laj#La9.7.n#D.sbo#x.Wao#v.f#f.ya0bf#M#D#Da9a9#L.ja2#La2bp.j#L#ga2a2#Laf#Laf#Laj#Laf#L.7aj#Da9b.bl#Da9.na9a9a9a9.7.n#D#MaYbfaYaY#Da9#D#D#Daw.NaY#x#Ib#b#bg.VaYbl#s#L.Ebj.7b..7.7.7.7#Lbp#Lbp#L.jbp#L#L#Lbp#Lbp#Lbp#L.7aj#La9.7a9#L.7a9#s#D#D#DaY.Naw.N.s.CamamaOa#a#.W#xbf#xaY#D#D#Da9#Da9#Da9bj#Dbj#D.N.Naw.N#x#xbfaYaw#x.Ca0a0aFbma#aBaZbbaZ#uaZ.0bgb#a0am#x#x#xaYblaY#MaYaY#Dbl#DaY#xaCamamaoaqaC.C.Wamao.5a#a#.yaSazaZ#uaZ.yaOaF",
+".5aF#Sbhaza7aFa0a0bn#xaw.N#D.7.7af#L#L#L#La2#L.j#g#Lajbp#Lbp#Lbpaja9.n#D#s.N#I#I.WaF#uarazaF.W.Nbl#D.n#Laj#La2a2aj#g#L#g#L.jbpaj#Laj#L#Lajaf#Laj.7afa9.na9#D#D#Ma9#p#s#D#sa9.na9#DblawaYaw#Da9a9#D#D#saY.Naw#x#xaCb#.VaC.V#xaY#Dbj.nbja9bj#s.7.7aja2#L.j#Lbp#La2ajbp#L#L#L#L#L#L#L#L#L.Ea9.7.7a9#D.7#D#D#D#DaY.N.N.N#I.CaoaFa#aB.C#x#xbf#x.N.NaY#Dbl#D#D#D.N#D.NaY.saYaY.C.W.C.W.Caqa0.8a#aZaBan#u#uan#Sa#b#ama0bnaY#xaYaY.NaY.N#s#DaY#DblaY#Dbl#I#xam.8.5aOam.Cama0aoaFbmaBbha7#a#ea7an.y.yaF.8",
+"bc.y.wara7b#a0aoaYaYaYbl#Da9.7.7#Laja2#L#g.j#g#ga2bpa2bp.jbpaj#Laf.Ea9#s#D#I#I.C.WaOaz#EaZb#.C.N#sbla9afafaj#L.j#L#g#L.jbpa2bpa2#Lafajaf#L#L#Laf.E.7.n#Da9#D#sbl.n#D#M#s#D#s#D#s#DawaY.NaY#Da9.n#D#D#D#DaY.NaY#I.CaCam.Vb##U#xawa9bj.7b..7bj.7bj#Laj#Lbp#La2#L#Lbp#L#Lbpaj#Lbpaj.7#L.7af.7a9.7.Ea9#D#D#s#D.N.saYb..Nbf.Wa0aF.0#ua0.W.C#Ibfaw.NaY#saY.N.N.N.N.N.N.N#xaY#I#x.W#x.C.Wam.8aZ.waz#ubha#aFaFb#ambn.bblawaY#MaY.N.s.N.N#D#D#D#DaY.saY#I#xaCam.8aFbyaoaCaoamama#a7azararaya6.G.Gaz#u#v.8",
+".J.far.laobn#xaY#D#sa9#D.7a9aj#L#L#L#L#L#Lbp#Laj#g.j#ga2#L#L#Lbp.na9.7#s.N#I.Caobh#EaBaCbn.s#IaY#Ma9.n.7#L#L#L#Laj#Laj#L#Laj#L#L#L#L#L.7aja9.Ea9bl#M#D#M#DblaYblaYawaYaYawaY.NaYawaY#Mbl#D#D#D#Da9.n#D#s.Nbl.saY#x.RaY.N#xa0aFbm#IaYaY.N#s.7.E#L#L#La2#L#L#Lajbp#L#La2#L#L#L.7#La9a9a9.7#L.7.7.7#Da9#D#D#DaY.N.NaYaY#Ia0.5.8a#an.0.5bn#xbl.N#x.C#Dbl.sblaY#I#x.W.R#Ibna0aOa##vaZazararaz#ua#aFaO#x#I#x#Ibn#x#xaYaYaY#DblaY#Dbl#Dbl.NblaY.NaY#x#xaoaobnaY#xaCa#.0aOaOaOaFaFaFaFaF.l.Ta7bh.G.G#q#e",
+"araza7aFam#xaYawa9#Da9a9a9#L#L#L#L#Lbp.j#L#La2#Las#ga2#gbp#Laj#L.7.7.n#D#M#xaCaFbk#iaOaC#xblaY.Na9a9a9afaja9aj#L#L#Laf#Laf#Laf#Lajafaja9#L.7a9.Ebl.n#D#M#DawaYawbn#Ubn#I#x#I#xawaYawaYaY#D#s#D#D#D.n#D#DaY.s#x.N#U#IawaY#xbna0aF#x.W#xaw.N#D.7b.afajaf#L#Lbp#L#La2#L#L.E#L.7a9.7a9a9.na9.7a9.7.7#D#s#D#D#D.Nbl.Naw.N#x.CamaF.0.y.yaF.CaYaw#x.Caq#Ibn#x#x#x#xbna0aoamaF#vana7.wazaZan#uaZaOamamamaY.RaYaYawaYaYaYaYblaY#D#Dbl#DaY#DblaY.N#xaY#I#xbnbnawaYbnam#va#ama0a0aoamamaoam.taFbmaZ.6ar.2#4",
+".faBb#a0aY#xbl#Da9a9#D.E.7#L#L#L#g#ga2#g#g#g#g#g#g#g#ga2#L#L#L#L.n.7a9a9.N#Iam.8#f.Gb#bn#UaYaw.Na9.na9.7af#Laf#Lajafaj#Laj#Laj#Laf#Laf#L.na9a9#D#Mbl#M#DawaYaw#x#I#U#x#U#Ibn#I.NawblaY#s#D#D.N.sa9#s#D#M.NaY.s#xawaY#D.s#D.Nbnama0a0aC#x#xbl.NaY#La9#L.E#L#L#L#Laj#L#L#La9.7aja9a9a9a9#D.n.7a9.7#s#D#D.Naw.N.NaY#Dbl#I#xaC.5#va#aBaFa0aC.C.Caoa#ama0a0ambgaF#va##uan.w.wan.wanaZ#vaFb#ama0a0#x#xaYbfaY#xaY.Nbl.Nbl#D#D#Dbl#D#D#D#DaY#saY.N#x#x#xaYaYaYaY#Ia0bg.5bn#xbn#xbna0a0amaCb#ao.t#SaZar#a",
+"aFama0aY#xaY#Da9#D#Da9a9#L#L#L#g#ga2#gbpa2bpa2bpa2#ga2#gbpajbp#L#Da9.7#saYaY.W.5#EaraFa0#U.NblaYa9a9a9ajaf.E#La2#L#L#L#Laf#Lafaj#Lafaja9#D.n#D#D#s#DblawaY#I#x#Ibnbn#I#U#x#IaY.N.Rawbl#D#D#D.s.N#D#D.saY.saY#I#x.N#s#s.7bj.N#xa0aob#amaoa0#I#xaY#D.na9.7a9bpaj#L#L#L#La9.Ea9#D#D#D#D#D#D#D#Dbj#DaY.Nbl.N.N#x#xbfaw.NaY#xama0aOa#aBa#bgama0.5a#.0aFaOaF#SaZan#ua7bhazaBbhaBa#aFb#b#aCbnbn#x#xaYaw.Nblaw#D#Dbl#D#D#s#D#p#Da9#D#D#Dbl#DaY#x#xaw#x#xaY.NaY#x#x.C.C.CawaYaw#xaw#x#Ibn#x#Ua0a0amaFbmbm",
+"bn#xaYaYaY#Ma9af.7.n#L#L.7#L#ga2bp#ga2#g#ga2#ga2#ga2#L#L#L#L.7.7#s#D#s#D.N#xamaoaS.OaBam#xaYaw.N.na9a9#Laf#L#La2ajafaj#L#Laj#Lafaf.na9a9a9bl#D#Mbl#saYaw#x.b#x#x#U#Ibn#I#xawaY.saYaYbl#D#D#D.N#D#M#sblaw.N#I#x#I#D#sbj#Db..N.N.Camamb#am.pa0a0bn#D#Da9.7.7aj#Lbp#L#La9.7a9a9#s#D#MaY#D#Dbl.saY.N.N.N.s#x#xbf#I#x.NaY#I.CaCamam#vaBbm#SaF#va#a#aB#ubh#uanaBaBbmaZ.FaFb#b#a0aCbn#I#x.RaYawaYawaY.N#D#D#D#D#D#D#D#Da9#Da9#Da9#Da9a9.saYaw.Naw.N#xaY.N#x#xaY#xaC#xaYblaYaYaYaYaYaY#xaYblaY#Ua0a0.Vbn",
+".NaY#D#Da9a9a9#La9.7.7#L#L#g#L#ga2bpa2bpa2bp#gbp#g#Lbpaj#L.7.Ebjbj#D#Dbl.s#xaoa##TalaBam#x.NaY#Da9a9a9af#L#L#L#L#L#Lafaj#Laf#Lajafa9a9#p.n#D#M.NblaYaYawaY#x#I#x#Ibn#U#Ibn#I.NaYawaY#sbl#saY.s.N#sbl#s.NawaY#I#x#I.N#D#s#D.N#Ibnaoa0#Ia0a0b#aoamaw.N#Da9.7#L#L#L.7.n#L.7#s#DaW#DaYaYaY#I.NaY.N.N#I#x#xbf#x.C.C.C#x#I.Ca0amama#a#a7azaza7aZaB#uan#uan.laZ#SbmaFaF.V#Ubn#UaYaYawaYaYawaY.NaY.N#D.N.n#Da9#D.n#D.7a9#Da9bj.nbja9#s#DblaY#D#x#xaYaY#x#M.N#x#I#x#x#xaY#Dbl#DaYaYaY#xaw#x#IaYaYaY.baYaY",
+"#D#D#Da9a9#Lafaj#L#L#Laj#Lbp#ga2#g#ga2#g#ga2#ga2#g#L#Lbp.7.7.7#D#D#s#D.saY.C.8aB#4#zaZa0#xaYaw#Da9.na9#L#L#Laja2#Laj#L#Lafaj#L#L#p.n#pa9blblaYaYawawaYaY#I#x#x#Ibn#Ibn#I#x#U#x#IaYblaYaY.Nbl.saY#s#Daw#Dawbf#I#x#I#x.s.N.s#xa0aC.C.Ca0.CaCa0ambg#x.N.s#D.7aj.7aja9.7a9#sa9#D.s.NaYawaYaYaY.NaYaYbf#x.C#x.W.C.Caqavaqa0ao.5#va##vaS#W#aazazanbm#SaFaFa#aFaOaFbgb#aCbnbnaw#x#x.N.N#sbl#D#s.N.N.N.N.7.7.7.7.7.7a9.7.7.7a9.7a9.7.7.7aY#DawaY.NbfaY#x.NaY#x#x.C.WaY#D#M#DaY.NaY#x#x#x#x#x#xaYaY#Da9#D",
+"a9.7.7.7afaj#Laf#L#L#L#La2#La2#gbpa2bp#g#L#g#L#g#Lbp#L#L.7.7.7bj.s#D.NaY.Nao#v.QaD#za#am#xaY.N#D#pa9a9ajaf#Laf#L#Lafa2#La2#Lafaja9#p.na9#MblawblawaYaY#I#x#I#x#x#Ubn#Ibnaw#x#IaYaYawaY#M.saY.N.s#D#M#D.s.Naw#x#I.W#x#I.s#x.W#Ua0.Cava0.W.Ca0a0a0#I#IaY#D.7#L#L#La9.E#D#D#D.N#D.sbnbn#x#x#x#x#I#x.C#x.W.Caqamavam.C.5.5aFbya#.y.0.Gakar#e.TaBaFaF.5aFaOamb#a0aoambn#Ua0.C.Ca1bfbf.Nbl.N#D.N.N.N.Na9aj.7af#Laf#L.Eaf#L#L#L.7.n.7.n#DaYblbfaYaY#x#x.s#xbo#x.C#x.Na9#D#DaY.N#x#IaY#xama0bn#x#D#D.7#L",
+"#Laj#L#L.7#L#L#Laj#L#Lbp#g#g#g#La2a2a2a2#ga2#L#L#L#L#L#L.7a9.7a9#Da9.s#Iama##u#.bA.faFaYawaYaYbfa9a9afa9#L#L#Lajafajafafajaf#Lafafafa9a9bl#Dbl#s.RawaYaY.R#U.R#Ubn#Ubn#Ibn#U#x#x#M#D#D#Daw#D#s#DaYaw#s.n#D.s#I.Caoaoam.8.5aO##am#va#byaFbcaqav.CaFaOaFaC#x.N.saW.N#D.N.s.N#I#xbn#U#xaw.R#x#xbna0#U.Vamb#b#aFa#bmaBaZ#vaZ#v.0aB.yaFaO.5bgamamamaobn#U.C#Ua0aCbnbnawaY#MaYblaY.saY.7.n.7.na9.E.7.7#La9#Laj.7#L.7af#Lafaja9a9a9#Da9.Nbl.Naw#x.s#xaY#x#xbn#x.baYaY#Da9.na9#DaY#x#x#x#IaYaY#sbla9.na9",
+".7af.7#Lajaf.7#L#Lbp.j#L#g#L#g#ga2#ga2#g#La2#L#Laj#L#L.7a9.7.n.7#sbl.NaYaoa#azbAa6a7am.RaYaYaY#xafa9a9af#Laf#L#L#Lafaj#Laf#Lafajafaja9.n#D#M#DaYaw.R.RaY.baY#UaY#Ubn#UaYbn#x#I#x#M#D#M#D.s#D#s#D.s#Dbl#s#s#MbfavaCbgaCaoaC.5ao.5#vaOaOam.8.8amavb#b#aoaC#xaw.N.N#s.s.NaYaw#xbnbnaCa0a0a0amamaoaFaFaFa#.yan#u.G.6aBaBbmaO.5b#.5b#amaoa0a0amaCa0a0aY#xbn#Ibn#Ibn#IblawaYaY#M.Nbl.N.n.7a9.7a9.7afa9.7aj.7#L#L#L#L.7#Laf#La9a9#D.7#D#s#DaYaY.NaY#x#xbn#x#x#U#xaYawaYa9a9a9bl.NaY#x#x#xaYaYbl#Da9.7a9",
+"#L#L#L#L.7#L#L#L#La2#L#L#ga2#g#L#ga2a2a2#ga2#L#L#L.7#Laf.E.7.7#DawaY#I.CaoaBazbaaSa#.VbnawaYaY.N#pa9afa9a9#Laja9af#Lafafajaf#Lafa9#pa9blblbl#MaYaYaYaw.R#x#UaYbnaw#x.R#I.R#I#x#xaYaw.NaYaw.N.N.s#D.s.saw#I.CaoaoaO.F#vaOaO.8#vbc#va#aO#vaO.5.8aCaFaO#SaOaOao#I#x#MaYawbnbnaCa0b#a##va#a##vaZaZ#uazazbh.Galay.2alaFaOaFamaCa0aC.C#I#x#x#I#x#xaY#IaY#I#x#I#x#x#I#xbl#D#M#D#D#s#D#D.n.7.n.7.n.7.7.Eaf#L#L#L.7aj#L#Lajaf#La9.7a9a9.7bl#DaY.NaYaY#x#xaCa0#x#xbnawaY#D#Da9#D#DawaY#x#I#xaYaY#D#Da9a9a9",
+".7#L.Eaf#L#Laj#L#L#L#g#L#g#L#g#g.ja2a2#ga2bp#L#L#Laf#L.7.7a9.7#Dblaw#x.W.5az#aalaZb#a0bnaYaY#DaY#p#Da9afa9a9#L#Laja9aja9#La9aja9.na9#sbl.n.NblaYaw.R#xawbnaY#U#U#x.R#Ibn#I#x#I#xawaYaY.saY.s.N.N.s.saw.W.Waobc.yaBaB#u#S.y.y#va#aB#u.Qaz.waBaZ.yaZaB.0aBaB#vaO.5bn.Vb#am#Sa#aB#u.wbhazazbh.waz.GarazaSaz#a#a#a#ea0a0#Ubn#x#I#x#xaY#MaYblblawbl.NblaYaYaY#U#IaYaY#D#M#D#s#D#D.n#D.7a9.7a9.7a9.7a9#L#L.7af#L.7af.7af#L#L.na9a9bja9#D#D#DawaYbfaw#xbna0#x#UaYaYaYbl.n#Dbl#DaY.N#xaY#xaYaY#D#Da9a9.7",
+"#L#L#L#L.7#L#L#L#g#ga2#g#g#ga2bpa2#ga2a2#ga2#L#L.7#Laja9#La9#sa9.NaYaY.Wambk#zaraFamambnaYblaYbl#Dbla9a9.7a9.7a9a9.7a9a9.na9a9a9#Da9bl#DblawaY.N.RaYbnbnbn#Ubnbn#I#U#x#x#x#I#x#Ibl.Naw.NaYbf#I#x.s#x.WamaO.y#uazal.U#z.U#T.G.GaP#Tal#z.U#3al.Ualal#T.G#T.G#e.w.wa7#ua7a7aS.G#e#TaS.w.wanaz.wazaS#vaOa##va#aFaFam#UaY#xaYaY.NaY.s#D#D#D#s#D#D#D#s#D#saY.saY.NaY#sbl#D#M#D#D#Dbj#D.n#L.E#L.E#L#L#L.E#L#Laj#L#L#L#L#Laf#La9.7#Da9#D#D#DblbfaY.N#xaY.C#I#x#xaYaYaY#Dbl#D#D#Dblaw.NaYaYaYaY#D#pa9#La9",
+"#L#L.7aj#L#L#L#L#g#L#gbpa2bpa2#ga2asa2#g#La2#L#L#L#L#La9.7.7#D#sbl.N#Ia0#vaz#z#eam.Va0bnaYaYaYaY#Dbl#D#Da9a9.7.7a9a9a9.7#Da9#sa9bl#sbl.sbl.NblawaYbn#Ubn#Ibn.C#Ubn#x#U#x#I#x#IbfaYaw.NaY.N.saYboaYaCam.y#u#aau#4aH.4#..4aHbrbw#0.2bw.2aT.2ay.YaH#4#zal.o#T#Tal.U#aar.G.Ga4aPa4a4.ya#aZ.ya#a#a#aOa0bnaCbnaCbn#I#xblaYaY.s#D#sa9#Da9.na9a9a9.na9a9#D#D#D#D#s#D#s#D#D#s#D#D.n.7.E.7.n.7#La9#La9.E#Laf#La9#L.7#L.7afaj#L#La9a9.n#D.7bl#D#DaY.NaY#x#xbn#x.R#xaYaYaY#DaY#Dbl#D#D#DaYaYaYaYaY#D#Da9a9a9",
+"#L#Laf#L#L#L#L#La2#ga2#g#ga2#g#La2a2#ga2#ga2#L#L#L.E#L.7.n.7a9#D#D#I#xaoby.w#zaSa0aCa0bn#x.Rblblbl#D#D#D#D.7a9.Ea9.7a9a9.n.7a9a9#sbl#DblaYaw#x#x#xa0#xa0a0a0aCa0#I#U#x#I#x#I#xawaY#x#I.Nawbf#x#IaCbgaBaza6aT#P.uaybaay#3#aar.Gazaz.Gazaz.Gar#aa6.w#u#uaBaZaB#uazazazaS.0#S.0aFa#am.5aoa0am.Wam.C#I#x#x#I#x#I#xaw.N.N#s.N.N#Dbj#s#D#D.7.7.7#D#s.7a9.Ea9a9a9a9a9a9#s#p.na9bj#Dbjbj#Lajafaj#L#L#Laf.E#L#L#L#Laj#L#Laf#Laf.7a9bja9#D#D#DawaY#x.s#xaY#x#x#x#IaYaYawaYbl#D#D#DblaY#s#DaYaYaw#D#Daf.7af",
+"#L.7#L#L#L#L#L#L#L#gbpa2bp#g#L#La2#ga2a2#g#L#L#L#L#L.7a9#L.7#D#saY#x.C.8#va7albh.Ca0a0bnaY.RblblaY#Dbla9#Da9.7.7a9a9a9a9a9#D.n#Dbl#Dblaw#DaY#x#IbnbnaCa0#Ua0aCa0.CaC#x#I#x#I#Ibf#x#I#x#I#x#Ibo.C.paOa7#aay.K.K.K#Ear.faZa7#uaBaB#vbmaBaZa7an.TaZaOaF.FaFaOb#b##SaZ#va#aOama0.W#xavam.C.W.C#xaw#x#x#Ibfbf#xbf.N.N.saYaY#D.N.E#D.7a9#D#s.7#s#D#D#sa9.7a9.7.E.7.Ea9#s#D#s#D#s#D.Ea9.Eaf.E#Lajafaj#L.7#L.n.7#La9#L.E#Laf#L.na9#D.7a9#Dbl.NaY.NaY#x#x#x#U#x.RaYaYaYaY.N#xbl#D#D#D#DblaYaYaYbl#Da9a9.7",
+"#L.3a2a2a2a2asa2#ga2a2#ga2a2#ga2#ga2#ga2a2#ga2#L#L#Laj#L#L.7b..7#x#I#x#xaC#uar#e#Sa0.CaYaY#DaYaYa9#p#pa9a9a9a9a9#s#D#sbj#D#D#D#D#saYaY.Naw#x#x.Ca0aoa0a0aCbn#Ibnaw#U#U.CaCamaCaCaw#Mbn#UbnaCbgaoaZanaral.2alaPan.y.0.yaB.0a#a#a#.8aF#v.0#u.0#v.5aCam.8amaOamaoam.F.tbg#x.C.C#xaY.NaY.saY.Nawbf.N.N.N#D.s#D.N#D.Nbl#sbl#s#D#D#D.7.Ea9.7a9.7a9.7.7a9#s#D#D#Da9#D#D.na9.na9.na9a9.na9a9a9.naf#Lafaf.E#L.7#L#L#L#L#Lafaj#L#L#La9.na9bl#MblaYaY.baYaYbl#Dbl#DaYawaYaY#M#D#DaY#Dbl#D#DaYblbl#D#p#Dafa9",
+"afa2#La2a2#gaa#ga2a2bpa2#L#g#L#ga2a2#g#L#g#La2#g#L#L#Lbpaj#D.7bjaY.N.N#Iao#u#aayaFa0bnaYaYblaYaY#pa9a9blbl#D#M#D#Da9#Da9#Da9#s#Dbl#D#MaY#x#x#x.Wama0a0aCa0a0amao#Uaobg.8am.8amama0bgb#.8aFa#.0aZ#ua7#uaS#uanaBa#.8aFaOamaOamaCamb#ao.5a#.0#vaF.5a0a0aC.Ca0.Wa0am#ybgaC#xbf#I.NawaY.NaY.saY.NaYaw#D.s.N.N.N.s.N.sbl#sbl#D#D#D.n#D.7a9.7.n.7.n.7.n#D#D#s#D#s#Da9#Daja9a9.nafa9aja9aja9aja9af#L.n#L.7af.Eaf.E#L.7#Laf#Lafaf#La9.7a9blblblawaYaY.baY#Mbl#DaYaYaYaYaY.NaY#Dbl#s#Dbl#D#MaYa9bl#D#Da9a9",
+"afaf#La2a2a2#ga2#ga2a2#ga2a2#ga2bpa2a2#ga2#ga2#g#L#g#L#L#Lbj.Ebjaw#D.s#xaoana6abaOam#xaYaY#DaY.N#pa9#p#sbl#Dbl#D.n#D.na9.na9a9a9#sbl#DaY#I#x.Wbnb#bgb#amamao.8aFamaO.yaZ#u#u#S#vaZan.yaZaZ.6aSa4aBaZbma#aF.5ama0aCa0.CaCa0a0a0.Wbna0a0aoam.5aoa0#I#x#xbn#I#x#x#x.p.Vbn#x#I.NaYbl.N.NaY.N.NaY.N.NaYaY#DawblaY#DaYblaYblawaY.s#D#D.na9a9a9a9a9a9a9a9#D#D#Da9a9bja9a9.nafa9.Ea9a9.na9.na9.n#Lajaf#L.n#L.7#L#L#Laj#Lajaf#L#Laja9a9a9blblblaYaYaYaYaYbl#D#MblaYaYaYaYbl#saY#D#D#D.NaYblaYbl#D#p#Dafa9",
+"afajaf#La2a2a2a2a2#g#L#g#L#g#La2#ga2bpa2#La2bpa2aj#Lbp#Lajbj.7#s#D#Daw.C#v.GaTaD#vb#a0bnawaYaYaYaYblaYaYaYawaYaw#D#D#D#D#D#D#s#Dbl#saYaw#xa0a0a0bgamaOamaOa#a#a#.yan#u.G.Gaz.w.w#u#uan#uan.w.6.GaFaOaFaoaobn#I#x#I#x#I#x#x#I#xaY#x#I#xbn.CaC.Ca0#x#x#IaY#xawaYaw.R.bbnawblaYaw#DaY.saY.Naw.N#M.N#D#s#DaY.N.saY.NawaYaw#Dbl#DaYaY#D#s#D#s#D#s#Db.a9#D#s#D#s#D.n#Daf#L.na9aja9aja9afa9aja9afaf.7af.7#La9aj.7a9#L.7afaj#Laf#La9a9a9.na9blblaYawaYaYblbl#Dbl.saYaYawblaY#D#Dbl#DblblaYblbl#Dbl#Da9a9",
+"a9a9#L#L#L#L.jbpa2a2aja2#ga2#ga2#L#ga2#ga2#ga2#L#g#L#L#L#Lbj#s#D#saw#Iaq.y#3aH#Pa#bga0#UaYaY#xaYaYawaYaYaY#x.N#x.Naw.Naw.N.NaY.s#DblawbnaCamb#bgaFbma##S.0aB#u.yaz.w.waz.w#u.0a##SaFbma##Sa##Sa#amamaoa0#x#IaYawaYblawaYawaY#M.NaYaYawaY#I#x#x#U#x#x#xawaYaY#D#MaY#x.b#x#UaYaY#Daw#DaY#D#D#D#D#Dbl#Dbl#sblblbl#MaY.RaYaYawaY.s.Nbl#Dbl#D#Dbl#Dbl#D#s#D#D#D.7#D#Dajaf#La9.na9a9.na9.na9a9.n#Lajaf.E#L.7#La9aj.7#Lafaf#Laf#La9.Ea9a9#p.nblblaYaYaY#Dblbl.NblaYaYaY.Nbl#D#D#D#DaY#DaYblblbla9#Dafa9",
+"a9afa9ajafbpa2#L#ga2bpa2#L#g#La2bpa2a2bpa2#L#ga2#L#Lbp.7aj.7#Db.bl#x.Waobb.2a6ak#vb#a0#x.RaY#xaYaYaY.R#x#x#x#I#xawaYaYaYaY#xaw#xaYaw.Ca0b#aF#vaZaZana7.waz.G.Ga7#uaBaB.0a#aFamambnbnaCa0a0aCa0a0aoa0#IaYaw.Nbl.NaY#MaYbl#DblaY#DawaY.Nblbl#xbn.Ca0#I#xaY.N#Mbl#DawaY#Ibn#Ubn#I#x#D#D#D#D#D#D#s#D#D#saY#Dbl.s#DaYblaYaYawaYaYaYblbl.nbl.nbl.nbl.n#D#D#D#s#D#D#s#D#Lafaja9#paja9aja9af.naf.naf#Laf.7aja9aj.7#Laf.7afajaf#Laja9a9a9afa9#Dbl#sbl.Nblbl#sblaYaYaYaYaY#DaYaY#Dbl#DaYblaY#MaY#Dbl#Da9a9",
+"a9a9afa9#L#L#La2#ga2#La2#ga2a2#ga2#ga2a2#ga2a2bp#L.j#L#L.7#sbj#saY#Iaq.y.waXaraS#vb#a0#UaYaYawaYaYaYbn#x#U.Cbn.Caqaqavaqavaqaqaq#Ia0ao.5#vana7bh.Ga6al#aarbkaz#uaOamam.Cao#x#IaY#I#x#I#x#I#x#xawbn#xaw#D#D#D.sbfaY.N.saY.saY#D#D.Naw.N#saY.s.Cava0am.C#IaYaY#D#M.N#x.bbnaCa0a0#x#s#D#s#D#Da9#Da9blblbl#Mblblbl#MaYawblaYaYawaY.saYaYaYaYblblblbl#s#D#D#D#D#s#D#Daja9af.nafa9.na9.na9a9.na9#Lajaf.7af.7#L.n#L.E#Laf#L#Laf#La9a9.7a9a9a9a9#D#D#M#Dbl#Dblaw#DaYawaYaY#saYbl.Naw#DaYawblaYblbla9a9af",
+"afa9.7a9#L#L#L#L#La2#g#La2bpa2bpa2#L#g#L#g#L#ga2#Lbp#Laj.7bj.s#D.Waoao.waX#aazaSaFa0#xaYaYaYaYaYaYaY#xa0a0.Caoa0.8.8.5ao.5amaoamaCaoam#v#ubh.G#eayaTay.Gaza7aBa#aoaC.CaC.CaYaY#Mbf#x#xaY#xawaYaY.NaYaw#D#s.N#xaNaw.Nbl.Nbl.N.N#s#x.NaY#D.NaY#xaqa0aoa0#x.NaY#MaY#x#xbnbn.Vamaoam#D#D#D#s#D#sbja9.N#M.Nbl.N#M.NblblaY.RawaYaYaYaYblawblaYawaYawaY#D#s#D#M#D#D#D#Daf#L#La9a9.naf#La9af.n#L.nafafa9aj.7aj.7#L.7#L.Eafaj#Laf#La9a9a9aja9a9.na9bl#D#D#DblblaYaYaYaYaYaY#DaY#DaYblbl#DaYaYbl#sbl#Da9a9",
+".7a9a9.7a9a9.7a9#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Lafa9a9#D#sbl.s.Waoan.G#Ea7aBaZ#vaFama0aCamamamb#.Va0aC.VaO.0#uaSaSazazan.Gak#a.Iay.Iar.Xar.Gazaz#uaB.yaO.5aoa0#Iaw.NaY.saY.N.N#D#s#D.N.N.N.N.s.NaY.NaY.NaY.saYa9bl#sbl#sbl.nbl#D#s#DawaY.saYawaY#x#U.CaC#xbf.N.s#I#x#Ia0aoamambf#I.N#D#DaYaY#Dbl#D#Dbl#D#Dbl#D#M#Dbl#Daw#D#M#DaYaYawaYblblaY#D.na9a9.na9.najaf.nafajaj#L#L#Laj#L.E#L.n#L.E#Lajaf#Laja9aja9.7a9#Lafafaj#L#Lajafa9a9a9bja9#D#D#sblaY#MaYaYaYaYaYaYaYawaYaYaY#xaY#UaYaYbl#Dafa9#L",
+"a9bja9a9.7a9a9.7#L#L#L#L#L#L#L#L.E#L#L#L#L#L#L.7aj#L#sa9#saY.saYbo.5.w.GazaB#San.l#vbgama0#xama0ama0a0bgaFbmanazak#aar#eazaz#aa6.e.e.XaraSazbhan#S#v#vaFaoa0aC.Cawaw.Naw.Naw.Naw#Da9#s#D.s.N.s.N.NaY.s.Naw.NaY.Nbl#saYblbl#Dbl#D#D#DaY#D.NaY.N#x#Ibna0a0a0.C#I#x#x#I#xaCamaFaOamaYaYaYaY.N.Nawbl#s#Dbl#D#sbl#D#Dbl#Daw#Dbl#Dbl#D#Mblblblaw#Dawbl.na9.na9.na9a9.naf.n#L.7aj#Laj#Laja9aj.7aja9aj.7#L.Eaf.7#L.7af.7afaj#L#Laf#Laf#La9.7a9a9b.a9#D#DaYblaYaYblaYaYaw.RaYbnaY#U#xbnbna0aYaYaYbl#Da9a9",
+"a9a9a9a9a9a9a9a9#L#L#L#L#L#Laf#Laf#Laf#L#Laf#Lafa9a9a9#D#D.Naw.N#x.8.w#e.lbma#az#uaZaFa0aC#x#x#x#x.WamamaF.y#ealayaG.G#eanaS#e#a.I#a.X.JanaZ#Sa#aOambga0.W#x#x.saY#saY.NaY.NaY.N#D#D#DaY.NaYaY#xawaYaYaYaYaY.saY#Dbl.N#M.Nawbl#D#M#D#MaYawaY#x#xbnaCam.8.5amamaCa0a0aob#aOaObm#v#x#I#x#xaY.N.NaY#Dbl#Dbl#D#Dbl#D#Dbl#Dbl#Dbl.sbl.N#Daw.NblaYblaYa9.n#p#sbl#Ma9bl.na9.na9.7.E.7.7.na9.na9a9.Ea9.n.7aja9.na9.Ea9.7af.7af#Laf#L#Lafa9a9a9#Da9#D#D#DblaYblaYawaYaY.R#xawaYaYaYbn.Cbn#xaYaYaY#D#D#D#D",
+"a9a9a9a9a9.7a9a9a9a9a9#Laf#L#L#La9.7.na9a9a9a9a9a9a9#s#D#s#D.Nbl#I#v.G.G#uaF#van#uaZ.8a0bnbnawbnavam.5#van#ealbra6#a#e.wana7#e#e.fakaz.TaBa#a#aFa0aoa0.Wbn.s#M.N#saY.sbl.saY.saY#s.Naw.Naw.N#I.N#x#I#x#x#IaYaY#IaYawaYawaYaY#xawaYaYaY.NaY#x#x#Iamb#aFa#a#aOamamamaob#b#aF#Sbmbmaoa0#x#xawbl#D#D#Dbl#D#sbl#Dbl#sbl#D#D#sbl#D#D#D#Mbl#DawblaY#saY#Mbl#Dbl#M#D#M#M#Da9#sa9.n#D#D#sa9.Ea9b..na9.7a9.na9.n.7.7a9.7a9aj#Lafaj#Lafaj#La9.Ea9.7#D.E#D#DblaY#MaYaYaYaYaYaY.R#x.R#xbn#U#xbnbnaYaYbl#Dbl#D",
+"a9a9a9a9afa9afa9af.nafaf#Lafa9a9afa9a9a9a9.na9.n#D#D#D#D#D#Daw.N#I.y.GazaZb#aOa#anaBa#aoa0aCbna0a0.5.8an.G.2.K#P#q#e.6anan.wazakazbha7aZaFam.8am#xaC.C#I#IaY#D#saY#saY.NaY.NaY.NblaYblaYaY#I#x#x#x#x#I#x#x#x#xaYaYbn#xbn#U#x.baY#x.s#x#x#I.Ca0.CbgaF#vbma#a#aOambgamb#aoaFaFaOaF#va0#x#I#x.Na9#D#s#Dbl#D#Dbl#D#Dbl#Dbl#D#Dbl#Dbl#DaYblaY#Dawbl#DaYaY#MaYawaYawaY.nbl#p#sa9#sa9#D#s#D#Da9#D.n#D.na9.na9a9.n#Da9#D#Lajaf#Laf#Laf#La9a9a9#Da9#Da9#DaYblaYaYblaYawbnawaYaYaYaYbn.Cbna0.Cbn#xaYaY#Da9",
+"#pa9a9a9a9a9a9a9a9a9a9a9a9a9a9.na9a9a9a9a9a9#Da9#D#s#D#s#DaY.NaYaCaZ.6az.0aOaF#van#uan#vamamamamaOa#analba.g#P#P#a#Tan.y#uaZaza7an.laZa#bgama0.C#U.C#U#I.N#s#s#D#s.Naw.N#M.NaY.saYaw.Naw#x#x#x#U#x.baYbnaw#xawaY#Ubn#U#x#Ubn#xbn#xbn#Ia0a0a0aCa0b#.t.tbma#aFaFb#amamamam.Vb#b#.V#Sbga0#x#xbl#D#Dbl#Dbl#Dbl#s#Dbl#D#M#D#Dbl#sbl#Dblaw#DawblaY#DaYawaYaYaY#Ibn#Ibn#Mbl#s#D#D#Db.#D#sa9#s#s#s#D#s#D.n#D.na9#D#D#s#Dafafaf#L#Laf#L#La9a9.7.nbja9bj#DblawblaYaYaYaYaYaYaY#x.R#x#xbnbnbnawaYaYbl#Da9a9",
+"a9a9#pa9#pa9#pa9a9a9a9a9a9a9#pa9a9.n#p.nbl.n#pa9#D#D#D#D#D.Nawbfbn#vazaS#SaF.8#vaZ.6aBa##va##v.0a7.faG#PaD#V.Kay.XazanaB.0#vbm#SbmaZ#vamama0aC#xa0.W#x#x#I.N#D#s.N#M.NaY.NaY.saYaYaYaYaYawbn#x#x#x#xbn#Ibn#x#x#xbn#xa0bna0bnaCbn#xa0#x#xbn.Ca0am.V.Vb#aOaFb#bgamaC.C.CaCa0a0aCa0a#aFbgbnaY.N#D.7#D#M#D#Dbl#Dbl#D#D#Dbl#D#Dbl#D#D#M.NblaY#DawblaYaY#Ibn#Ibn#Ubn#IaYawaYawaYawaY.s#D#s#Da9#sa9#s#D#sa9#Dbl#s#D#D#Daj#L#Lafaj#Lafaja9a9a9#Da9#D#Da9blaYblaYawaY.R#xaY#M.RaYawbna0#IaYbl#Da9a9afafa2",
+"#pafa9afa9a9a9a9#pa9#pa9afa9a9a9#p#p#D#pbl#p.na9#D#D#D#DaY.NaY#Ia0#v.Gaz.0#vaF#vanaz.w#u.0#u.waP#A.f.Xa6.Ia6akaSanaZa#aFaoaFaOaF#SaFaFama0aC#x#x.Wa0.W#Ibf.N#sbj#M.N.saY#s.NaY.NaYaYaw#xaY#x#I#x.R#x#x#x#xaYbnaY.Cbnbn#xbn#x#xbn#x#I#xbn#xa0.Ca0.pb#b#aFb#aFb#.V.C.C#x.CaCa0#xa0.FaFaOa0aYbl#D#sbl#D#Dbl#Dbl#s#Dbl#D#M#Dbl#D#M.Nbl#DaYblawaY.saY#UaYbn#x#U#x#Ubnaw.Rawblaw.NawaY#s#s#s#s#D#s#D#sbl#Mbl.n#Dblbl#Dafaj#Laf#Laf#L#La9.7a9.7#s.7#DbjblaYblaYaYaYaYaYblaY#xaY#x#xbnaYbla9#p#p.naf#La2",
+"#L#La9a9a9afa9af.j#L#La2af#La9a9#sa9#s#D#DaYaYblawaYaY#I#xbn.Ca0#Ubg.laz#uaBanaBa6#a.Xa6#aak#ebh#Sbm.Fa#aFb#amaoa0aCa0aoa0amb#.8b#aoa0aCa0#xaC#x#I#xaY.N#M#D#D#s#D#sa9.7a9.7.n.7#D#D#D#s#DaYaYaY#sbl#Mbl#Dbl#D#Dawbl.Naw.NaYaYawaYaYaYaw#DaYbl#DaY.RaYaYbnbna0a0#Ubnbn#x#x#x#I#xa0bgaBb#a0.s.s#L.NaY.N.saY.N.NaYbl.NblaY#I#x#x#x#Mbl#MaYaY#x.b#x#xbn.Wambgamamam#Ua0bnaCa0a0amaoaw#x#x#x#I#Iaw#Mblbl#sblbl#D#D#Da9#pa9a9a9a9#Laf.na9a9a9a9#paf#pa9a9#MaYaY#x#xbnaw.RaYbna0a0a0aY#D#pa9a9#La9#L#L",
+"#L.7#Laf.7a9.7a9#Laf#Laf#La9.7#Da9a9blbl.Nbl#DaY#xaYaY#xaCa0amam.t#uazar#e#T#a#zacbaayaraS#uaZa#aFaFaFb#amaoama0a0a0aCa0a0ama0amaoa0a0a0aC#xaC#xbn#I.saY.s#D#sa9a9#sa9a9.Ea9.7a9#D#s#DaY#D#D#s.Nbl#D#D#D#D#Dbl#DaY#DaY#Dblbl#DaY#D#Dbl#DaYbl.NaY.baYaYaYa0#Ia0a0#x#UaY#x#U#x#xaYbnam.FaOa0#x.s.7aY.saY.NaY.NaY.sblawaY.N#x#Ibn#xaYawaY#xawbnaY#U#x#IaCa0aCbg.paobn#U#Ua0aCaCaCb#aCaC.C.Wa0.C.baYawawaYblaw#D.s.Nbla9#p.nafa9ajafa9#pa9#pafa9a9a9#pa9blaYaY.b#xaYaYawa0#xa0a0#UaYbla9a9a9a9#L.7#L",
+"#Laf#La9.7af.7af#L#Laja9.7a9a9bj#D#D#D#MaY.NaYaY#MaY#Ua0amam.5.5aSal#PabbrayaTaTaGara7aZaZaZbm#vb#amamaCa0#x.C#x#I#x#x.CaC.CaC.5b#aob#aCamaC#xbn#I#xaY.s#D#sa9#s#Da9.Ea9.7a9.Ea9#D#D#D#D#s#D#D#D#Dbl#D#M#Dbl#sbl#DaYblaY.saY#DaY#MaY.Nbl.sbl#D#DaYaY.baYaYbn.CbnbnaYaYbn#x#x#x#xaYbnam#Sama0.N#s.NaY.Naw.Naw.NaY.NblaYaw#x#x#x#IaYaYawbl#x#I#xa0#Ia0aC.pbgb#bgb#.pa0.V.pb#.Vb#bgbm.taOaFaFao#U#x.bbn#IaYaYaY.NaYbl#Dbl#Da9a9a9a9a9a9a9a9a9a9.na9a9a9bl#DblaY#x#xaY.R#xaCama0#x#xbl#s#Daf.7af.7#L",
+"#L#L.7a9.7a9a9.7af#La9a9a9#D#D#D#D#MaYaY.N#x#I#x#xaY#x#xamaO.0bbaT#PaD#VaTaRar#eaBaZbmaFaFamb#ama0aCama0.C.C#x#I#xaY#I#x#x.W.CaCaOaFaob#aoamaC.C#I.b.NaY#s#Da9.7.n.7a9.7.n.7a9.7#D#D#D#D#D#D#D#D#D#M#D#Dbl#D#Dbl#D#D#sbl#Dbl#D#D#D#D#Dbl#D#Dbl#DaYaYaYbn#x#x#x#IaYbnaY#IaY#xaY#IaYbna0aBbmao#x.NaY.saY.NaY.NaY.saYaw.NaY#x#I#x#xaw#x.N#I.C.CavaCaFaOa#aBa##vbm#Sbm.taFbmbmaZaBbh#kbhbhaZ#Sa#b#a0aCa0a0#U#xaYaw.Nbl#Mbl.n#D.n.7a9a9.na9a9#sa9#Da9a9a9.n#D#D#xaY#xawaYbnama0ambnaYblbl#Da9#Da9#L.7",
+"a9a9a9afa9#La9a9.na9a9bj.n#D#D#saY.NaY#x#x#x#x#x#Ubnambga#.0#u#uaH#4#aazanaBaZbm#SaFaOb#bgamamama0.C.C.W.C#Ibf#xbf#I#x#x.C.Cao.8a#aOaOamaoa0.Wa0aY#xaw.N#D#s.7a9.7.n.7a9.7#L.7aj#D#D#s#D#D#D#s#D#D#Dbl#D#Dbl#D#Dbl#D#D#Dbl#D#Dbl#D#Dbl#D#D#D#DblaY.NaYawaY#xbn#xaYaYaYbn#x#x#x#x#U#xamaBaBaBa0.Caw#xaY#IaY#xaY#x#x#x#Ibn#xa0.Wa0.CaoamamaCamao.5azaz.G.Gar#e.G#a#eaz#ear#e#a.X#a#jaGak.faSaZ#vb#ambga0a0a0#I#x#xaw#xblaY#Da9#Da9#D#D#Da9#Da9#Da9.na9a9#D#DblaY#x.Rbna0.Cama0#x#xbl#Dbla9#D.7.7a9",
+"a9.7a9.7a9.na9.7a9.7#s#D#D#D#D.N#x#x#x#I#x#x.Ca0amaOa#.yanaBan#u.6aBa#amb#a0b#amamb#amamamaoa0aoa0aCambn.C.C#x#Ia0.C.CaCamao.5aO#vaFaOb#aoa0a0.WaYaw.NaY#s#D.7.n.7a9.7.n.7a9.7a9#D#D#D#D#D#D#D#Dbl#D#Dbl#D#Dbl#D#D#Dbl#D#D#D#D#Dbl#D#D#D#Dbl#D#D#sbl#D.NaYaYaY#xaYaYaY#xaYaYaY#xaYa0a0bmaz#uaOam.C.W.C.C.C.C.W#x.W#xamamamaoam.5aoaF#v.y.0#uaB.wal.2ayal.2aya6aTa6alaR.2ayayaT#P#t.K.e.X.GaSaZaBaFb#amaoa0a0bna0aYaYawblbl#sa9bj.n.7#D.7a9bja9#Dafa9afa9bl.Naw.N#U.CaCaFaoamama0aYaY#D#D#Da9#L.7",
+"a9a9.na9.7a9a9a9a9#D#D.N#s#DaY.saY#x.C.Ca0aoamao.0aZaBaZaB.0aBa#amb#a0aCaC.pa0a0aob#ama0am.C.Ca0.5b#amaCam.W.C.CaCa0ao.5amaOaF#vaF.8amamama0aqa0aYaw.Naw#D#Da9.7.n.7a9.7.7af.E#L#Da9#Da9#Da9#Da9#Da9#Da9#Da9#Da9a9a9afa9afa9afa9a9a9a9a9a9a9a9a9bl#D#Dbl.N.NaYaYaY.RawbnaY#x#I#xawa0b##Sazbha##vamaqao.Cavamao.5ao.5.8.8aF#v.0.yaZaB.waza7az.G.G#aararar.X#a.Xar#eazazaralalalayayaya6.Ial.XaSaS#va#aFaO.5aC.CaC#xbnaY.N#M#D#D#D.7a9.7.Ea9.7.7.Eaf#La9#D#D.N.NaYbnbnamamb#aoama0aYawblaY#D#D#D.7",
+".7a9.7a9a9a9.Ea9bja9#s.NaYaw.NaYa0.Wa0aCamamao.5a7az.waZa#aFaFaFamamaC#xbn#xam.5amamamaoama0aoa0aOaFaoambgamaCam.8aFaOaFaOaFaF#vaFaFaOb#aoamaCamawaY.Naw#D#D.Ea9.7a9.7.n.7.7a9.7#D#D#D#D#D#D#D#D#D#Dbl#D#Mbl#D#Ma9a9a9a9a9a9a9a9.na9a9.na9a9.na9#D#D#D#DblaY.saYaYaYaY#xaY#xaY#xaYbnaObmazaZ#Sa#.8.8.8.5am.8.5.8a##va#.ybbbb.w#uazarar#a#eazaSaz#ua7aZaZaZaZ.Tbm#SbmbmaZan#uaSaz#aalaR.2.IaGaraSaZaBa#aFaoama0aC.R#IawaYbl#D#D#Da9.7.7a9.7.7a9.7af#L.na9#D#s.N.NaYaCamaoaFamama0aYaYaY#D#D#Dbj#D",
+".N.N.N.N#D#D#D#DawaY.Nbf#xaqaqavamamaF#v.0#u.w#e#va#b#.5amamamaF#I#x#x#x#Ia0#x#x#x#I#x#xa0ao.5amamaoaFa#a#aBaZaZ.TaBaZ#SaFaFaF.5ao.5aoam.C.W#x#xaYaY.saY.N#s#D#Dajafaja9a9a9.7a9#Da9bja9#D.7#Da9#Dbl#Dbl#D#Dbl#D#Da9.7a9.7a9a9bja9#Da9#D#D#Dbl.Nbl#Dbl#D#D#Dbl.NaYaYaYaYaYawaYaY.Nbfa0b#bmaBana#bma#bm#u.6#T.oaR.Gararal#aalalal#Taraz.6#uan.0.0b#.8b#aob#aoambgamam.8aoamaO.8aFaBbhaz.Gar.X.X#abhazan.TaZbmbma#aCa0#xaYbfaY#s#D.s.N#D#D#sa9.7.7#s.7.7.7a9a9#D.7#DaYam.5aOa#amambf.N.N#s#D.NaYbf",
+"aYaYaY.saY#s#D#D#D.s#x.Wao.8aq.5.yaB#uanaBan#uanaFaOamaob#aoamaobn#x#U.Ca0.C.C.Wbna0a0aoaF.5#va#.ya#.yaBaZaBbh#u#SaBaZaOa#.8aFbg.5aoamaobn.Cbn#x.sbl.NaY#D#Da9#Daf#L#La9.7a9a9.7#D#D#D#D#D#D#D#Dbl#Dbl#DaY#DaY#D#Da9a9.7a9#D.7a9a9a9a9#Dbl#D#D#D#D#D#D#D#D#D#D#DaYaYaYaYaYaYaYaY.N#x#xbgaFaZ#ua#bgaF#vanaz#ealalazazaz.Garaz#q#ebhananaZaZa#a#a#aCama0a0aoa0ama0aqaoamamaFaoam.8a##SaZ#uana7aSbhaBaZaZbmaOaFaOaFb#ambnbn#IaY.NaY#D#D#D#D.7.7b..7#D#Da9.7#s#D.n#D#MaY#Iama#aFaoa0#x.saY#D#Dbl.N#x",
+".Nbo.N.N#xbf#xbf#x#Ia0a0aOa#aBaz.GaP.wan.ya#a#a#aCamambgama0a0a0.Wa0.C#xa0a0a0amamaoaFama#a#.0#vaSazbh#uanaBanaZa#aOaFaO.5aOaqamaoama0.C.C#Ibn#IaYaYaw#D#s#D.E.7#Laf#La9a9.7a9a9.7a9.7a9.7a9.7a9#D#D#D#D#Dbl#D#Da9.7#Da9.7a9.7#Da9.na9a9#D#Dbl#Dbl#Dbl#Dbl#D#D#p#D#D#D#D#D#D#D#D.N#DaYa0b##SaBaZamamaF#v.0#u.6.wan#u#uaSananaZaBa##vaFaFaoamamama0a0aCa0bna0#xaCa0a0.Cao.CaoamaoaF.5aOaFaFa#aFaFaF.5aoamaFamaFaob#bga0aobnbn#x#x#M#Dbl#s#Da9.7a9.s#D#D#D.N#DaY.N#Daw#xa0aoaF.5b##IaYaY#DawaYaw#x",
+".N.N#Ibf#x.W.C.W.5#v.yaZ.G#z.Kba.o#e.w.0a#a##va#amamaOaFaOaFbgamama0amaoam.8.5.5a#aFaFa#aBan#ubh#a.Xar.Gbh#uaZaBaO.5aoamamaC.C.Wa0a0.W.C#I#x#x#xaY#saY#D#D.7af.7af#L#La9a9.7#D.7#Da9.7a9.7a9bja9a9a9a9a9a9a9a9afa9.7a9.7#L.7a9afa9a9a9a9a9#Da9#D#Dbl#D#D#D#p#D#D#D#D#Dbl#Dbl#Dbl.s.NaY#xa0a#aB.0amamamaFa#a#a#a#aBaZaZaZ#va#.0a#b#b#bgamambn.Cbn.Wa0.C.C.C.Wa0.C.C.C.Wa0.Ca0.Ca0aoamama0a0bn#Ubn.Wa0.Ca0.W.C#U#xb#.Vb#b#a0ama0a0aYaY#D#D#D#s#D#saYaY.s.NaYaw.NawaYaY#Ia0amamaOam.C#x#xaYaw#x#x.C",
+".C.W.Caqaq.5.5.5anaP.o.Ya8#obs.g#TaS.wan.0#va##v.0bm.0a#.0a#a#.yamaoaFamaOa#aOa##va##S.0aZ#uaSaz#aaG#a.Gaz#uan#u#vaOam.8aCaq.W.C.C.Wa0#x#x#x#IaYawbl#D#sa9a9#L#Lajaf#L.na9a9.7a9.7a9#D.7#Da9.7a9a9a9af.7afa9.7a9.7af#L#Laf#La9.7afafa9.na9a9bl#Da9.na9a9a9a9a9afa9.na9a9.7a9a9a9.N#D.N#M#xaOaZaBamaOam.8am.8a#.5a##va#aoaFaFamamaoa0a0bnaC#x#x#x#x#I#xaY#xaY#xaY#I#x#x#x#I#x#I#xa0bn#I#xawbl.Nbl.Naw.NaY.NaY#xaYaCa0ao.Vbgb#b#b#awbnaYaYblblaYbl.NawblaY.NaYaYaYawaY#x#Ia0bga#aOamaC.C#xa0.Wa0am",
+"aoaFa#aOa##v.y.ya4.2#4.4a8aDaTaRanananaZaBaFaFaF#v.0#v.0#v.0#v.0amb#aob#amam.5aFamaOaFa##v.0.yaZaz.wanazaz.w.w.waO#vao.5aoamaCam.Wa0#x#xaw#xaYaY#D#M#Da9a9.E#L#L#L#Laf.7a9.7#Da9.7a9#L#L#L#L.7#L#L#L#L#L#L#L#La2#La2#L#L#L#L#L#Lafajafafa9a9a9afa9a9a9a9a9afa9a9a9.7a9.7a9a9.7a9.N#D#D#DaYam#SaZaF.5aFamamamamaoaFamamb#amamaoa0a0bnaC#x#x#xaY#IaYaYaYaYaYaYaYaY#xaY#IaYaYaYaYaY.s#xaY#D#D#D.7.n#D#D#D#M#D.N.saY#xa0a0amamambgambnbn#UaY#x#xaY.saY#x.NaYaw#x#I#x#x#I#xa0a0aF#vaZ.5a#amaCa0am#v.5",
+"an#uan#uan#ua7#uaz#a.Gaz.GaSaZaZ#vbybca#.5aoamb#.5b#amb#amb#amb#aCama0amamaob#amaCa0a0aoaFaFa#byaOby#v.yaZaB#u#ua##v#S#v.5ao.5aoa0#I#xaY#x#IaYaw#Dbla9#s#L#L#La9#Laf#La9#La9.7a9#L#L.7af.7af#Laf#L#L#L#L#L#L#L#Laf#Lafa2af#L.3#Lafafafafa9afa9a9#Laf#Laf#L#Laf#L#L#L#L#L#L#L#L#L.s#D#s.7#DaCa##ua#.0.5.5amama0a0amaoamaCamaCa0#xbn#x#x#x#xawbfaY.N.N.N.s.N.N.s.Nbl.Nbl.NaY.NaY.Nbl#D#D#s.7.7#D.7a9.n#p#Dbl#DblaY#x#x#xbnbnama0am.Vama0b#aCa0#x#xbn#I#x#x#xbnbn#x.Ca0a0aCam#van.wan#vbyaF#va#.yan",
+"alal.Ga7bhaZaZaZa##Sa#aFb#ao.5.8aFaFamama0amamaobn#Ubn#Ua0#Ibn#Ua0a0a0aCa0amamao#x#xaCa0aoamao.5avam.8.8#v.yaB#u#SaBaB#u#S#vaO.8amaCbn#x#I#xawaYbl#sa9a9#La9.7ajafaj#La9#L.7#Da9.7#Laf#L#L#L#L.7a2#ga2a2a2a2a2a2#La2#L#La2#L#L#La2af#Laf.na9a9a9af#Laf#La9af.7af#L#L#L#L#Laj#L#L#D#D.7#s#D.CaBbhbb.y.0aOama0aoa0ama0ama0bnbn#xaYaCbnbn#x#xaYaY.Naw.NaY.NaY.NaY.NaY#DaY#M#Dbl#M#D#Da9.7a9#Dbjb..7afa9.na9bl#DaY.N#Ibf.W#xaC.Ca0amamb#b#a0ama0ama0#xbn#x#U#x#U.C#UamaCama0ao.0.w.6.wan.yan.yan.waP",
+"#q.6a#aF.5aCa0a0bnbna0aCa0amb#am#U.Vbnbn#xa0.C#x#x.NaY.NaY.N.N.N#D#s.NaY.NawaY.N#M.s.N#x.C.Wamaq#UaCaCb#bgaOa##vbg#v#v#u.w#uaZ.yaO.5aoama0.RaYaw#D#D.7.n#Laj#L#L#L#La2#La2#La2#g#Laf#L#L#L#La2#La2#L#La2#La2#L#La2af#L.3#Laf#Lafajaf#La2#La2#La2#L#L#Laf#La2#L#L#L#La2#L#Laf#L#La2#La9#D#x#xaoaO.Xbha#ama0#x#x.CaC.Ca0aC.C#x#IbnaYaYawaYaYaYaYaY.N#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D.7.E.7.7.7af.7.7aj#L#L.7.E.N.N.NaY.N.N.N.NaY.NaYbl#IaYbna0aoaFaOamaoamamamaFaF.5b#aOa#a#aZ#u#a.2.waP.w.w.waZan#u",
+".GanaB.5a0a0#xaCbn#Ibna0a0a0amam.Va0bnbn#x#x#I.C.NaY.Naw.N#s#D#D#D#D#s#D#D#D#saY#D#DaY.saY#x.W.Cbn#Ua0aCaoamaOaFaob##v#uaB.y#vaOa#aO.5bga0#U#x.R#D#D.n.7.7#Lbp#L#La2#L#g#L#g#La2#L#L#Lafa2a2#La2#L#La2#La2#La2#Lafa2#L#La2#La2#Laf#L#Laf#Laf#L#L#Laf#L#La2#La2#La2af#Lafa2#L.3#L.j#La9#DaY#xa0#v#aa7a#b#a0bn#x.C#x#x#x#x#xbn#x#x#IaYaYaYaYaYawaY#D#D#D#D#D#D#D#D#Da9#D#D#Dbj#Da9a9#La9af.E.7a9#Laf#Laf.7a9#D.N.N.saY.Nbl#DaY#D.NaYaYaY#xa0b#.5aFbga#aFaFbma#.ybm#vaZ#SaBan.G#q.2.w#u.6#uan.y.0.0",
+".6#u.0b#a0#x#xa0bnbn#x#xbn#Ibn#x.RawaY#x#I#x#xbfaYaw.N#D#D.7.7.7a9#D#Da9#Da9#D#Da9a9#D#D.N.N#x#x#I#x#Ia0ao.8am.8aCa0bg#v#vaOb#aoaFaOaFama0a0#Ubn#s#D#Da9.E#L#Lajbpa2#ga2a2aja2#gafa2#La2#La2#La2#Laf#La2#L#Laf#La2#Laf#Laf#Laf#L#Laf#L#Laf#La2afa2#La2af#La2#L.3#La2a2#L#L#L#L#La2#La9#s.N#xa0bg.Xana#aFamam.C#xbn#xbn#x#x#x#xbnaYaYaYawaYaYaYaY#Da9#Da9#Da9#Da9.7#D.7a9.7a9a9.7.7.7.7.7a9#L.7.n#L#Laja9a9#D.saY#D.N#D#D#D#D.saY#DaYaYa0a0amb#aFbm#SbmaBaB#ubha7aB#u#uazaz#Tal#q#uanaB.0a#.0a##u",
+"azaBa#aobn#x#x#x#x#x#Ibn#xaY#xaYaYaYaYaY.NaY.NaY#D#D#D#D#D.7a9.7#sa9a9bja9.7#D.Ea9bj.n#D#D.NaY.N#MaYaY#Ia0aoaoam#IaCa0ao.5ao.CaCbg.5b#aoa0aC#xa0aYaY#s.7a9#Lbp#La2bpa2#L#g#L#ga2#Laf#L#La2#La2#La2#La2#La2#La2#Lafa2#Laf#L#L#L.3aj#L#La2ajaf#L#La2#L#La2#La2#La2#La2#La2a2a2afa2#La2#L#DblaY#IamazaSaBaFama0#x.C#xaY#xaY#x#U#x#xaYaYaYaYaYaYaY#D#D#D#Dbj#D#Dbj#Da9a9a9.7a9a9bja9.7afa9aja9.7af.7#Lafa9a9#D#D#D#D#D#D#D#D#D#D#D.NaY#I#xbnaoamam.5a#bma#aZaZaZaZ#uaZanaz#q#TaR.o#q#uaB.0a#.0#uaZ#u",
+"an#vb#a0#x#x#xaYaYblaYaYaYaYaYaYaYaYaYblaY.N.N.sbl#D#Da9#D.7a9#L#D.7#sa9.7a9.7#Da9a9#Da9a9#s#D.Naw#Daw#xaCa0.C#x#U#xaCaoaCa0#Ibna0a0aoa0aCa0a0#UaY#M#D#Da9.7#L.7a2a2#ga2a2#ga2#g#La2#La2#La2#La2#La2#La2#Laf#L#Laf#Lafaj#Laf#L#Lafa2af#L#La2#Lafa2#Laf#La2#La2#La2#La2#L#La2#L#La2#Laj#Dbl.NaY#UaZ.TaBaFam.C.C#xaYaYaYaYaYaY#x#xawaYaYaYaYaY#Dbl#D.Ea9a9.7a9a9.7#D.7#Da9bja9.7a9a9.n.7a9a9a9.na9a9a9a9.na9a9a9#D#D#D#D#D.7#D#D#DaY#x#x#xbna0aCamaFaOa#bma#bmaBaZaZaB.6.Gal.o#e.GazanaBaZ#u#u#uan",
+"#vaFama0awbnaYaYaY.NaY#D#DaY#D#M#Dbl#s#D#D#s#D#D#Dbl#D.n#Daf.E.7a9a9.7a9a9a9a9a9.7a9.7a9.7a9a9a9#D.n#D.N#x#I#I.W.C#I.Caoam#U#xaw#Ia0#I#x#x#I#x#IaYaY#Dblbja9a9#L#La2bpa2bpa2#La2#Laf#Laf#La2#La2af#L#La2#La2afa2#Laf#L#Lafaj#Laf#L#L#La2#Laf#La2#L#La2#La2#La2#L#La2#La2#L#La2#L#L#Lafa9#sblaY#xb#bm#SaFambn#xaYaYaYaYaYaYaYaYaYaYaYaYawaYaY#Dbl.7a9bja9.7a9bja9#L#L#La9.7a9a9.7a9.7a9a9.7a9.7a9a9a9a9a9a9a9a9a9#D#Da9#D#Da9#Da9.N.NaYaY#x#x#xaYa0ama0am.5aF.5a##vaZan#TaR.Gazana7.wan#uaZan#uaZ",
+"b#a0#xaYaYaYaY#x#DaY#D#D#M#Da9a9#D#D#D#D#Da9#D#p#Da9#D.7a9.7#L#La9a9a9.7#L#L.7a9.na9a9.7af#L#L#L#La9.7#s.N#I#x#x.C.CaCa0.W.W#xawaYawaYawaY.NaYaYaYawaY#sbl.7#D.7#L.ja2#ga2#ga2#g#La2#La2#Laf#L#L#La2af#L#L#L#Laf#Lajaf#Laf#Laf#Lajafaf#Laf#L#La2#Laf#Lafa2#La2#La2#L#L#L.3#Laf#La2#L#La9a9#D#MaY.b#yaFbgam#x.N#saYaYaYaYaYaYaYaYaYaYaYaYaYaY#Dbla9.7#L#L.7#L#L#L.7af#La9#La9#La9afafafafa9a9a9a9a9.na9a9a9.n#pa9.n.7a9.7a9.7a9.7#D#D#D#s#DblaYblaY#x#xaCa0aCa0amaOaZ#u#q.G.6#uaBana7azaZaZaZaZa#",
+"a0a0a0aYblaYaY#xaYaY#Dbl#Da9a9af.7.7#Da9a9a9a9a9a9a9.n#Da9.7#L#L#La9.7af#L#Lafa9.7a9#L#Lajafa2aj#L.7.n#D.N#xbo#I#x.Waq.8aoa0#I.Nawbl#sbl#DaY#saYawaYaYbl#D#Da9a9#L#Lbpa2#L#g#La2#Laf#Laf#La2#L.3#Laf#L#Lafaf#Laf#Laf#L#Laf#L#Lafaf#L#Laf#Laf#Lafa2#La2#L#La2#Laf#L#L.3#L#L#L#L#L#L#L#L.na9a9blblbn#Hbga0#xaYaYa9blaYblaYblaYblaYaYawaYaYaYaYbl#Da9a9a9a9a9a9a9a9#L#L#L.7a9.7a9a9#La9a9a9a9af.nafa9#pa9#pa9#pa9a9#Da9#D.7#Da9bja9a9.7a9a9a9#D#Dbl#D#saYaY#x.Cbn.WaF#San.Ga4aZa#a#aZ#uanaZaBa#bma#",
+"bnaYaYawaYaY#M.N#D#D#D#D#D#D#Da9a9#D.nbja9.7a9.7a9.7.7a9#La9a9a9.7a9#L#L.7af.7a9#Laf#Lafa9.7a9a9#L.7#La9a9#DaY#Ua0#UaCa0#I#x#I#I.N#s#D#D#sa9#D#Da9#D#s#D#Daw#DaYajaf#L#L#Laf#L#La2a2a2#La2#La2#L#La2a2a2a2bpaj#Lajaf#Lajaf#Lajafaja9ajafajaf#L#Lafafafafa2#L#L#La2#L#L#L.3#L.3#L#La2#L#Lafa9.na9aYbnb#b#am.C.NaWa9bj#D#Dbj#D.N.NaYaY#DawaY#DaY#D#D.7a9.7a9.7a9a9#Laf#Laf#Laf#L#Lafafaf#La9#D#D#D#L#Lafajaf#Laf#L#L#L#L#L#L.7.7.7a9a9.7a9#D#D#D#DaYaY.N#x#Ia0.Ca0aF#vaF#vaOb#aob#aoaFaBaZ.0a#.5am",
+"#U#x.RaYaYaYbl#D#D#D#D#s#D#Da9#D#D.7#Da9.7a9bja9.7a9af.7a9a9.7a9af.7a9af#L#L#La9a2afaj#L#La9.7a9aj#L#La9.nblaYaY#Ia0aC.W#x#I.N.s#D#s#D.n#D#D#D#sa9a9a9#Dbl#D#D.Na9a9a9a9a9#La9#L#Laf#Laf#Laf#Laf#Laj#L.7aj#L#L.7afajafaf#Laf#Laf#Laf#L#Laf#L#Lafafafaf#Lafa2#L#L#L#La2af#L#L#L#La2a2af#L#La9bja9.Rawa0.8a0.C.Nbj#Da9a9#Da9#D#DaY#DaYbl.Nblaw#Dbl#D.7a9a9.7a9a9bjaf#Lajaf#L#Laf#Lafafafa9a9#Da9#D#Laf#Laf#L#L#Lafaj#L#L.7#L.7af.7#La9a9.7#D#D#D#D#D.NaY#x#x.C.CaoaFaFaOaOamamamamaCaF#v#v.0#vb#am",
+"bnbnawaYaYaY#Dbl.n#D#D#Da9bja9bj.n#D.7a9#D.7a9a9a9.7a9a9#La9a9a9#L#L#L#L#Laf#L#La2a2a2af#La9a9a9#L#Laf.7a9#D#IaY#UbnaC#xaY.N.saY.s#D#Db.#D.n#D.7a9a9#Da9#D#D#D#Da9bja9#Da9#Da9#Da9a9a9a9a9a9a9a9#Laf#L#Lafafajaf#La9#Lajaf#Lajaf.7#Laf#L#Lajaf#Lajafaf.3#L#L#L#Laf#Laf#La2a2#La2#La2#La2af.Ea9.naY#xaCamam#x.Nbj#s.7#D#D#D#Dbj#D#Dbl#Dbl.Nbl#Dbla9a9a9a9a9a9a9a9afafafafajafafajafaf.na9a9a9#D#D#Lajaf#L#Lafa2#L#Laf#L#L#La9.7a9a9.7a9a9#Da9#D#D#D#MaY#x#x.CaCa0aFaOaFamaFaCa0a0bnaCb#aOaFaOama0",
+"#IaYaYaYawaYaw#D#D#D#s#D#sa9#sa9.7a9a9a9.7a9#L.7#La9af.7a9a9.Ea9afaj#Laf#L#La2#La2a2a2#La2#La9#L#L#Laja9a9blaYaY#I#U#xaw.Naw#D#Da9#sa9#sa9.7a9.7ajaf.Ea9a9.7a9#D#D#D#D#Dbj#D#D#Da9#D#D#D#sbl#D#sa9a9a9a9a9#Da9#Dafajafaf.Eaf.7afajaf#Lajafaf#Lafafafajaf#Laf#L#L#Laf#L#L#Lafa2#La2a2af#L#La9a9a9aw#x.Vaoa0#x.Nbja9#D#D.7#D#D#D#Dbl#DaY#DblaYaY.Na9a9a9a9a9.7a9a9#La9afa9afa9af#pafa9#pa9a9a9.7a9#Laf#Laf#L#L#L#Laf#L#Laf.7a9#D.7a9.7a9.7#D#Dbj#Dbl.NaY#x#I.Ca0aqbgaFamaoambn.Cbn#U#xbna0aCama0a0",
+"aYaY#IaYbl.N.N#D#s#D#D#D#D#D#Da9a9a9.7a9a9a9a9#Laf#L#Laf#L#Laf#L#Lafa2a2a2a2a2a2a2a2a2a2a2#L#Lafa2#L#La9a9#DaY#Ubn#I#xaYaw#D#s.sa9bj.n#Da9.Ea9.7#L.7#L#L.7a9.7#L#Da9#Da9#Da9#Da9#Dbl#Dbl#D#Dbl#Dbl#s#D.na9#s#D#Ma9a9.n#Laf#Lajaf#Laf#Laf#L#Lafajafafafaf#Laf#L#L#La2#L.3#L#L#Lafa2a2#L#Lafa9.na9#Dawa0bga0#x.N#s#Da9#D#D#D#D#D#D.Nbl#DaYaYaYawaYa9.na9#La9afa9afa9a9a9a9a9a9a9a9a9#pa9a9a9a9a9a9#L#Lafaj#L.3#La2afafa2af#La9a9a9afa9.7a9#D#D#D#D#DaY.N#x#xa0a0aoaFbgama0a0a0aCa0aYaY.baYbnbnaC#x",
+"aYaYblbl#D#Da9.7a9a9a9a9.na9a9.7ajafaj#L#L#La2#L#L#L#L#Lafaj#Lafa2a2#L.j#La2#La2a2a2a2#La2af#L#L#L#L#L#La9#MaYaY#Ibn#MaY#D.s#D#s.7.na9.Ea9.7aj#La2aj#L#Laj#L#L.7.7a9.7.7a9.7a9.7#M#Dbl#MblblaYbl.sbl#Dbl#D#Dbl#Daf.Ea9af.Eafa9af#Lafaj#L#Laf#Lafafafafafaf#Laj#L#Laf#L#La2afa2#La2#L.3#L#L.7#Da9#DaYaCama0#Ibla9#Dbj#D#Da9#D#D.N#MaY#DblawaYaYaY#pa9a9a9#pa9a9a9afa9afa9#p.na9a9#Mbla9a9a9#La9.7afaj#Laf#L#Laf#Laf#Laf.7afa9afa9a9.7a9#D.7#D#D#D#Dblaw#x#x.WamamaOb#aOa0aC.Cbn.C#U.RaYaY.b#xbna0",
+"aYaY#D#D#D#s.7.7a9.7a9.7a9a9.7a9#Laf#Laf#Laf#Lafa2a2a2a2#La2a2aja2a2.3a2a2a2a2a2aaaaa2a2a2a2a2#La2#L#La9a9#DaY#I.RaYaw#D#M#D#s#D.n.7a9.n#L.7af#La2a2a2#La2#L#L#La9a9.7a9a9.7a9a9a9#pa9a9a9.n#pblaYaY#IaY#IaYaw#x.na9af#Laf#Laj#Laf#La9afajaf#L#Lafafafaj#Laf#L#Lafa2#L.3#L#L#L#La2a2#L#Laf.na9.n#D.NbnaCaobn#D#s#D.n#D#D#D.N.NaY#DaY#Dbl.NaYaYaw#D#pa9#p.n#pa9#pa9a9.n#pa9#pa9#pa9#D#pa9afafajaf#Laf#L#Laf#L#Laj.3af.3afafa9a9a9.7a9.7a9#D#D#D#D.NaY.N#xa0ama0aob#ama0a0a0bn#Ibna0#x.bbnaY#Uamam",
+"#MaY#s#D#D.7#La9#L.7.na9a9.7a9a9#L#L#L#La2#La2#La2a2a2aja2#La2afa2aja2#La2a2a2a2#gaaa2a2a2a2a2a2a2#L#La9a9blaYaYaY#MaY#M.N#D.n#D.na9.n.7#L.E#L#L.ja2a2a2#g#L#L#L#Lajaf#Lajaf#L#La9a9#pa9#pbla9.naYawaYaYaY.RaYaY.na9.na9aj.7af.n#Lafaj#Laf#Lajafafajafafaf#L#L#L#Laf#L#La2afa2af#L#La2af#L.7a9a9.7aw#xaCa0#IaYa9#D#D#D#D#D.NaY.saY#Dbl#DaYaYaYaY.na9#pa9a9#p.na9af#p#pa9a9a9#pa9#Dbl#Da9.na9#L#Laf#L#Lafajaf#Lafafafafafafafa9a9afa9a9bja9bj#D#D#D#DaY#x.Wa0av.5.pamaCa0#Ua0#x#xa0bnaYaw.R.Cb#am",
+"amam#xbla9a9a9a9a9a9.7a9.7afa2#Laf#Laf#La2#La2#La2a2a2a2a2a2a2a2#Laf#Laf#La2#L.3a2a2a2a2asa2#La2#gafa9blaYawaYaYawbn#IaYawaw#D#Da9.Ea9#Lafaf#L#L#L#La2a2a2a2a2a2a2a2#La2af#L#Lafajaf#L.na9bja9#D#p#pbl#M#x#Ia0bn#I.NaY#D#Da9a9.7af.Eafa9aja9#Lafa9a9a9a9#Lafa9afajafafafaf#Lafafa2.ja2afajaf#L.na2a9aY.Cbgam#x#Ma9.n#Lajafa9.N.N#pa9bl.N#MaYaYaY#p#pa9#pa9#pa9#p#pa9#p.n#p#p.n#pa9#pa9a9#paf#pa9a9.n#pafafafafafafafa9afa9afa9a9.na9a9a9a9a9#D#D.n#paYaYa0amb#amb#a0a0a0.Ca0#I#xaw#xaY#x#xaCa0aC",
+"ama0#xbla9.na9a9bja9#Da9a9ajaf#La2aj#Lafa2#La2#La2a2#La2#La2#La2af#Lafa2#Laf#L#La2a2a2asa2a2a2a2a2#La9blaYaYaYawaYaY#xawaY.N#s#Daja9#Lafajaf#Laf#L.j#La2#La2#La2#La2#La2#L#L#L#L#L#Laf.7a9#D.n#Da9.nblblaYaY#xaC#x#IaY.s#D#sa9.na9a9a9a9a9a9a9a9a9afa9afa9a9#La9afafaj#Lafaf#Lafa2#La2#Lafafaj#La2.naw.CamaC#xaY#D#D#La9a9#sbl.Na9#M#DblaYaYaY#xbla9#p#pa9#pa9#pa9#pa9#p#pa9#p#p#pa9.n#pa9a9a9af#pafa9afa9a9afa9#La9af.7afa9afafa9afa9a9.na9#Dbl#p#pblbn#U.5bg.5a0aoa0a0#Ua0#xbnaYaYaY#U#xbn#xa0",
+"amaCaYaYaw#Dbl#sa9#D.7a9.7af#L#Lafaf#L#La2#La2#La2a2a2a2a2a2a2a2#L#L#Lafaja2#L.3a2a2a2#La2a2a2a2#ga9#D#MaYaY#UaY#xaw#Ibl.Naw#D#Dafafaja9#L#Laf#La2#La2a2a2a2a2a2a2.jafa2#Laf#Laf#Laf#La9a9.7#Da9a9a9#sblawaY#x#x#IaY.NaY#D#D#D#D#sbl#s#D#sa9a9.na9.na9a9.nafa9afafafafafafafajafa2#L.3#L#Laja9#Daj#DaY.Ca0aoa0aY#D#Ma9.na9#D#DaYblblblaYaYaYaYaYbl#pa9#pa9#pa9#pa9#p#Ma9bl#p#D#pa9a9#pa9#pa9#pa9#pa9#pa9#paf#pa9afa9afa9afa9afa9a9a9a9a9a9a9#Da9bla9awaYa0a0ama0b#a0a0a0#x#U#x#xaw#xaw#xbn#I#xa0",
+"b#b#aCaYaYbl#Dblbja9#D.na9#Lajaf#L#L#Lafa2#La2#La2a2#La2#La2#La2afafaj#L#Laf#L#La2#La2a2a2a2#La2#La9blaYbnbn.R#IaY#U#xaYaw.N#D#s#L.Eaf#Lafaj#L#L#La2#La2#La2#La2afa2a2a2#L#L#L#Lafajaf.7.n#Da9b.afa9a9a9#DaY#I#x.NaY#saY#s#D#s#DaYaYaYblaY#DaY#Dbla9a9a9a9a9a9a9.na9a9.na9a9a9a9#La2aj#Lafa9a9a9af#Mawa0aCa0a0bn.NaYbl#D#M#DaY.NaYaYaYawaYaYawaYbl.na9#pa9#pa9#pblbla9#p#pa9#p.na9#pa9.n#pafa9af.naf#pajafafafafa9a9a9afa9af.7afaf.nafa9a9af#D#DblblaYaY#xaCa0.Ca0aobnaCbn#xawaYaY.RaYaYaY#xbn#x",
+"a0bnbnbnaYaYbl#D.n#D#sa9a9#Laf#L#L.3#L#L#La2#Lafa2a2a2a2a2a2a2a2#L#Lafaf#L#La2#L#La2#L#L#La2#L#Laf.nblaY.bbn#U#x#Ubn#Ibl.NaYa9.7a9afaja9#Lafaf#La2a2aja2a2a2a2a2a2a2a2a2af#Laf#L#L#L#La9a9.7#Da9#Laja9#D#D.NaYaY#s#D#D#DaY.NaY.saY.saY.NblaY#DaY#sbl#sbla9#Da9#Da9a9.na9a9afa9ajafaf#Lafa9a9#D#sa9blaY#Ua0aob#aC#xaYaw#D#DblaY#IaYawaYaYaYaYaYaYbl#pbla9#pa9#pa9bl#M#p#D#p#M#p#pa9#pa9#pa9a9#pa9#p#pa9#p#pafafaf.nafa9a9#La9afafa9afa9a9afa9#Da9bl.NaYawbn#x#x#x#Ubna0#xbnaY#xaYawaYaw#xawaY#x#U",
+"#Ubn#Uam#UaYaYbl#Da9bja9a9#L#Laf#L#Laf#Laf#La2#La2a2#La2#La2#La2af#L#L#L#Laf#La2af#L#La2#L#La2#Lafa9bl.Ra0.pa0bn#U#xawaY#M.N#s.7.na9#Lafaj#L#Lafa2a2a2a2#La2#La2a2a2a2a2#L#L#L#Laf#Laf.7a9#D.7#Dafaf#L.na9#Daw.N.n#D#D#s#Daw#DaYaYaYaYawaYaYawbla9bla9bla9.n#D#Ma9a9a9#Da9#sa9#p#Laf#La9.7.n#D#D#DaYawa0a0aob#amaCa0aYaYaY#DaY#xaYaYaYaYaYbl#Dbl#p#pa9#pa9#pa9#p#pbl#p#pa9#pa9bl#p.na9a9#pa9#pa9af#pafa9af.na9afa9a9aja9a9afa9#Laf.7afa9.7afbl#D#D#DaYaYaY#xaY#xa0bnbn#U.RawaY.baYaYblaY.R#IaYaY",
+".Rbnb#a0a0#xaYbl#s#D#sa9.Eaf#L#La2#Laj#La2a2#L#La2a2a2a2a2a2a2a2#La2afa2afa2#Laf.7af#La9a9#Lafa9a9a9.R.Ra0.V#UbnaYaYaY#D#D#D#D.7afajaf.Eafaf#L#La2#La2#La2a2a2a2a2a2#La2#L.3.7#Lafaj#La9a9.n#Da9#Laj.7a9.7#D.N.Na9.n#D#DaY.NaY.sbl#Mblbl#Dbl#Dbl#D#Dbl#s#Dbl#Dbla9#Da9.nbla9a9#Dajaf.na9#D#D#D#sblawaY#x#Ub#b#aO.5a0aCaYaYawaY#x#xaYaYaY.sblbl.na9#pa9#pa9#pa9#pblbla9#M#p#Dblbl.n#p#p.na9#p.n#p.na9#pa9#pa9af#pa9afa9a9af#Laf#Lafafa9afa9a9#Da9bl#D#M.NaY.Naw#x#UbnbnaYaYaY#xaYbl#MblaYaYaYaY#I",
+"#Fbn.Vaoa0bnaYblbja9#Da9a9#Lajaf#Laf#Laf#L#L.3#La2a2#La2#La2#La2af#L#L#L#Lafaj#La9#L#La9a9#L#Lafa9blaw.R#Ua0bnbn#IaYaw#D#s#Da9#s#La9#Laf#L#L#L#La2a2a2.j#L#La2#La2a2a2a2#L#Laf#L#Laf#Laf.7#D.7#s#L#L#La9.7#D.sbf.n#Da9#Daw#DaY.N#pbl#M#D#p.n#pa9#sbl#D#D#Dbl#D#D.na9#Dbl.n#Da9a9af#La9.7a9#s#DaYaY#x.baYbnaoamaFaFaoa0#IbnaYaY.R#x#xaYaYbl#Da9#pa9#pa9#pa9#pbla9#M#pa9#pa9#p#Mbl#pa9a9a9#pa9a9#pa9#paf.naf#pafafa9a9a9afa9af.7afa9#L#La9a9af#D#D#D#DaY#D#DaY.NaYbnbn#U#x.baYaYaw#paY#D#MaY#IaYaY",
+"blaw#xa0ambn#xaYawblbl#D#pa9afafa2a2a2a2a2a2#La2#L#La2#La2#La2#La2a2a2afa2#La9a9a9a9a9#D#D#D#D#D#pbl#paY.Rbn#I#x#pa9a9a9a9.7.7a9afajaf.n#Laf#L#L#L#L#La2a2a2#ga2a2bpa2#L#L#L#L.7af#Laf.7a9a9a9#Da9a9#sa9#D#D#D.Na9a9a9#sbl#D#Ma9bl#Dblbl#Dblblbla9a9a9afa9a9a9a9a9a9afa9a9a9a9.nafa9a9.na9a9#D.naY.RaYbna0a0b#aobgb#bg.Va0aCaY#D#Mbl#Mbl#Dblbl#Dbl#Dbl#Dbl#Dblbla9#pbla9#p#pa9#p#p#p#p#p#pa9#pa9#p#p#p#pa9a9afa9aja9afaf#Lafaf#La9afa9#Lafa9a9af#sa9#Dbl#DaYbl.N#UbnbnbnaYaY#IaYaY#MaY#xaYaYaYaY",
+"aYaYbn.Ca0a0#I#xaYaYblbl.naf#Lafaja2#La2#La2a2a2#La2#La2#La2#La2a2a2#L#L#L#L#L#Lafa9af#D#p#Dbl#D#F.nblblaYaYaYaYa9.n.7a9a9.7a9.7afafaf#L#L#L#L#La2#ga2#ga2bpa2#L#ga2a2#L#L#L#L#L#Laj#Laf.7a9bja9.7#D.7#D#D#D.Naw#D#M#D#p#D#p#D#Dbl#sbl#Dblbl#Dbla9.na9.naf#paja9afa9.na9a9afa9a9afajafa9a9a9blblaYawaY#Ua0aC.5am.V.Vb#ama0aYaY#xblaY#DaYbl#M#Dbl#Dbla9bla9bla9bl#D#p.n#pbla9bl#p#p.na9#p.na9#p.na9bl.na9afa9a9a9a9afa9#La9af.7afa9a9#Laf#Lafa9a9a9a9a9#D#DaY#saYbnbn#U#x#UaYaYaYaYaYaYawaYaYaY#x",
+"aY#xbna0a0a0a0bnaYaY#Mbla9a9a9af#L#Laf#L#L#L#Lafa2#La2#La2#La2a2#La2afa2af#L.7#La9a9#D#D#D#D#DaY#pblbl#MaYaYbl.Na9a9a9.7a9#L.Eaf.naf#Laf#L#L#L#La2a2bpa2#ga2#ga2a2#L#L#L#L.7a9a9a9a9afa9a9#D#D#sa9.nbl#DaYblaYaYbl#D#D#D#M#Dbl#sblbl#Dbl#sbl#D#Ma9a9a9a9a9a9a9a9a9a9a9a9.na9a9a9.n#pa9a9#D#sbl#saYaY.RaY#xa0a0aCa0#Ua0aCbnaYaYawbl#sbl#M#Dblbl#D#pa9a9a9a9a9a9a9#p#p#D#p.n#pa9.n#p#p#pbl#pa9a9#p#pa9#p#pa9a9afa9af#Lafaf#Lafaf#La9a9afa9af#La9afa9a9bl#D#p#DaY#DbnaCbnbnaYaY#IaYaYaw#xaYaYbn#I.R",
+".Raw#xa0aC.Ca0a0.baYaYblbla9a9af#Laf#L#La2afa2#L#La2#Lafa2#La2a2a2a2a2#L#L#Laf#L#D#p#Dbl#DblaYaY#pblblbl#Dbl#D#Dafa9af#L#La9#L.7afaf#Lajaf#L#L#L#L#ga2a2#La2bpa2#L#L#Laf#La9.7#Da9a9a9#D#Dbl#DaYblblaYaYaYawaYaY#xawaYaYaYaYaYaYaYaYaYaYaY.NblaYa9a9#pa9a9#pa9#p.n#Da9a9a9#Da9#D#pa9bl.na9blaYblblaYaY#IaYbnbna0#Ua0b#b#a0aYaYblblbl.Nblbl#Dbl#Da9a9afa9afa9afa9#Ma9#pa9#pbl#pbl#p#p#pa9#pa9#pa9a9bl#p.na9a9a9a9#La9af.7afa9#La9afa9a9af.7afafafa9a9a9#D#D#DblaYbnbn#Ibn#IaY.RawaYaYaYaYaYaY#x#x",
+"bnbnbnbna0a0a0amaYaYaYaY#D.na9a9afa9afa9#L#L#Laf#L#L#La2#La2#L#La2#L#Laf#L#L#Laf#D#Dbl#DblaYaYaYa9.nblbl#D#D#Dblafaf#L#L#L#L#L#L.naf#Laf#L#L#L#L#ga2bpa2#ga2a2#gaf.3af.7afa9a9.n#D#Dbl#sblbl.NaYaYaYaYawaY#x#xaYaYaYaYaYawaYawaYaYawaYawaYblaYblblbl#Dbl#M#Dblbl#Dbl#D#Dbl#s#Dbl.n#pa9blawblawaYaw.RaY.RaY#U#xbn#UbnaCaOama0aYbl#Dbl#Mbl.Nblbl#Da9.na9a9a9a9a9a9a9#pbl#pa9#pa9#p#p#p#M#p#p.n#pa9.n#pa9#pa9a9afa9#Lafa9afa9#Lafafa9afafa9af#La9#La9af#Dbl#Daw.NawbnbnbnbnaYaY#xaYbn.baY.RaY#xbnbn",
+"ama0bna0#Uambgb#aY.RawaYbl#Da9a9a9.7a9.7a9af.7#L#La2af#Laf#L#L#La2a2#La2#Laf#L.7#pblblaYaYblaYaYblblbl#Da9a9a9.7afajaf#L.3#L#L#L#Lafaf#L#L#L#L#L#L#ga2a2bpa2bpa2#La9#Lafa9af#D#D#Dbl#DaYaYaw#xaYaYawaYaY#xbnbnaYawaYaYaYaYbnaYaYaY.RaY.RaY.baYawbl#Mblblblbl#Mblbl#D#D#M#Dbl#D#D#pbl#MblblaYaYaY.RaYaYawbnaYbnawaYaYa0aO.Fa0#x.R#Dbl.Nbl#Mbl#sbla9a9a9a9afafafaf#p#p.na9bl.nbl#p.n#p#pa9#pa9a9#p#pbl#pa9a9a9a9a9#La9afa9a9afa9#Laf#La9afa9af#Lafa9a9#D#Dbl#DblaYbna0#Ubn#I.RawaYawaYaYaY#UbnaCbn",
+".Va0bna0.V.Vb#.5bn#xaYaYaY#Da9a9a9#La9#La9#L#Laf#L#L#La2#La2afa2#La2#Laf#La9a9a9blaY#MaYaYaYaYaYbl#Dbl#Dafa9#L#Lafa2a2a2a2a2#L#Lafaj#Laf#L#L#L#La2a2bpa2#ga2a2#gafafafa9a9a9bl#pbl#DblaYaYaYaY#xaY.Rbnbn#Ua0a0a0aYaYaYaYaYaYaY#U.R.b.R.R#U.Rbn.RaYaYawblaYblaYbl.N#MaY#DaYblaYbl#sblblblawblaYaYawbnaY.RaYaw.RaY#IbnaCb#aOb#.Vbn#DblblawaYblbl#Da9a9a9a9.7a9.7a9#D#pbl#p#p#pa9#p#p#p#pbla9#pa9a9#pa9.n#pa9.na9a9afafa9a9afa9#Laf.7af#La9afa9#Lafa9a9a9bl#s#DaY#sbnbnbnbnaYaY#x.Rbnbnbnbnbn#xa0a0",
+"a0.Vbn.bbna0b#b##UbnaYaY#D#Ma9a9.Ea9a9a9.7a9.7#Lafa2a2#La2af#L#La2a2#L#L#Laf.7.7blblaYblaYaYaYaY#DaYa9a9a9#La2#La2a2#La2#L#ga2#Lafafafa2#L#L#L#L#L#ga2#g#La2bpa2afafa9af#p#Da9#D#DaY#D#DaYaYaY#x.RaYaYbnbna0a0a0aYaYaY.RaY#UaYaYaYaYaYaYaYaYaYaYawblaYaYaYblaYblaYbl.NblaY#s.Nblblbl#MblaYawaYaY.Raw.RawaY.b#x.baY#xa0aob#bga0bnbl#sblaYaYbl#sbla9.n.7a9.n.7a9a9#pa9#pa9#p#D#pbl#p#p.na9#p.na9#p.n#pbl#pa9a9a9af.7a9afa9.na9a9afaf#Lafa9afa9af#La9.nbl#D#D#DblaYbnbn#UaYaYaYawaY.RaY.Rawbnbna0a0",
+"aYaYaYaYaYaY.N#xaYaYawbnaYaYaYaYbl#Dafa9afa9.7#L#L#L#L#L#L#L#L#L.3a2afafa9#D#DaY.R.R#x.RaYawaYaYa9.7a9#L#L#Lafa2a2a2a2a2#g#L#L#Lafafajafafa2#L#L#L#L.7#L#L#L#L#L#L#L#Laf.7#La9a9a9.7a9#D#D#D#D#Dblbl#IaY#xaY#xaYaYaYaYawaYaYaYaYaYawaYaYawaYaYaw#Fbl#M#FblaYaYaY.R.R.R.R.R.R.R.RawaYaYaYaYaYaYawaYbl.NaYaYaYbn#Ibn.baY#Ua0aOb#.Vbg#HaY.bbla9a9.na9a9a9a9.7a9a9.Ea9#p.na9a9.n#pa9#pbl#p#pa9#p#pa9#p#pa9#pa9#pa9a9#pa9.na9afafaf#L#Laf#L#L#L#L#Lafa9a9a9#pblbl.Nbl#x.R#xaY.R#x#xaYaw.RaYaYaYaYaY#D",
+"aYblaYaYaY#IaY.NblawaYaYaYaYaYaY#Dbla9a9a9a9a9#L#L#L#L#L#L#L#L#L#Laf#Lafa9#Dbl.N.R.Raw.RaYaYaYaY.7#Da9.7af#La2#La2#ga2#ga2#L#L#Lafafafaf#L#L#L#L.7#L#L#L#L.7#L.7a2a2#L#Laf#La9bja9#D.7#D#D#D#D#D#D#DaYaYaYaYaY#xaYaYaYaYaYaYaYaw#xaY#xaYaYawaYaYbl#FblaY#MaYblaw.R.b.R#MaY#FaY#FaYaYaYblaY#MaYaYblawaY.RawaYawaYbnaY#Ibnao#SaBaF.p#H#U.RaY#Ma9#Da9a9.7a9a9a9a9a9a9a9a9#pa9#pa9.na9#pa9a9#pa9#pa9#p#D#p#s#pa9a9afa9af#pafafafafaf#L#L#Lafaj#Lafaja9#pa9a9#Dbl#DblaY#UaYaYaw#x#xbnaYblaw.RaYaY#Dbl",
+"blaYblaYaY#D.NaY#pblblaY.RaYaYaYbl#Dbl#Da9a9.7a9#L#L#L#L#L#Laf#Laf.nafa9#D#DaYaYbn.RbnaYaY.R#xaYa9.7a9#L#L#La2#La2a2#g#L#L#L#L.7afajafaf#Laf#L#L#L#L#L#L#L#L#L#La2#La2a2#L#L#L#L#L#La9.7#Da9bj#DblblaYaYaYaYaYaYbl#Dbl#D#Dbl#Dblbl#Mbl#MaYblaY#Mbl.nbl#pa9aYblaYblaYaYaY.RawaYaY#M#F#M#Fbl#F#F#M#p#p#p#MblaYaYaY#UbnbnaCam#SaBbm#H.p.p.RaYaYbla9.na9a9.na9a9a9a9a9#pa9a9#pa9#pa9#pbla9#pa9#pa9#pa9#p#p#pa9#pa9#pa9#pa9a9afafafaf.3afajafafafafafa9.n#pa9#p#Dbl.N.RbnaY.RaYbnaY#x.b.RaYaYblbl#Dbl",
+"#DblblaY#Dbl#D#Dbl#DawaYaYawaYaYaYaYbl#Dbl#D#Da9#Da9#Da9#Da9.7a9a9#p#Dbl#DaYaYaw.R.RaYbnaYaY#xaY#D#Da9.7#L#L#L#La2#ga2#L#L#L.7afafafafafaj#L#L#L#L#L#L#La2#L#L#La2a2a2#La2#L.7#La9#L.7a9.7#D#D#D.N#Dbl.sbl#D#Dbl#D#D#D#Dbl#D#D#Da9#D#D#Da9#D.n#D#pa9#pa9a9blblblblaYblblblblblbl#p#Fbl#p#pbl#pbl#p#M#pblbl#Faw#FbnbnaCamaCaF#SaZ#Hb#bgbnaw.Raw#Da9a9a9a9a9a9.na9afa9a9#p.na9a9#p.na9#pa9#pa9#pa9#M#p#D#p.na9a9a9af#pajafafafafaf#Lafa9afa9a9afaf#paf#p.n#Dbl#DblbnaYbn#Ubn#x#U#xbn.baYblaY#DaY#D",
+"blblaY#DaY#D#D#Dbl#Dbl#DblaYaYaYaYaYaYaY#M#Dbla9#D#D#D#D#D#D#D#Dbl#Dbl#DaYaYaYaYbn.R#U.RaY.R#xaY.7a9.7#Laf#La2#La2a2#L#L#L#La9.7afafafaf#Laf#L#La2#g#L#g#L#ga2a2a2a2#La2a2#La2#L#L#Laf.7a9a9#Da9#DblaYaYbl.Nbl#Da9a9a9a9a9a9a9a9.na9.na9a9.na9a9ajafa9.na9a9.na9blblbl#Dblblblbl#M#p#p#p#p#p.n#p#p#p#p#M#pblbl#MbnbnbnaCa0aF#SaZ.V.V.VbgbnaYaYaYbl#D#D#D#D#D#Dbla9#p.na9#pa9#pa9#pbla9#pa9#pa9#pa9#pa9#pa9#pa9af#pa9#pafafaf#Lafa9a9a9a9a9afa9a9afafa9#p#Dbl#saY#x.bbn#xbn#I#xbnbnbnbnawbl#Dblbl",
+"a9#pa9bl#M#Dbl#Da9a9#D#D#D#D#D.Nbn#U.RaYaYaY#D#Dbl#D#Dbl#D#Dbl#DaYblaYaYaYawaYaYaY.RaYbn#xaw#xaY.7a9#D#L.7a2#Laf#L#Laf#La9a9#Da9afafajaf#L#L#L#Lbpa2a2a2#ga2a2bpa2a2a2a2a2a2#La2.3#L#L#La9.7a9.7bl.NaYaY#D#pa9#pa9a9a9afafa9a9a9afafafajafafafafafajaf#La9a9a9bj.na9#D.n#Da9#s#D#p#p#p#p.n#pbl#p#p.n#pa9bl#Mblbl#UaY#U#x#Ub#aB.l.V.V.V.VaCbnaY.R#D#Mblbl#Mblblbla9#pa9#pafa9a9#pa9#p#pa9#pa9#pa9#pbl.n#D#pa9#pa9afafafafafafafafafa9#p.na9a9a9a9afafafa9#p#DaYaY.Rbn#x#Ubnbn#xaCa0aCbnaYaYblbla9",
+"#pa9#p#Dbl#Da9#Da9afa9bla9bl#DblaYaYbnaYaYaYaYaYblaYblaYblaYaYblaYaYaYaYaYaYaYaY.Rbn.R#xaY.RaYaYa9.7a9#Laf#L#L#Lafaf#Lafa9a9a9.nafafafaf#Laf#L#Laa#ga2#ga2a2#ga2aaasa2a2#La2a2#L#L#L.3#La9.7a9#DaYblaYblbla9a9ajaf#Laf#L#Lafajaf#Lafafaf#Laf#L#La2#L#L#L#L#L.7.7a9a9a9a9a9.na9a9.na9a9a9a9a9a9.na9a9.n#D#D#D#D#D#MblawawbnaC.F.t.Fb#.Vb#.Vbnaw#xaYaYaYaY.NaY#D#Da9#pa9a9#p.n#pa9.nbla9#pa9#pa9#pa9#p#p#pa9.na9afafafafafafafafafa9a9afa9af#pafafafafa9#p#Dblblaw#xbn#Ubn#x#IbnaCb#aCbnawaY#D.na9",
+"#pa9#pa9a9#Dbla9a9a9af#D#Da9#D#D#xbn#xbnaYaYblaYaYaYaYaYaYaYaYaYbnaYaYaYaYaYaYaY.R.R.RbnaYaYaYaY#D.7#Da9#La2#Lafajafafa9a9a9a9#Dafafafaf#La2#L#La2a2#ga2a2#gaaa2asaaa2a2a2a2a2a2a2#L#L#La9a9.7a9#D.saY#D.n#pafaf#Lafaj#L#Laf#L#Laf#L#L#L#L#Lafaja2a2a2a2#L.E#L#La9a9a9.7a9a9a9a9a9.7a9.na9a9a9a9.E#L.7.7#D#s#D#s#Fblbl#M#xbnbg.t.F.t.V.V.VaCa0aY#DaYaYaYaY.Nblbl.na9#p.na9a9#pa9#p#pa9#pa9#pa9#pa9#p#D#pa9#p#pa9afafafaf#Lafafa9af#pa9#pa9afa9afafaf#pa9a9#D#DaYbnbn#xbn#Ua0bna0bg.Va0aYblbl#pa9"
+};
diff --git a/examples/themes/metal.cpp b/examples/themes/metal.cpp
new file mode 100644
index 000000000..02b0c02b2
--- /dev/null
+++ b/examples/themes/metal.cpp
@@ -0,0 +1,486 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "metal.h"
+
+#ifndef QT_NO_STYLE_WINDOWS
+
+#include "qapplication.h"
+#include "qcombobox.h"
+#include "qpainter.h"
+#include "qdrawutil.h" // for now
+#include "qpixmap.h" // for now
+#include "qpalette.h" // for now
+#include "qwidget.h"
+#include "qlabel.h"
+#include "qimage.h"
+#include "qpushbutton.h"
+#include "qwidget.h"
+#include "qrangecontrol.h"
+#include "qscrollbar.h"
+#include "qslider.h"
+#include <limits.h>
+
+
+/////////////////////////////////////////////////////////
+//#include "stonedark.xpm"
+#include "stone1.xpm"
+#include "marble.xpm"
+///////////////////////////////////////////////////////
+
+
+
+MetalStyle::MetalStyle() : TQWindowsStyle() { }
+
+/*!
+ Reimplementation from TQStyle
+ */
+void MetalStyle::polish( TQApplication *app)
+{
+ oldPalette = app->palette();
+
+ // we simply create a nice TQColorGroup with a couple of fancy
+ // pixmaps here and apply to it all widgets
+
+ TQFont f("times", app->font().pointSize() );
+ f.setBold( TRUE );
+ f.setItalic( TRUE );
+ app->setFont( f, TRUE, "TQMenuBar");
+ app->setFont( f, TRUE, "TQPopupMenu");
+
+
+
+ // TQPixmap button( stonedark_xpm );
+
+ TQColor gold("#B9B9A5A54040"); //same as topgrad below
+ TQPixmap button( 1, 1 ); button.fill( gold );
+
+ TQPixmap background(marble_xpm);
+ TQPixmap dark( 1, 1 ); dark.fill( red.dark() );
+ TQPixmap mid( stone1_xpm );
+ TQPixmap light( stone1_xpm );//1, 1 ); light.fill( green );
+
+ TQPalette op = app->palette();
+
+ TQColor backCol( 227,227,227 );
+
+ // TQPalette op(white);
+ TQColorGroup active (op.active().foreground(),
+ TQBrush(op.active().button(),button),
+ TQBrush(op.active().light(), light),
+ TQBrush(op.active().dark(), dark),
+ TQBrush(op.active().mid(), mid),
+ op.active().text(),
+ TQt::white,
+ op.active().base(),// TQColor(236,182,120),
+ TQBrush(backCol, background)
+ );
+ active.setColor( TQColorGroup::ButtonText, TQt::white );
+ active.setColor( TQColorGroup::Shadow, TQt::black );
+ TQColorGroup disabled (op.disabled().foreground(),
+ TQBrush(op.disabled().button(),button),
+ TQBrush(op.disabled().light(), light),
+ op.disabled().dark(),
+ TQBrush(op.disabled().mid(), mid),
+ op.disabled().text(),
+ TQt::white,
+ op.disabled().base(),// TQColor(236,182,120),
+ TQBrush(backCol, background)
+ );
+
+ TQPalette newPalette( active, disabled, active );
+ app->setPalette( newPalette, TRUE );
+}
+
+/*!
+ Reimplementation from TQStyle
+ */
+void MetalStyle::unPolish( TQApplication *app)
+{
+ app->setPalette(oldPalette, TRUE);
+ app->setFont( app->font(), TRUE );
+}
+
+/*!
+ Reimplementation from TQStyle
+ */
+void MetalStyle::polish( TQWidget* w)
+{
+
+ // the polish function sets some widgets to transparent mode and
+ // some to translate background mode in order to get the full
+ // benefit from the nice pixmaps in the color group.
+
+ if (w->inherits("TQPushButton")){
+ w->setBackgroundMode( TQWidget::NoBackground );
+ return;
+ }
+
+ if ( !w->isTopLevel() ) {
+ if ( w->backgroundPixmap() )
+ w->setBackgroundOrigin( TQWidget::WindowOrigin );
+ }
+}
+
+void MetalStyle::unPolish( TQWidget* w)
+{
+
+ // the polish function sets some widgets to transparent mode and
+ // some to translate background mode in order to get the full
+ // benefit from the nice pixmaps in the color group.
+
+ if (w->inherits("TQPushButton")){
+ w->setBackgroundMode( TQWidget::PaletteButton );
+ return;
+ }
+ if ( !w->isTopLevel() ) {
+ if ( w->backgroundPixmap() )
+ w->setBackgroundOrigin( TQWidget::WidgetOrigin );
+ }
+
+}
+
+void MetalStyle::drawPrimitive( PrimitiveElement pe,
+ TQPainter *p,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags flags, const TQStyleOption& opt ) const
+{
+ switch( pe ) {
+ case PE_HeaderSection:
+ if ( flags & Style_Sunken )
+ flags ^= Style_Sunken | Style_Raised;
+ // fall through
+ case PE_ButtonBevel:
+ case PE_ButtonCommand:
+ drawMetalButton( p, r.x(), r.y(), r.width(), r.height(),
+ (flags & (Style_Sunken|Style_On|Style_Down)),
+ TRUE, !(flags & Style_Raised) );
+ break;
+ case PE_PanelMenuBar:
+ drawMetalFrame( p, r.x(), r.y(), r.width(), r.height() );
+ break;
+ case PE_ScrollBarAddLine:
+ drawMetalButton( p, r.x(), r.y(), r.width(), r.height(),
+ flags & Style_Down, !( flags & Style_Horizontal ) );
+ drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowRight :PE_ArrowDown,
+ p, r, cg, flags, opt );
+ break;
+ case PE_ScrollBarSubLine:
+ drawMetalButton( p, r.x(), r.y(), r.width(), r.height(),
+ flags & Style_Down, !( flags & Style_Horizontal ) );
+ drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowLeft : PE_ArrowUp,
+ p, r, cg, flags, opt );
+ break;
+
+
+ case PE_ScrollBarSlider:
+ drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), FALSE,
+ flags & Style_Horizontal );
+ break;
+ default:
+ TQWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt );
+ break;
+ }
+}
+
+void MetalStyle::drawControl( ControlElement element,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how,
+ const TQStyleOption& opt ) const
+{
+ switch( element ) {
+ case CE_PushButton:
+ {
+ const TQPushButton *btn;
+ btn = (const TQPushButton*)widget;
+ int x1, y1, x2, y2;
+
+ r.coords( &x1, &y1, &x2, &y2 );
+
+ p->setPen( cg.foreground() );
+ p->setBrush( TQBrush(cg.button(), NoBrush) );
+
+
+ TQBrush fill;
+ if ( btn->isDown() )
+ fill = cg.brush( TQColorGroup::Mid );
+ else if ( btn->isOn() )
+ fill = TQBrush( cg.mid(), Dense4Pattern );
+ else
+ fill = cg.brush( TQColorGroup::Button );
+
+ if ( btn->isDefault() ) {
+ TQPointArray a;
+ a.setPoints( 9,
+ x1, y1, x2, y1, x2, y2, x1, y2, x1, y1+1,
+ x2-1, y1+1, x2-1, y2-1, x1+1, y2-1, x1+1, y1+1 );
+ p->setPen( TQt::black );
+ p->drawPolyline( a );
+ x1 += 2;
+ y1 += 2;
+ x2 -= 2;
+ y2 -= 2;
+ }
+ SFlags flags = Style_Default;
+ if ( btn->isOn() )
+ flags |= Style_On;
+ if ( btn->isDown() )
+ flags |= Style_Down;
+ if ( !btn->isFlat() && !btn->isDown() )
+ flags |= Style_Raised;
+ drawPrimitive( PE_ButtonCommand, p,
+ TQRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1),
+ cg, flags, opt );
+
+ if ( btn->isMenuButton() ) {
+ flags = Style_Default;
+ if ( btn->isEnabled() )
+ flags |= Style_Enabled;
+
+ int dx = ( y1 - y2 - 4 ) / 3;
+ drawPrimitive( PE_ArrowDown, p,
+ TQRect(x2 - dx, dx, y1, y2 - y1),
+ cg, flags, opt );
+ }
+ if ( p->brush().style() != NoBrush )
+ p->setBrush( NoBrush );
+ break;
+ }
+ case CE_PushButtonLabel:
+ {
+ const TQPushButton *btn;
+ btn = (const TQPushButton*)widget;
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+
+ int x1, y1, x2, y2;
+ r.coords( &x1, &y1, &x2, &y2 );
+ int dx = 0;
+ int dy = 0;
+ if ( btn->isMenuButton() )
+ dx = ( y2 - y1 ) / 3;
+ if ( btn->isOn() || btn->isDown() ) {
+ dx--;
+ dy--;
+ }
+ if ( dx || dy )
+ p->translate( dx, dy );
+ x += 2;
+ y += 2;
+ w -= 4;
+ h -= 4;
+ drawItem( p, TQRect( x, y, w, h ),
+ AlignCenter|ShowPrefix,
+ cg, btn->isEnabled(),
+ btn->pixmap(), btn->text(), -1,
+ (btn->isDown() || btn->isOn())? &cg.brightText() : &cg.buttonText() );
+ if ( dx || dy )
+ p->translate( -dx, -dy );
+ break;
+ }
+ default:
+ TQWindowsStyle::drawControl( element, p, widget, r, cg, how, opt );
+ break;
+ }
+}
+void MetalStyle::drawComplexControl( ComplexControl cc,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how,
+ SCFlags sub,
+ SCFlags subActive,
+ const TQStyleOption& opt ) const
+{
+ switch ( cc ) {
+ case CC_Slider:
+ {
+ const TQSlider *slider = ( const TQSlider* ) widget;
+ TQRect handle = querySubControlMetrics( CC_Slider, widget,
+ SC_SliderHandle, opt);
+ if ( sub & SC_SliderGroove )
+ TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how,
+ SC_SliderGroove, subActive, opt );
+ if ( (sub & SC_SliderHandle) && handle.isValid() )
+ drawMetalButton( p, handle.x(), handle.y(), handle.width(),
+ handle.height(), FALSE,
+ slider->orientation() == TQSlider::Horizontal);
+ break;
+ }
+ case CC_ComboBox:
+ {
+ // not exactly correct...
+ const TQComboBox *cmb = ( const TQComboBox* ) widget;
+
+ qDrawWinPanel( p, r.x(), r.y(), r.width(), r.height(), cg, TRUE,
+ cmb->isEnabled() ? &cg.brush( TQColorGroup::Base ) :
+ &cg.brush( TQColorGroup::Background ) );
+ drawMetalButton( p, r.x() + r.width() - 2 - 16, r.y() + 2, 16, r.height() - 4,
+ how & Style_Sunken, TRUE );
+ drawPrimitive( PE_ArrowDown, p,
+ TQRect( r.x() + r.width() - 2 - 16 + 2,
+ r.y() + 2 + 2, 16 - 4, r.height() - 4 -4 ),
+ cg,
+ cmb->isEnabled() ? Style_Enabled : Style_Default,
+ opt );
+ break;
+ }
+ default:
+ TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, sub, subActive,
+ opt );
+ break;
+ }
+}
+
+
+/*!
+ Draw a metallic button, sunken if \a sunken is TRUE, horizontal if
+ /a horz is TRUE.
+*/
+
+void MetalStyle::drawMetalButton( TQPainter *p, int x, int y, int w, int h,
+ bool sunken, bool horz, bool flat ) const
+{
+
+ drawMetalFrame( p, x, y, w, h );
+ drawMetalGradient( p, x, y, w, h, sunken, horz, flat );
+}
+
+
+
+
+void MetalStyle::drawMetalFrame( TQPainter *p, int x, int y, int w, int h ) const
+{
+ TQColor top1("#878769691515");
+ TQColor top2("#C6C6B4B44949");
+
+ TQColor bot2("#70705B5B1414");
+ TQColor bot1("#56564A4A0E0E"); //first from the bottom
+
+
+ int x2 = x + w - 1;
+ int y2 = y + h - 1;
+
+ //frame:
+
+ p->setPen( top1 );
+ p->drawLine( x, y2, x, y );
+ p->drawLine( x, y, x2-1, y );
+ p->setPen( top2 );
+ p->drawLine( x+1, y2 -1, x+1, y+1 );
+ p->drawLine( x+1, y+1 , x2-2, y+1 );
+
+ p->setPen( bot1 );
+ p->drawLine( x+1, y2, x2, y2 );
+ p->drawLine( x2, y2, x2, y );
+ p->setPen( bot2 );
+ p->drawLine( x+1, y2-1, x2-1, y2-1 );
+ p->drawLine( x2-1, y2-1, x2-1, y+1 );
+
+
+}
+
+
+void MetalStyle::drawMetalGradient( TQPainter *p, int x, int y, int w, int h,
+ bool sunken, bool horz, bool flat ) const
+
+{
+ TQColor highlight("#E8E8DDDD6565");
+ TQColor subh1("#CECEBDBD5151");
+ TQColor subh2("#BFBFACAC4545");
+
+ TQColor topgrad("#B9B9A5A54040");
+ TQColor botgrad("#89896C6C1A1A");
+
+
+
+ if ( flat && !sunken ) {
+ p->fillRect( x + 2, y + 2, w - 4,h -4, topgrad );
+ } else {
+ // highlight:
+ int i = 0;
+ int x1 = x + 2;
+ int y1 = y + 2;
+ int x2 = x + w - 1;
+ int y2 = y + h - 1;
+ if ( horz )
+ x2 = x2 - 2;
+ else
+ y2 = y2 - 2;
+
+#define DRAWLINE if (horz) \
+ p->drawLine( x1, y1+i, x2, y1+i ); \
+ else \
+ p->drawLine( x1+i, y1, x1+i, y2 ); \
+ i++;
+
+ if ( !sunken ) {
+ p->setPen( highlight );
+ DRAWLINE;
+ DRAWLINE;
+ p->setPen( subh1 );
+ DRAWLINE;
+ p->setPen( subh2 );
+ DRAWLINE;
+ }
+ // gradient:
+ int ng = (horz ? h : w) - 8; // how many lines for the gradient?
+
+ int h1, h2, s1, s2, v1, v2;
+ if ( !sunken ) {
+ topgrad.hsv( &h1, &s1, &v1 );
+ botgrad.hsv( &h2, &s2, &v2 );
+ } else {
+ botgrad.hsv( &h1, &s1, &v1 );
+ topgrad.hsv( &h2, &s2, &v2 );
+ }
+
+ if ( ng > 1 ) {
+ for ( int j =0; j < ng; j++ ) {
+ p->setPen( TQColor( h1 + ((h2-h1)*j)/(ng-1),
+ s1 + ((s2-s1)*j)/(ng-1),
+ v1 + ((v2-v1)*j)/(ng-1), TQColor::Hsv ) );
+ DRAWLINE;
+ }
+ } else if ( ng == 1 ) {
+ p->setPen( TQColor((h1+h2)/2, (s1+s2)/2, (v1+v2)/2, TQColor::Hsv) );
+ DRAWLINE;
+ }
+ if ( sunken ) {
+ p->setPen( subh2 );
+ DRAWLINE;
+
+ p->setPen( subh1 );
+ DRAWLINE;
+
+ p->setPen( highlight );
+ DRAWLINE;
+ DRAWLINE;
+ }
+ }
+}
+
+
+
+int MetalStyle::pixelMetric( PixelMetric metric, const TQWidget *w ) const
+{
+ switch ( metric ) {
+ case PM_MenuBarFrameWidth:
+ return 2;
+ default:
+ return TQWindowsStyle::pixelMetric( metric, w );
+ }
+}
+
+#endif
diff --git a/examples/themes/metal.h b/examples/themes/metal.h
new file mode 100644
index 000000000..95ff6111f
--- /dev/null
+++ b/examples/themes/metal.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Definition of the Metal Style for the themes example
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef METAL_H
+#define METAL_H
+
+
+#include <qpalette.h>
+
+#ifndef QT_NO_STYLE_WINDOWS
+
+#include <qwindowsstyle.h>
+
+
+class MetalStyle : public TQWindowsStyle
+{
+public:
+ MetalStyle();
+ void polish( TQApplication*);
+ void unPolish( TQApplication*);
+ void polish( TQWidget* );
+ void unPolish( TQWidget* );
+
+ void drawPrimitive( PrimitiveElement pe,
+ TQPainter *p,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags flags = Style_Default,
+ const TQStyleOption& = TQStyleOption::Default) const;
+
+ void drawControl( ControlElement element,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how = Style_Default,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+
+ void drawComplexControl( ComplexControl cc,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how = Style_Default,
+ SCFlags sub = SC_All,
+ SCFlags subActive = SC_None,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+ int pixelMetric( PixelMetric, const TQWidget * ) const;
+
+
+private:
+ void drawMetalFrame( TQPainter *p, int x, int y, int w, int h ) const;
+ void drawMetalGradient( TQPainter *p, int x, int y, int w, int h,
+ bool sunken, bool horz, bool flat=FALSE ) const;
+ void drawMetalButton( TQPainter *p, int x, int y, int w, int h,
+ bool sunken, bool horz, bool flat=FALSE ) const;
+ TQPalette oldPalette;
+};
+
+#endif
+
+#endif
diff --git a/examples/themes/metal.xpm b/examples/themes/metal.xpm
new file mode 100644
index 000000000..0d72650e3
--- /dev/null
+++ b/examples/themes/metal.xpm
@@ -0,0 +1,130 @@
+/* XPM */
+static const char *metal_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 154 77 46 1",
+/* colors */
+". c #040204",
+"# c #4c4e4c",
+"a c #6c767c",
+"b c #5c6264",
+"c c #848a8c",
+"d c #545a5c",
+"e c #7c8284",
+"f c #646e74",
+"g c #3c3e3c",
+"h c #444644",
+"i c #8c9294",
+"j c #4c565c",
+"k c #7c7e84",
+"l c #646a6c",
+"m c #747e84",
+"n c #4c525c",
+"o c #74767c",
+"p c #64666c",
+"q c #8c8e94",
+"r c #5c5e64",
+"s c #84868c",
+"t c #6c6e74",
+"u c #444244",
+"v c #4c4a4c",
+"w c #4c5254",
+"x c #5c666c",
+"y c #848e94",
+"z c #545e64",
+"A c #7c868c",
+"B c #3c4244",
+"C c #444a4c",
+"D c #8c969c",
+"E c #747a7c",
+"F c #6c7274",
+"G c #4c4e54",
+"H c #5c626c",
+"I c #848a94",
+"J c #545a64",
+"K c #7c828c",
+"L c #3c3e44",
+"M c #44464c",
+"N c #8c929c",
+"O c #54565c",
+"P c #646a74",
+"Q c #747a84",
+"R c #6c727c",
+/* pixels */
+"DNDDDDDDDDDDNDNDNDNNiNNiNiNyiyiyqyyyyIyIcIcIcAsAsAAKAKeKememkmmmQEQEEaoaoaaFRFFFftftlfPllllpxpxpxHbbbrbrzrzrJddddOdOOjOjOnwwwwwGwGG#GCGC#CCCCCCCMCMMMhMBhB",
+"DDDNDNDNDNDNDDNDiDNDNDiyNNiNNyNyiyqyqyIyIIcIcIAcAsAseAKeKekemkmkEmEQEEoaoaoRFRFFtFtftltlPllplpxpbpbHbbrbrrzrdrdJdddOOOOjOwOwOGwwwGwGGGCGCG#CvCCMCMCCMMMMMM",
+"NNDNDNDNDNDNDiDNDNiNiNNDNNyNyqNqyqyqycyIcIcIAIAsAsAKAKKeKkKmkmkEmQQoQoEaoFoaFRtRFftftfPlPpllpxpbpbHbbbbrzrrdrdrdddOddOOwOOwOwwwwGwGwCGwCGGCvCCvCCChCMCBhMB",
+"DDiDNDNDNDiDNNNiNNDiNyNiyNiyNyyNyyyIqIIcIcIAIcAsAAseKeKemKmkmkQmEEQEoaEaoaFRoFFtttftltlPlPppxppxbpbHbrrrrzrzrdddJdOdjOOOjwOwwOGwGwGGw#CGGCvCvCCCMMCMhCMCBM",
+"iNNNiNiNiNNiDNDNNiNyNiNiNyNyiyqyqIqyIIyIcIcIcAsAsKAKAKeKeekmkmEkQQEEQaooaRoFFtRFFftltflPllllppxpHbpbHbbzrrdrdrOrOddOOjOwOOGOwGwwGwGwCGGCGCCGCCMvCCMCMMhMMB",
+"NiNNNNNNNNiNiNiNiNNNiyNyiqyNyqyyyyIyIcIcIAcAsAsAAAseKeKmkmkmkQmEEQEoaEaoRoFRRFtfttftlPtllppxpxpbpbbrbrrbrzrdddddOdOOdOOwOwwOGOGwGGGGwCGGCGCCvCvCMMCMhMBChM",
+"iNNiiNiiNiNNiNiNyiyNyNyNyyqyqyyqIqycIcIcIsIsAsAAseKeKeeeKmkmmkQQQoEQooaoFaFRFFRFtftPtlllPplpxpbpbbHbbbrrzrrdrdrdddOdwOOjOwOwwwwGwGwCGGGCGCGCGCCCMCMCMCMMMB",
+"NyNiNiNiNiNiyNiyNNyiNyqyNyyqyyqIIIIIcIcAIAcAsAsKAKKeKkmkmkmkQEQEEQaoaoaaoFRFFtftftflPlPllpxppxpbbpbbrbrzrrdrdOJOdOOOOOwOwOwwOGwGwGGw#CGCGCvCCCvMCMMMhMhBMh",
+"yNiyNyNyiyNyiNyNiyqyyiyqyqyyyIIIycIcIAsIcAsAsAKAeKeKeeKmkmkmEmQEQoEEaoRoRFRFRtFttltftlPlplppxpbpbHrbbrrrrdrddrOrdOdOdwOwOwOGwGwwGGwCGwCGCGCCvMCCMCMCCBMMMB",
+"qyNyiqyNyNyNyyqyyNyqyyqyyyqIIyIycIcIcIAcAsAAAKsKKeKemkmkmkmQkEEQEoaoaoaFFRFFtRftftlPllllpxpxpbbHpbbrrrzrzrdJrOdOOdOjOOOwOwwwOGGwGG#GGCGCGCvCCvCMCCMhMCMBMh",
+"NyqyqyNyqyqyqyNyqyqyqyyIqIIyIcIcIIcIAsIAsAsAsAeAKeKkKkKmkmEQEQEQaoEaoaRFoRFRfttftPflPlPplpxppHpbbrHbbzrrzrdrdddddOOdwOwOwwOwGwGwGwCwCGGCGCCGCCCCMMCMMMMhMB",
+"yqyqyyqyqyqyqyqyyqyyIyqIyIyIcIIcIsAIcAsAAsAKKKKeeKmemmmkmQkQEQEoEaoaoFoFRFFtFtftftltlllpplpxbpbHbbbrrrzrdrdddJdOdOOOOjOwOwwwwwGwGGGGGCGCGCvCCGMMCMMhMBCBMB",
+"yyyyyqyyqyyqyyyqyyyIyIyIIcIcIIcIAIcAsAsAsKAeAKeKekKmkkmQkmQEQEoQaooaoaFRFRtFttftPlPllPplpxpxpbpbbHrbzrrrrdrdrOddOdjOwOwOwwOGOGwGw#GGCGCGCCGCCMCCMChCMMMhMB",
+"IqyqyyqyyyqyyqIIIIqIIIIcIIcIccIscAsAsAAAKAsKeeKekmekmmkmEEEQEEoaoaoaRFoFFFtftftltlPlPplpxpxpbbbHbrbrrzrdzddddddOOOOOOwOwO#wGGwGGGCw#GCGCvCCvMCMCMMMMBCBMBM",
+"IyIIIIIIIIIIIIyIyIIIyIcIccIcIcAIAsAsAAsKsKKeKeKmeKmkmkEmQQQEQaoEaoaRoFRFRtRFtftfltlPlplxpppbbpHbbbrbrrzrdrdrJOdOdOdwOwOwwwOwwGwwGwCGCGCGCCGCCCvMCMCMMhMhMB",
+"IIIyIyIyIyIyIyIcIcIccIcIcAIAcAsAsAsAsKKAeKeKekKkkmkmkmQkEEEQoEoaoaoFRFRtFftftftlPlllplppxxpbpbbbrHrzrzrdrddOddOOOjOOwOwOwwGwGwG#GGGCwCGCvCCMvMCMMMhMBMBMBh",
+"cIcIcIcIcIcIcIcIcIcIcIcIAscsAIAsAAsAKAKeKeKkeKmemkmkQmQEQEQoEoaoaoFRRFFRtFttltPltPpPlppxppbpbHbHrbrrrrdrdrOrdOddOdwOjOwOGOwwGwGGwCGGvGCGCCvCCCMCMCMhCMMhMB",
+"IcIcIcIcIcIcIcIcIcIAIAcAIAAsAsAsAsKAKseKeKeKmkkmkmmQmkEQEEoaEaoaaRaoFFtFftftfPtllllppxppxbpbbbbbrrzrzrdrdddOdOdOOOOwOwwO#wGwGwG#CwCGCCvCvCCCMCMCMMMBMBhBMh",
+"IAccIcIcIcIcIccIAIAscsAsAIsAsAsAAKAeKeKeKemkemkmmkQkEQEEQoQoaoaoFoFFFRtRttftltllPlPllppxppbHbpHrbbrrrdrddrddOdOOOjOOwwOwwwwGwGGwGGGCGCGCCCvCvMCMhCMMhMMMBB",
+"csAIAsAsAsAAsAsAcsAIAAsAsAAAAAKKsKKKeKeKkeKmkmkmkQmEQEQoEaoaoaoRRFRFRtfFftftPlPlPlppxpxpbbHprrbrrzrzrdrdrOOddOOjOwOwOwO#OGwGwG#CwCGGCGCGCGMCMCMMMMBCBMBMhB",
+"IAsAIAIsIAsIAIAIAsAsAsAsAsAsKsAKeAeeKeKemkmkmkmkQmEQEQEaQoEaoaFoRFRtFFtttftlfltPplplppxpHpbbbbrbbrzrrdrdOdddOdOOOOwOwOwwGwGwGGwGGGCGCvCvCCMCCMCMCMhMMhMBMB",
+"sAsAsAsAsAsAsAsAsAsAsAAAKAKKKeKeKeKeekmKkmkmkmQmEQEQEEoEaoaoaoRFaFFRttftftltlPlpllpxpxpbxbpbHrbrrrrdzdrdrOdOdOjOjOwOwwwOGwwGGGCwGCGCGCCCGMCCMCMMhMBMBMBhBu",
+"sAAsAsAAAsAAsAAsAAAAAsKsKKsAeKKeKeeKkKmkmkmkmmQEkEQEoQaooaoaRFoRFRFFfFtftftlPlPlplpxpbpbpbbrbrbrzrzrdrdOddOdOOOOOOwOwOwwwwGwGwGGGCGGCGCGCCMvCMMCMMCMMBMuMB",
+"AAsAAAAsAAAsAAsKAsKKAKKKeKeKeKeKekkmmemkmmkQmkEQEQEEoEoaoaoRoFRFFttRtftfftlPtllpPpxpxpbbHbHbbrrzrzrdrddrOddOOjOwOwOwO#wGOGGGw#CGCGCCvCvMCvCMMMCMhBMhhMBMBu",
+"KKAKKsAKKsAKAKKAKKKKKeAeKeKkKeeekKmKmkmkmkmQEEQEQEoQaoaoaoFaFRFFRFFtfttltlllllplpxpppbpbpbbrbrbrrrdrdrdddOdOdOOOwOwOwGOwGGwGwCwGGCGGCGCCMCMCCMMMMCBMBMBMBB",
+"eAeKKeKKKKKKeKAeKAeeKeKeKeeKkmkmKmkmkmkmQmEQQEQEooQaooaoaRoFRFRFttfttfftlPPlpPppxppxbxbHbrbbrzrzrdrddddOddOOjOwOwOwwwOGwGwGGGGGC#CGCCCvCGMCMMCMhMMMhBMhBuB",
+"eKeKeKKeKeeKeKeKeeeKeKeKeKmemkKkmkmkmkQQkEkEEQoEQEaEaoaFoaRFRFFRftFftftPltlPlllxppxpbpbpbHbrbrrzrzdrdrdJOdOdOOOOwOwOwwwwGwG#wCGGCGCvCGCCMCMCMhMMCBMBMBMBMB",
+"KeKeKeeKeKeKeKeKeKeKekkkmekmKmmkmmkQQmEQEQEQEEoQaooaoaoRFFFRFFtFtftftlllPllpppppxpxbpbbrbrbrrzrrdrdddOddOdOjOwOwOwO#wGwGwGGGCwGCGCGCvCCvCMCCMCMhBCMhBMBuBu",
+"kkKeeKeKeeKeKkKkkkkkKmKmkkmkmkkmmkEmmEkQEQEQoQaoaoaoaaFoFRRFFRtFfttltPtfllPllxlpxpbpbpbHbrbrzrrdrdrdrddOdOOOOdwOwOwwGOwwGw#wGGCGCGCGCCCMCMCMMMMMMhMBMMBMBB",
+"KmekmekekKmememKmKmemkmkmmkmmmmkQQmkEEQEQoEoaEoEaoaaoFRRFFFRttfttfftllllPlppppxpxpbbHbbrbrrrrzrzdrOddOddOOjOwOwOwwOwwGGGGGCGCGG#CGCCvCvCMCMMChMBMBMMBhBuBu",
+"ekmKkmkmkmkkkmkkmkmkmkmkmkmkmkQQEQEEQEQoEEaQoaoaoaoFRFoRFRFtFtFftPtfPltPplplxppxpbbpbHbHrbzrzrrdrdddJddOOdOOOjOwOw#OwwGwwGwGwCGCGCCGCCMCvMCMMMhCMMBMBuBMBB",
+"kmkmkmkmkmkmkmkmkmkmkmmkmQmQQEEmkEQEQEEoQooaooaaRoFRoFFFFttFftftftlltllplPpppxpxpbpbbrbrbrrrzrdrddrOdOOOdjOwOwOwwOGGwGwG#GCGCG#CvCvCMGMCMCMMCMBMBMhBMBMBuB",
+"mkmmmkmmkmmkmmkmmkmmmkQmQkQEkQEQEEQoEooEaEaoaoaoFaRFFRtRtRtfttftPltPllPllplxpxpbpHbbHbrbrrzrdrddrddOdddOOOOOwOwOwwwwwGwGGGGGGGCGCCGCCMCMCMChMhCMMBMMBuBuBB",
+"QQQkQmkmmkmmkQQmkQQkEQEQEQEQEEQEoQoEoaQaoaoaaaoFRoFRFFFtFfttfftlftllPplppxpxpxpbbbprbrbrrrzrzdrdddddOOOjOjwOwOwwOGwOGwG#GCwC#CGCGCCvCCCMCMMMMBMBhMBhBMBMBu",
+"EkmEkQQkQQkQQEkQEEQEmQkEQEQEEQoEQoEaQaoaoaoaoRFRRFFFRtRftFftftltllPllPlxppxpbpbbpbbHrbrbzrrdrrddrOdOdOdOOOOwOwOwwwGGGGwGwGGGCGCvCCvCCMvCMMCMhMMMMBuMBuBuBB",
+"QEQEQEQEQEQEmQEQmEQEQEEQEEQEoEaQaoaooaoaoRRFFoFRFFRFtFtFftftlPflPlplppppxpxpbxpbbbrbbrrrrzrzdrddOdJOdOOjOwOwOwwOGwwGwG#CGCGCGCGCGCCMvCMMMCMhBCBhBMBMBMBBuB",
+"EQEQEQEQEQEQEEQEEEQEEQEEQEoQaQooEaoaoaoaFoaoRFRFFRtFftftftftltltlPlPplxppxpbpbbHbHbrbzrzrdrdrddOrdOdOjOdwOwOwwOwGwGwGGwGwC#GCGCvCMGCCMCCMMMMMMMBMMBMBuBuBB",
+"QEEQEEQEEQEEQEQEQEEQooaooaoaooaoaoaaaoRFoFFFRFFFttFttftftPtlPllplpplpxppxpbHbpbbrbrbrrrzrzdrddrOdOdOOOOwOOwOwO#wO#wGGwCGGGCGCGCCvCMCMCMMMChBChMMBhBMBBuBBB",
+"EaoEoEoQoEoQoEoEoooEaEoQaoEoaoaoaoaoRFoRFRRRFtRtRttfttftltPltlPlPllpxppxpxbpbbbHbrbrrrzrrdrOrdOdOdOdOjOOwOjwOwwGGwGwGGG#GCGCGCCGCCvCMCMChMMMMBhBMBMBuuBBuL",
+"oQaoaoEaEoaEoaoaoaQaoaoaoaaoaaoRRoFFRFRFRFFFFtFtfFftftftlPlPlPlpppplpxxpbpbbHbrbrbrrzrzrdrddddddOdOOOOwOwOwwwwOGwGwG#CwCGGCGCvCCCGMCMCMMMMBCMMBMhBuBBBuBBB",
+"oaoaQoaooaEaoQaooaoaoaoaoaoaoaFoaRFoaRFRFFRttRfttftftltfPltlllplllxpxpxpxbHbpHbrbrbrzrrdzddrdOdOdOOjOjOwOwO#OwGwGwGGGwGGGCGCGCCvCMCMCMMChMMMhBMMBMBuMBuBuL",
+"oaoaoaoaaoaoaoaoaoaoaoaaoRFRFoFRFFRFFFFFttFtFttftftfltlllllpPplppxppxpbbpbbbrbrbrrzrrzdrdrddOddOOOOOOOwOwwOwGwwGwGGwCGCGCGCGCvCCCCMvMMCMMBCBMMBhBuBBBuBBBB",
+"FoaoaaaoaoaoaaoaaoRoaRoFFoRoRFRFRFFRtRttFRtfftftftltflPltlPlplppxppbpbbpbbHbbrbrzrrzrdrdrddddOdOdjdwOwOwOw#OwwGwGwG#GGwCGCGCvCCMvCCMCMMhMMhMhBMBMBMBMBBuBL",
+"aRaFaoRoRRoRoFaFoFaFRoFRaFFFRFFRFFFFtFtftfttftfftlPlPtlPpplplpxpxpxpbpbbbprbrbrrrzrzdrdddOrOOdOOOOOjOwOwwOwGwwGwG#GCwCG#CGCCCGCGMMCMMMCMBCBMBMuBMBuBuBuLBB",
+"RFoFoRFFoRFRFRoFRRFRFFFRFFRFFRFFRttRttFfttfftfltPltPllpllplpxppxpbpHbHbHbrbrbrbzrrdrdrdOrdOdOdOdOOwOwOwOwwwwwGwGGwGGGGCGCvCvCCCMCMCMCMMhMMMhMMBMBuBBuBLBBL",
+"RFRFFFRRFFaFRFFRFRoFRFRFRFFRFtFtFttftfttfftftltllPllPlPplppppxpxpbxpbpbbHrbrrzrrzrzdrddrOOdOdOOjOjOOwwOwwOGwGwGG#CwCGCGCGCGCCvMCCMCMMMBCBMBuBMBuBMBMLBuBLB",
+"RFtRFRFFFRFFFRFRFFtFRFtFtttttRttfFftftftftltlPlPllPllpplxlxpxpbpbpbbbrHrbrbzbrzrdrdrdddOddOdOdOOwOOwOwwOwGwGwGwGwGGGC#GCGCCvCCCvMCMChCMMMMBMBMBMBuBBuBLuBL",
+"tFRFtFRFFFFRFFFtRFtFtFtRtFtfFftfttftftfltlflPtllPllplplppxpxpxpbHbprbbbrbrrrrzrrzdrddrOddOdOOjOOOwwOwOw#wwO#GGG#GCGCGCGCCvCCCvMCMCMMMMBhBMMhBMBuBBuBBBBBLB",
+"fFtFtFtttttttttFtFtRfttftfFtfttftftftltfPltlllPlllpPpxpxppxpbpbbpHbbbHrbrbzrzrdrdrdrOdddOdOOOOjOwOwOwwGOwGGwGwGwCGGGGCGCvCCvCMCMCMMMMhMMhMBMBuBuBMBBuLuLBL",
+"ttfttttRtRtFtfRftftftfttftftftftfltlPllltlPlPlllpPppppxpxpxpbHpbbbrHrrbrrrrzrzrdrdOdddOdOOdjOjOOwOwwOwwGwGwGG#GCwGC#CGCvCCGMCMCMMMChBCBMBMuBMBMBBuBLBBBLBL",
+"tfttfftfftffttftttftftftftftftPltflPltPPlPlplpplpplxpxppxpbbpbbHbHbbrbrrrzrzrdrdddrdOddOdOOOwOOwOwwOw#OwwGwGGGGwCGCGCvCCGCMCCCMCCMMMMMCBhMBMBuBuBBuBuLuLBL",
+"ftffttftftftftftfftftftfftlltlftlltlPlllplpPplppxpxpxpxbpbbpbbbrbrrbrrzrzrzdrddrddOddOdOOjOOOwwOwOwwwGGGwGG#GCwGGCGCGCGCCCvCMMCMMMhBCuMMBMBMBMBBMBBBBBLBLL",
+"ltftffftftftfftfPtltltltlltPlPlllPlPlllPplplppxpxppxpbpHbpHbbHbHrbbrbrrzrrdrdrdddOddOdOdOOjOwOOwwwOGOwwwGwGwGwCGCGCGCvCCvCMCMCMMMMCMMBMBMBMBuBuBuBLuBLBLBg",
+"PlPtltlltltltlltlflPlPlPlPllPtlPlplplpplpppxpxppxpxpbxpbbbbbprbrbrrrzrzrzdrdrOdrOdOdOOOjOjOOwOwOwwwwGwGwG#GCG#GCGCGCCCvCMCCMCMMCMhBMMhBMhBMBMBBuBLuBLBuLLL",
+"ltllPltlPlPlPltPltltlfPlltlPlplplPlpPpPpplxpppxpxpbbpbbrpbHbrbrbrrrrzrrdrdrddddOddOdOdOdwOOwOwwwwOGwwGwGGwGwCGC#GCvCvCCGCMvCMCMhMMCBMBMMBMBuBBuBBBBLBLBLBg",
+"lPlPllPlPlPllPlllPllPtllPplllPplpplpppxpxppxxpxpbpbpbbpbrbrrbrrrrzrzrzrdrddrOdrOOdOOOjOOOwwOwOwOw#wO#wGG#GCwGCGCCGCCGCCMCMCMMMMMhBMMhBMBhBuBuBBBMLuBLBLLLL",
+"lllllPlPllPlPllPplpllppllplplplplpplxpxppxxppbpbpbHrbHbrbHbbrbzrzrrzrdrddrdddOdOdOOdOOjOwOOwOww#OwwGGGGwGGwCGGCGGCCvCCCMvCMCMCMMMMhMBMMBuBMBuBuBLBBLuLBLBg",
+"lpPlPllllPlllPplPlpPpllpPplpppxpxpxppxpxpxpbxbbbbbpbbbbHrrrrrrrzrzrdrddrOdOdddOdOOdjOjOOwOwwwOwwGGGwGw#GCG#GCGCGCGCCCvCCMMCMMMhBCBMBMBhBMBBuBBBuLBLBLBLgLL",
+"PplppppppppppplplplplppppppxlxpppxpxxpxpbpbpbpbpHbrHrbrrbrbzrzrrzrdrdrdOrdOrOOdOdjOOOwOwOwwOww#OwwGwGGGGwCGCGCGCCCCGCCMCMCMMCMMMMCBhMBMBuBuBBMBLBuBLBLLBLg",
+"pppplplplplplppppppxpxlxxpxppxpxxpbppbbpbbbbbbHbrbbbrHrbrzrrzrzrdrdddddddOdOOdOOOOjOwOwOwOwwO#wGGwG#G#CGGGCGCGCvCvCMCMCMCMMMhMBChBMMBMBuBuBuBLBuBLLBLLgLLg",
+"pxxpxpxpxpxpxpxpxpxpppxppxpxpxpxpbpbbpbbHbpHrprbbHrrbrrzrrrzrzrdrdrdrdrdddOdOOdjOOwOOwOwwwOwwGwwGwGwGGwCGC#GCvCCvCCvCMvCMMCMMMhMBMMBMBMBMBBBBuLBLBLBLBLBLg",
+"xppxpxpxpxpxpxpxpxpxxpxpxpxpbpbpbHbHpbHprbbrbrbrrbrbrrrrzrzrdrddrdOddOOdOOdOdOOOjOOwwOwOwwGwGwGwGG#GCwGGCGCCGCGCCCvMCMCMMMMhBCBMhBhBMBuBBuBMLBBuLBuLLgLgLL",
+"xpxpxpxpxpxpxpxpxpxpbpbpbbpbbbbbpbpbbbbbbbHbHrbbrrrrzrzrrdrdrddrddrdOdddOdOOjOjOOwOwOwOw#OwGOwGwGwGGG#GCGCGGCvCCGMCCMCMCMCMMMMMMBMBMBuBuBMBBLuBLBLLgBLBgLg",
+"bpbpbpbpbpbpbpbpbpbpbxpbHpbHpHprbbbHbrHrbrrrbrrrbzrzrrzrzrddrdrOddOddOOdOOOOOjOwOwOwwO#wOGGwGGGG#GCwCGCGCGCCCCvCMCCMCMMMMhBCBhBMhBMBuBBuBBuLBBLBLBLBLgLLgL",
+"pbbbbpbbpbbpbbpbHbbbpbbpbbbbbbbbbHbbHbrbrbbrrrbzrrzrrzrdrddrddddddddOdOOdOOjOwOOwOwwOwwwGwwwGwGwGG#GGCGC#CGCGCCvCMvCMCMCMMMhMMMBMBuBMBMBuBLBuLLuBLLLBLgLLg",
+"bbpbbbbpbbpbbpbbpbpbbHbbHbprbrHrHbrrrbrbrrrbzrzrrzrzdrdddrddrOddOdOOdOOdjOjOOOwwOwOwwwOGwGGw#GG#CwCGCGGCGCvCCvCCCMCMMMMMhBCBMBMhBMBMBuBBBBuBBLBLLLBgLgLLgL",
+"bHbbpbHbbHbbHrbHbbrbHbrbrbrbHbbrbrbbrrrrbrrzrzrrzrdrdrdrdOrOddOdJOdOOOjOOOOOwwOwOwwwOwGwGwwGGwGGGGC#GCGCvCCvCCMCMCMCMChMMMMMBhMBMBuBuBBMLuLBLuBLBgLLgLLgLg",
+"bbrHrbrHrbrHbbHrbHbbrbHbrHrbrrbrrrrrbrzrzzrrzrddrdrdrdddrdddddOdOOOdOOOjOwOwOOwwwOww#wwGwGGG#GCwCGGCGCvCCGCCCGMCvMMMMMMBCBMhMBMBMBMBBuBLBBuLBLLLLLBgLLgLgL",
+"rbrbrbrbrbrbrrbrbrrHrbrrbrbrbrrbrbrrrzrzrrzdrdrrddrddOrdddOdOOdOOdOOOjOOwOwOwwwOw#OGwwGwGwGwCGwCGGCGCGCCvCCvCMCMMMCMCMhMMCBMBMBMBuBBuBuBuLBBLBBgBLgLLgLgLg",
+"rbrbrbrbrbrbrbrbrbrrrrrbrrrzrrzrzrzzrrzrzrrdrdddrdddrdOdOddOddOOdOjOjOOwOwOwOwOwwwGwGwGGG#GGGGCG#CGCGCGCCCvMCMCMCMMMMBCBMBMhBMBuBMBuBBBBBBLBLBLLLgLgLLgLgL",
+"zrrrrrrrrrrrrrrrrrrbrbrrrzrrzrzrrzrrzdrdrddrddrddOrddOddOdOdOOOOOOOwOOwOwOwwww#OwGOGwGwGwGG#GCGGCGCGCvCCvCCCMCMCMMCMhMMMMhMBMBMBuBBuBLuLuBLuBLBLBLgLLgLgLg",
+"rrzrzrzrzrzrzrzrzrzrzzrzrrzrrrzrdrdrdrdrdrdddrddddOdOdOdOdOOOOOjOjOOwwOwOwwOwO#GwGGwGGG#G#CwCw#CGCvCCCvCCMCMCMCMMMMBCBMBhBMBhBuBBuBBBuBBLLBLLLgLgLLgLgLgLg",
+"rzrrzrrzrrzrrzrrzrrzrrzrzzrzdrdrdrddrdrddddrdddOrddOdOdOOOdOOjOOwOjwOwOwwOwOwGwwGwwGGwGwCGwCGGCGCGCCvCCvCCMCMCMMChMhMMhMBMBMBMBMBuLMBBLBLuLBLBLBLLgLLgLgLg",
+"zrzrzrzrzrzrzrzrzrzrzrdrdrdrdzrddrdrddddrOddOJddOOOdOOOOdOOjOOjOjwOOwOwwww#GwwwGwG#Gw#GGGCGGCGCvCCvCCCCMCvMCMMMMMBCBMBMBMuBuBuBBuBBBuLBLBLBLLgLgLgLgLgLgLg",
+"rdrdrdrdrdrdrdrdrdrdddrdrdrdrddrJdddOrJOddddddOOdOdOdOdOjOjOOwOwOwOwwwwOwOwGOGwGwGwGGGCGCGGCGCGCCvCvCGCCMMCMCMCMMMMMhMhMBMBMBMBuBBuBLBLuLBLBLBLLLgLLgLgLgg",
+"drddrddrddrddrddrdrdrddrdddddrOddrdddOddrOOOdOddOOOOOOjOOjOwOjOwOwwwOwww#Gww#GGGGG#GCwGGCGCGCGCvCGCCCMCMCCMMMMMhBCBMBMBuBMBuBBuBBuBLuBLBLLLgLgLgLLggLgLgLg",
+"ddrddrdddrddrddrdddddrddOrdrddddOdOJdddOOOdOdOOOdjOOjOOOwOOwOwOwwwwO#OwGOwGwGwGwGwCGGCGCGC#CvCGCCCMvCCMvMMCMCMCBMhMhMBMBMBMBuBBuBLBBBLBLBLBLBLgLgLgLgLgLgg"
+};
diff --git a/examples/themes/qtlogo.png b/examples/themes/qtlogo.png
new file mode 100644
index 000000000..4e1a14726
--- /dev/null
+++ b/examples/themes/qtlogo.png
Binary files differ
diff --git a/examples/themes/stone1.xpm b/examples/themes/stone1.xpm
new file mode 100644
index 000000000..34cd5625f
--- /dev/null
+++ b/examples/themes/stone1.xpm
@@ -0,0 +1,353 @@
+/* XPM */
+static const char *stone1_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 96 96 250 2",
+/* colors */
+".. c #343e34",
+".# c #94a28c",
+".a c #64726c",
+".b c #c4d2c4",
+".c c #7c8a7c",
+".d c #acbaac",
+".e c #4c5a4c",
+".f c #dceadc",
+".g c #949284",
+".h c #7c7a6c",
+".i c #acaaa4",
+".j c #c4c2b4",
+".k c #64625c",
+".l c #dcdad4",
+".m c #8c967c",
+".n c #a4ae9c",
+".o c #6c7e74",
+".p c #f4f2ec",
+".q c #444e3c",
+".r c #bcc6b4",
+".s c #8c8a7c",
+".t c #5c6654",
+".u c #ccdecc",
+".v c #7c826c",
+".w c #a4a294",
+".x c #949a8c",
+".y c #bcbaac",
+".z c #747264",
+".A c #5c5a4c",
+".B c #c4cabc",
+".C c #d4d2c4",
+".D c #ecf2e4",
+".E c #acb2a4",
+".F c #646a5c",
+".G c #8c867c",
+".H c #54524c",
+".I c #9c9a8c",
+".J c #849284",
+".K c #7c827c",
+".L c #44463c",
+".M c #9caa9c",
+".N c #b4c2b4",
+".O c #dce2d4",
+".P c #cccabc",
+".Q c #b4b2a4",
+".R c #94a29c",
+".S c #848a7c",
+".T c #f4faec",
+".U c #6c6a5c",
+".V c #6c7a6c",
+".W c #acbab4",
+".X c #546254",
+".Y c #4c564c",
+".Z c #a4aa9c",
+".0 c #747a6c",
+".1 c #ccdacc",
+".2 c #545a4c",
+".3 c #74867c",
+".4 c #4c4e44",
+".5 c #bcc2b4",
+".6 c #5c6254",
+".7 c #d4dacc",
+".8 c #fcfaf4",
+".9 c #3c463c",
+"#. c #6c7264",
+"## c #e4eadc",
+"#a c #949294",
+"#b c #847e74",
+"#c c #8c968c",
+"#d c #a4b6ac",
+"#e c #747e6c",
+"#f c #949a9c",
+"#g c #9c9a9c",
+"#h c #84827c",
+"#i c #e4e2d4",
+"#j c #848a8c",
+"#k c #9ca294",
+"#l c #ccd2c4",
+"#m c #7c7e7c",
+"#n c #c4c6c4",
+"#o c #a4aeac",
+"#p c #bcc6c4",
+"#q c #8c8e8c",
+"#r c #d4decc",
+"#s c #848274",
+"#t c #a4a6a4",
+"#u c #bcbebc",
+"#v c #747674",
+"#w c #c4cecc",
+"#x c #d4d6d4",
+"#y c #acb6b4",
+"#z c #646a6c",
+"#A c #cccecc",
+"#B c #b4b6b4",
+"#C c #545e5c",
+"#D c #6c7674",
+"#E c #747e7c",
+"#F c #3c3e34",
+"#G c #b4baa4",
+"#H c #949684",
+"#I c #7c7e6c",
+"#J c #acaeac",
+"#K c #c4c6b4",
+"#L c #646664",
+"#M c #dcdedc",
+"#N c #8c8e7c",
+"#O c #a4a694",
+"#P c #949e8c",
+"#Q c #bcbeac",
+"#R c #747664",
+"#S c #5c5e5c",
+"#T c #c4cebc",
+"#U c #d4d6c4",
+"#V c #acb6a4",
+"#W c #545654",
+"#X c #9c9e8c",
+"#Y c #eceedc",
+"#Z c #4c4a44",
+"#0 c #dce6d4",
+"#1 c #cccebc",
+"#2 c #b4b6a4",
+"#3 c #9ca29c",
+"#4 c #848e7c",
+"#5 c #8c928c",
+"#6 c #b4bab4",
+"#7 c #7c8e8c",
+"#8 c #44524c",
+"#9 c #6c6e6c",
+"a. c #e4eeec",
+"a# c #d4e2dc",
+"aa c #a4aaac",
+"ab c #747a7c",
+"ac c #5c6264",
+"ad c #94a694",
+"ae c #acae9c",
+"af c #646654",
+"ag c #dcdecc",
+"ah c #a4b2a4",
+"ai c #bccabc",
+"aj c #5c6a5c",
+"ak c #7c8674",
+"al c #5c5e54",
+"am c #ecf6ec",
+"an c #646e64",
+"ao c #545644",
+"ap c #7c867c",
+"aq c #444a40",
+"ar c #f4fef4",
+"as c #6c6e64",
+"at c #545e54",
+"au c #4c5249",
+"av c #fcfef7",
+"aw c #6c766c",
+"ax c #e4eee4",
+"ay c #8c9a8e",
+"az c #748274",
+"aA c #84867d",
+"aB c #e4e6dc",
+"aC c #ccd6cb",
+"aD c #d4e2d4",
+"aE c #3c4238",
+"aF c #b4beac",
+"aG c #9ca69c",
+"aH c #b4beb4",
+"aI c #f4f6ec",
+"aJ c #3c4a3c",
+"aK c #949694",
+"aL c #949e9c",
+"aM c #9c9e9c",
+"aN c #848e8c",
+"aO c #9ca694",
+"aP c #a4b2ac",
+"aQ c #bccac4",
+"aR c #5c6a64",
+"aS c #848674",
+"aT c #646e6c",
+"aU c #74827c",
+"aV c #94a294",
+"aW c #7c8a84",
+"aX c #dceae4",
+"aY c #94928c",
+"aZ c #7c7a74",
+"a0 c #c4c2bc",
+"a1 c #8c9684",
+"a2 c #a4aea4",
+"a3 c #444e44",
+"a4 c #bcc6bc",
+"a5 c #8c8a84",
+"a6 c #5c665c",
+"a7 c #7c8274",
+"a8 c #a4a29c",
+"a9 c #949a94",
+"b. c #bcbab4",
+"b# c #74726c",
+"ba c #5c5a54",
+"bb c #c4cac4",
+"bc c #d4d2cc",
+"bd c #ecf2ec",
+"be c #acb2ac",
+"bf c #646a64",
+"bg c #8c8684",
+"bh c #9c9a94",
+"bi c #84928c",
+"bj c #eceae4",
+"bk c #b4c2bc",
+"bl c #dce2dc",
+"bm c #cccac4",
+"bn c #b4b2ac",
+"bo c #848a84",
+"bp c #f4faf4",
+"bq c #8c9284",
+"br c #6c6a64",
+"bs c #6c7a74",
+"bt c #a4aaa4",
+"bu c #747a74",
+"bv c #ccdad4",
+"bw c #545a54",
+"bx c #4c4e4c",
+"by c #bcc2bc",
+"bz c #5c625c",
+"bA c #d4dad4",
+"bB c #6c726c",
+"bC c #e4eae4",
+"bD c #8c9694",
+"bE c #747e74",
+"bF c #ccd2cc",
+"bG c #d4ded4",
+"bH c #b4baac",
+"bI c #94968c",
+"bJ c #7c7e74",
+"bK c #c4c6bc",
+"bL c #8c8e84",
+"bM c #a4a69c",
+"bN c #949e94",
+"bO c #bcbeb4",
+"bP c #74766c",
+"bQ c #c4cec4",
+"bR c #d4d6cc",
+"bS c #acb6ac",
+"bT c #9c9e94",
+"bU c #eceee4",
+"bV c #dce6dc",
+"bW c #cccec4",
+"bX c #b4b6ac",
+"bY c #848e84",
+"bZ c #8c9294",
+"b0 c #acaea4",
+"b1 c #64665c",
+"b2 c #dcded4",
+"b3 c #54564c",
+/* pixels */
+".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI",
+"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH",
+"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S",
+"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM",
+".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4",
+"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR",
+"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG",
+"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0",
+"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L",
+"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK",
+"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9",
+".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW",
+".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO",
+".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2",
+"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6",
+"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0",
+"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3",
+"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo",
+"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw",
+".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2",
+"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF",
+"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6",
+".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo",
+"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe",
+"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P",
+"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH",
+"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l",
+"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B",
+"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G",
+"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA",
+"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA",
+"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN",
+"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW",
+"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O",
+".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E",
+".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak",
+"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq",
+"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V",
+"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX",
+"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B",
+"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4",
+".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k",
+"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM",
+"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL",
+"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq",
+"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo",
+"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG",
+"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq",
+"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0",
+"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI",
+"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5",
+"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL",
+"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c",
+"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe",
+"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0",
+"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ",
+".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8",
+"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA",
+"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX",
+".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo",
+"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb",
+".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM",
+".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA",
+"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX",
+"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo",
+".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM",
+"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c",
+".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL",
+".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH",
+"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK",
+".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA",
+"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl",
+".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE",
+"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z",
+"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap",
+"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.",
+"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN",
+"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas",
+"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA",
+"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT",
+".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7",
+"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E",
+".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM",
+"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2",
+"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT",
+"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap",
+".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n",
+"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas",
+".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3",
+"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can",
+"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag",
+".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.",
+"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH",
+"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0",
+"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA",
+".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM"
+};
diff --git a/examples/themes/stonebright.xpm b/examples/themes/stonebright.xpm
new file mode 100644
index 000000000..a538a94ae
--- /dev/null
+++ b/examples/themes/stonebright.xpm
@@ -0,0 +1,353 @@
+/* XPM */
+static const char *stonebright_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 96 96 250 2",
+/* colors */
+".. c #7b927b",
+".# c #daefcf",
+".a c #b5cec3",
+".b c #ebfceb",
+".c c #cce2cb",
+".d c #e5f8e5",
+".e c #99b499",
+".f c #effeef",
+".g c #e8e4cf",
+".h c #d7d3bb",
+".i c #f3f0e7",
+".j c #faf7e6",
+".k c #bfbbb0",
+".l c #fdfbf4",
+".m c #dae9c1",
+".n c #e6f4db",
+".o c #bbd9c7",
+".p c #fffdf7",
+".q c #91a680",
+".r c #effbe4",
+".s c #e3e0c9",
+".t c #b0c2a0",
+".u c #eafeea",
+".v c #d3ddb8",
+".w c #f0ecd8",
+".x c #e3ecd7",
+".y c #f8f5e3",
+".z c #d0ccb3",
+".A c #b6b297",
+".B c #f4fbea",
+".C c #fdfaea",
+".D c #f9fff0",
+".E c #eef6e3",
+".F c #bbc6ab",
+".G c #e3d9c9",
+".H c #ada99d",
+".I c #ede9d5",
+".J c #d1e7d1",
+".K c #d3ddd3",
+".L c #989c86",
+".M c #dff3df",
+".N c #e8fae7",
+".O c #f7feee",
+".P c #fcf9e9",
+".Q c #f6f3e0",
+".R c #daefe6",
+".S c #d9e2cb",
+".T c #f9fff1",
+".U c #c8c4ab",
+".V c #bdd6bd",
+".W c #e5f8f0",
+".X c #a2bda2",
+".Y c #9baf9b",
+".Z c #ebf3df",
+".0 c #ccd6bd",
+".1 c #edfded",
+".2 c #a9b499",
+".3 c #c1dfce",
+".4 c #a2a690",
+".5 c #f3fae7",
+".6 c #b2bda2",
+".7 c #f6fded",
+".8 c #fffdf7",
+".9 c #869c86",
+"#. c #c4ceb5",
+"## c #f8feef",
+"#a c #e8e5e8",
+"#b c #ded3c3",
+"#c c #d9e9d9",
+"#d c #dff7e9",
+"#e c #c8d9bb",
+"#f c #e1eaed",
+"#g c #edeaed",
+"#h c #dedbd0",
+"#i c #fefcec",
+"#j c #d7e0e3",
+"#k c #e6efda",
+"#l c #f5fceb",
+"#m c #d5d9d5",
+"#n c #f9fbf9",
+"#o c #e6f4f1",
+"#p c #effbf9",
+"#q c #e2e5e2",
+"#r c #f3feea",
+"#s c #dedac3",
+"#t c #eef1ee",
+"#u c #f6f9f6",
+"#v c #ced2ce",
+"#w c #f0fcfa",
+"#x c #fbfdfb",
+"#y c #e9f7f4",
+"#z c #b9c4c8",
+"#A c #fafcfa",
+"#B c #f4f7f4",
+"#C c #a4b8b4",
+"#D c #c0d2ce",
+"#E c #c7d9d5",
+"#F c #8d927b",
+"#G c #f0f8db",
+"#H c #e6e9cd",
+"#I c #d6d9bb",
+"#J c #f1f4f1",
+"#K c #f9fbe4",
+"#L c #bec2be",
+"#M c #fcfefc",
+"#N c #e2e5c8",
+"#O c #eff1d7",
+"#P c #dfeed3",
+"#Q c #f7f9e1",
+"#R c #cfd2b2",
+"#S c #b4b8b4",
+"#T c #f0fce6",
+"#U c #fbfde8",
+"#V c #eaf7df",
+"#W c #abafab",
+"#X c #eceed3",
+"#Y c #fdffec",
+"#Z c #a39f92",
+"#0 c #f3feea",
+"#1 c #fafce6",
+"#2 c #f5f7df",
+"#3 c #e6efe6",
+"#4 c #d5e5c8",
+"#5 c #dee7de",
+"#6 c #f0f8f0",
+"#7 c #c8e5e2",
+"#8 c #8daa9d",
+"#9 c #c6cac6",
+"a. c #f4fffd",
+"a# c #eefef7",
+"aa c #e7f0f3",
+"ab c #c9d4d7",
+"ac c #b0bcbf",
+"ad c #d8f1d7",
+"ae c #f2f4db",
+"af c #bfc2a0",
+"ag c #fcfeea",
+"ah c #e3f6e3",
+"ai c #eafbea",
+"aj c #abc6ab",
+"ak c #cfdfc1",
+"al c #b4b8a4",
+"am c #f5fff5",
+"an c #b8cab8",
+"ao c #abaf8a",
+"ap c #cfdfcf",
+"aq c #94a18b",
+"ar c #f5fff5",
+"as c #c6cab8",
+"at c #a4b8a4",
+"au c #9daa97",
+"av c #fdfff8",
+"aw c #c0d2c0",
+"ax c #f4fff4",
+"ay c #d7ecd9",
+"az c #c6ddc6",
+"aA c #dcdfd0",
+"aB c #fcfef3",
+"aC c #f1fdf0",
+"aD c #eefeee",
+"aE c #899780",
+"aF c #ecf9e1",
+"aG c #e2f1e2",
+"aH c #ecf9ec",
+"aI c #fdfff5",
+"aJ c #83a182",
+"aK c #e6e9e6",
+"aL c #dfeeeb",
+"aM c #ebeeeb",
+"aN c #d5e5e2",
+"aO c #e3f1d7",
+"aP c #e3f6ed",
+"aQ c #eafbf4",
+"aR c #abc6bb",
+"aS c #dcdfc1",
+"aT c #b8cac6",
+"aU c #c6ddd3",
+"aV c #dbefda",
+"aW c #cbe2d8",
+"aX c #effef7",
+"aY c #e8e5dc",
+"aZ c #d7d3c9",
+"a0 c #faf7f0",
+"a1 c #dae9cd",
+"a2 c #e6f4e6",
+"a3 c #91a690",
+"a4 c #effbef",
+"a5 c #e3dfd7",
+"a6 c #b0c2b0",
+"a7 c #d3ddc6",
+"a8 c #f0ede4",
+"a9 c #e3ece3",
+"b. c #f8f5ee",
+"b# c #d0ccc2",
+"ba c #b6b2a6",
+"bb c #f4fbf4",
+"bc c #fdfaf4",
+"bd c #f9fff9",
+"be c #eef6ee",
+"bf c #bbc6bb",
+"bg c #e3d9d7",
+"bh c #edeae1",
+"bi c #d1e7dd",
+"bj c #fffdf6",
+"bk c #e7faf2",
+"bl c #f7fef7",
+"bm c #fcf9f2",
+"bn c #f6f3ec",
+"bo c #d8e2d8",
+"bp c #f9fff9",
+"bq c #dee7d1",
+"br c #c8c4b9",
+"bs c #bdd6cb",
+"bt c #eaf3ea",
+"bu c #cbd6cb",
+"bv c #edfdf6",
+"bw c #a9b4a8",
+"bx c #a2a6a2",
+"by c #f2faf2",
+"bz c #b2bdb2",
+"bA c #f6fdf6",
+"bB c #c3cec3",
+"bC c #f8fef8",
+"bD c #d9e9e6",
+"bE c #c9d9c7",
+"bF c #f5fcf5",
+"bG c #f3fef3",
+"bH c #f1f8e5",
+"bI c #e6e9d9",
+"bJ c #d6d9c7",
+"bK c #f9fbef",
+"bL c #e2e5d5",
+"bM c #eef1e2",
+"bN c #dfeedf",
+"bO c #f6f9ec",
+"bP c #cfd2c0",
+"bQ c #f0fcf0",
+"bR c #fbfdf1",
+"bS c #e9f7e9",
+"bT c #ebeedf",
+"bU c #fdfff4",
+"bV c #f3fef3",
+"bW c #fafcf0",
+"bX c #f4f7e9",
+"bY c #d5e5d5",
+"bZ c #dce5e8",
+"b0 c #f1f4e6",
+"b1 c #bec2b0",
+"b2 c #fcfef3",
+"b3 c #abaf9b",
+/* pixels */
+".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI",
+"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH",
+"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S",
+"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM",
+".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4",
+"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR",
+"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG",
+"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0",
+"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L",
+"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK",
+"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9",
+".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW",
+".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO",
+".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2",
+"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6",
+"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0",
+"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3",
+"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo",
+"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw",
+".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2",
+"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF",
+"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6",
+".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo",
+"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe",
+"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P",
+"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH",
+"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l",
+"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B",
+"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G",
+"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA",
+"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA",
+"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN",
+"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW",
+"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O",
+".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E",
+".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak",
+"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq",
+"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V",
+"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX",
+"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B",
+"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4",
+".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k",
+"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM",
+"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL",
+"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq",
+"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo",
+"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG",
+"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq",
+"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0",
+"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI",
+"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5",
+"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL",
+"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c",
+"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe",
+"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0",
+"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ",
+".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8",
+"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA",
+"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX",
+".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo",
+"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb",
+".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM",
+".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA",
+"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX",
+"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo",
+".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM",
+"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c",
+".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL",
+".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH",
+"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK",
+".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA",
+"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl",
+".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE",
+"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z",
+"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap",
+"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.",
+"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN",
+"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas",
+"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA",
+"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT",
+".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7",
+"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E",
+".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM",
+"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2",
+"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT",
+"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap",
+".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n",
+"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas",
+".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3",
+"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can",
+"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag",
+".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.",
+"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH",
+"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0",
+"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA",
+".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM"
+};
diff --git a/examples/themes/stonedark.xpm b/examples/themes/stonedark.xpm
new file mode 100644
index 000000000..bae15c242
--- /dev/null
+++ b/examples/themes/stonedark.xpm
@@ -0,0 +1,353 @@
+/* XPM */
+static const char *stonedark_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 96 96 250 2",
+/* colors */
+".. c #020202",
+".# c #4e554a",
+".a c #1f2321",
+".b c #838c83",
+".c c #343a34",
+".d c #697169",
+".e c #0e100e",
+".f c #9ca59c",
+".g c #45443d",
+".h c #2b2a25",
+".i c #61605d",
+".j c #7c7b72",
+".k c #171615",
+".l c #969490",
+".m c #43473b",
+".n c #5e6359",
+".o c #272e2b",
+".p c #afada9",
+".q c #090909",
+".r c #797f73",
+".s c #3c3b35",
+".t c #171915",
+".u c #8c988c",
+".v c #2f322a",
+".w c #57564e",
+".x c #484b44",
+".y c #737269",
+".z c #24231f",
+".A c #11110e",
+".B c #80847b",
+".C c #8e8c83",
+".D c #a9ada3",
+".E c #656860",
+".F c #1a1c19",
+".G c #3c3935",
+".H c #0c0c0c",
+".I c #4e4d46",
+".J c #3d433d",
+".K c #30322f",
+".L c #060606",
+".M c #565e56",
+".N c #717a71",
+".O c #989c93",
+".P c #86847c",
+".Q c #6a6961",
+".R c #4e5551",
+".S c #383a34",
+".T c #b0b4aa",
+".U c #1e1d1a",
+".V c #252a25",
+".W c #69716d",
+".X c #121512",
+".Y c #0c0e0c",
+".Z c #5b5e56",
+".0 c #282a25",
+".1 c #8b948b",
+".2 c #0f100e",
+".3 c #2e3632",
+".4 c #090909",
+".5 c #767a71",
+".6 c #131512",
+".7 c #90948b",
+".8 c #b6b4b0",
+".9 c #060606",
+"#. c #21231f",
+"## c #a1a59c",
+"#a c #454445",
+"#b c #33302d",
+"#c c #434743",
+"#d c #626d67",
+"#e c #2b2e27",
+"#f c #4a4d4e",
+"#g c #4e4d4e",
+"#h c #333230",
+"#i c #9e9c93",
+"#j c #393b3c",
+"#k c #52554e",
+"#l c #888c83",
+"#m c #2d2e2d",
+"#n c #7e7f7e",
+"#o c #5e6362",
+"#p c #797f7e",
+"#q c #3d3e3d",
+"#r c #92988c",
+"#s c #33322d",
+"#t c #595a59",
+"#u c #757675",
+"#v c #252625",
+"#w c #828887",
+"#x c #8f908f",
+"#y c #676d6c",
+"#z c #1c1d1e",
+"#A c #878887",
+"#B c #6c6d6c",
+"#C c #111312",
+"#D c #232625",
+"#E c #2b2e2d",
+"#F c #020202",
+"#G c #6e7163",
+"#H c #46473e",
+"#I c #2d2e27",
+"#J c #626362",
+"#K c #7e7f73",
+"#L c #181918",
+"#M c #979897",
+"#N c #3d3e36",
+"#O c #595a50",
+"#P c #4b5047",
+"#Q c #75766b",
+"#R c #252620",
+"#S c #131313",
+"#T c #82887c",
+"#U c #8f9084",
+"#V c #676d62",
+"#W c #0e0e0e",
+"#X c #4f5047",
+"#Y c #a8a99c",
+"#Z c #080808",
+"#0 c #9aa094",
+"#1 c #87887c",
+"#2 c #6c6d62",
+"#3 c #525551",
+"#4 c #3a3e36",
+"#5 c #404340",
+"#6 c #6d716d",
+"#7 c #363e3d",
+"#8 c #0b0b0b",
+"#9 c #1e1f1e",
+"a. c #a1a9a7",
+"a# c #939c98",
+"aa c #5d6061",
+"ab c #292a2b",
+"ac c #151617",
+"ad c #505a50",
+"ae c #626359",
+"af c #181915",
+"ag c #97988c",
+"ah c #606860",
+"ai c #7b847b",
+"aj c #191c19",
+"ak c #32362e",
+"al c #131311",
+"am c #aab1a9",
+"an c #1d1f1d",
+"ao c #0e0e0b",
+"ap c #323632",
+"aq c #070707",
+"ar c #b1b8b0",
+"as c #1e1f1d",
+"at c #111311",
+"au c #0b0b0b",
+"av c #b6b8b3",
+"aw c #232623",
+"ax c #a2a9a1",
+"ay c #444b45",
+"az c #2d322d",
+"aA c #353633",
+"aB c #9fa099",
+"aC c #8a9089",
+"aD c #939c93",
+"aE c #040404",
+"aF c #70766b",
+"aG c #555a55",
+"aH c #707670",
+"aI c #afb1a9",
+"aJ c #070707",
+"aK c #464746",
+"aL c #4b504f",
+"aM c #4f504f",
+"aN c #3a3e3d",
+"aO c #555a50",
+"aP c #606864",
+"aQ c #7b8480",
+"aR c #191c1a",
+"aS c #35362e",
+"aT c #1d1f1e",
+"aU c #2d322f",
+"aV c #4e554e",
+"aW c #343a37",
+"aX c #9ca5a0",
+"aY c #454442",
+"aZ c #2b2a29",
+"a0 c #7c7b77",
+"a1 c #43473e",
+"a2 c #5e635e",
+"a3 c #090909",
+"a4 c #797f79",
+"a5 c #3c3b39",
+"a6 c #171917",
+"a7 c #2f322d",
+"a8 c #575653",
+"a9 c #484b48",
+"b. c #73726e",
+"b# c #242322",
+"ba c #11110f",
+"bb c #808480",
+"bc c #8e8c88",
+"bd c #a8ada8",
+"be c #646864",
+"bf c #1a1c1a",
+"bg c #3c3939",
+"bh c #4e4d4a",
+"bi c #3d4340",
+"bj c #a7a5a1",
+"bk c #717a76",
+"bl c #989c98",
+"bm c #868480",
+"bn c #6a6966",
+"bo c #373a37",
+"bp c #afb4af",
+"bq c #40433d",
+"br c #1e1d1c",
+"bs c #252a28",
+"bt c #5a5e5a",
+"bu c #282a28",
+"bv c #8b9490",
+"bw c #0f100f",
+"bx c #090909",
+"by c #767a76",
+"bz c #131513",
+"bA c #909490",
+"bB c #212321",
+"bC c #a1a5a1",
+"bD c #434746",
+"bE c #2b2e2b",
+"bF c #888c88",
+"bG c #919891",
+"bH c #6d7169",
+"bI c #464743",
+"bJ c #2d2e2b",
+"bK c #7e7f79",
+"bL c #3d3e3a",
+"bM c #595a55",
+"bN c #4b504b",
+"bO c #757670",
+"bP c #252623",
+"bQ c #828882",
+"bR c #8f9089",
+"bS c #676d67",
+"bT c #4f504b",
+"bU c #a7a9a1",
+"bV c #99a099",
+"bW c #878882",
+"bX c #6c6d67",
+"bY c #3a3e3a",
+"bZ c #424445",
+"b0 c #62635e",
+"b1 c #181917",
+"b2 c #979891",
+"b3 c #0e0e0c",
+/* pixels */
+".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI",
+"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH",
+"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S",
+"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM",
+".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4",
+"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR",
+"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG",
+"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0",
+"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L",
+"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK",
+"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9",
+".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW",
+".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO",
+".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2",
+"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6",
+"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0",
+"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3",
+"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo",
+"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw",
+".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2",
+"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF",
+"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6",
+".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo",
+"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe",
+"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P",
+"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH",
+"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l",
+"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B",
+"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G",
+"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA",
+"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA",
+"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN",
+"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW",
+"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O",
+".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E",
+".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak",
+"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq",
+"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V",
+"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX",
+"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B",
+"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4",
+".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k",
+"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM",
+"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL",
+"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq",
+"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo",
+"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG",
+"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq",
+"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0",
+"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI",
+"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5",
+"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL",
+"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c",
+"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe",
+"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0",
+"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ",
+".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8",
+"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA",
+"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX",
+".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo",
+"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb",
+".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM",
+".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA",
+"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX",
+"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo",
+".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM",
+"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c",
+".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL",
+".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH",
+"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK",
+".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA",
+"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl",
+".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE",
+"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z",
+"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap",
+"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.",
+"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN",
+"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas",
+"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA",
+"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT",
+".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7",
+"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E",
+".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM",
+"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2",
+"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT",
+"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap",
+".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n",
+"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas",
+".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3",
+"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can",
+"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag",
+".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.",
+"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH",
+"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0",
+"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA",
+".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM"
+};
diff --git a/examples/themes/themes.cpp b/examples/themes/themes.cpp
new file mode 100644
index 000000000..6e5b95bb9
--- /dev/null
+++ b/examples/themes/themes.cpp
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "themes.h"
+#include "wood.h"
+#include "metal.h"
+
+#include "../buttongroups/buttongroups.h"
+#include "../lineedits/lineedits.h"
+#include "../listboxcombo/listboxcombo.h"
+#include "../checklists/checklists.h"
+#include "../progressbar/progressbar.h"
+#include "../rangecontrols/rangecontrols.h"
+#include "../richtext/richtext.h"
+
+#include <qtabwidget.h>
+#include <qapplication.h>
+#include <qpopupmenu.h>
+#include <qmenubar.h>
+#include <qmessagebox.h>
+#include <qfont.h>
+#include <qstylefactory.h>
+#include <qaction.h>
+#include <qsignalmapper.h>
+#include <qdict.h>
+
+Themes::Themes( TQWidget *parent, const char *name, WFlags f )
+ : TQMainWindow( parent, name, f )
+{
+ appFont = TQApplication::font();
+ tabwidget = new TQTabWidget( this );
+
+ tabwidget->addTab( new ButtonsGroups( tabwidget ), "Buttons/Groups" );
+ TQHBox *hbox = new TQHBox( tabwidget );
+ hbox->setMargin( 5 );
+ (void)new LineEdits( hbox );
+ (void)new ProgressBar( hbox );
+ tabwidget->addTab( hbox, "Lineedits/Progressbar" );
+ tabwidget->addTab( new ListBoxCombo( tabwidget ), "Listboxes/Comboboxes" );
+ tabwidget->addTab( new CheckLists( tabwidget ), "Listviews" );
+ tabwidget->addTab( new RangeControls( tabwidget ), "Rangecontrols" );
+ tabwidget->addTab( new MyRichText( tabwidget ), "Fortune" );
+
+ setCentralWidget( tabwidget );
+
+ TQPopupMenu *style = new TQPopupMenu( this );
+ style->setCheckable( TRUE );
+ menuBar()->insertItem( "&Style" , style );
+
+ style->setCheckable( TRUE );
+ TQActionGroup *ag = new TQActionGroup( this, 0 );
+ ag->setExclusive( TRUE );
+ TQSignalMapper *styleMapper = new TQSignalMapper( this );
+ connect( styleMapper, SIGNAL( mapped( const TQString& ) ), this, SLOT( makeStyle( const TQString& ) ) );
+ TQStringList list = TQStyleFactory::keys();
+ list.sort();
+#ifndef QT_NO_STYLE_WINDOWS
+ list.insert(list.begin(), "Norwegian Wood");
+ list.insert(list.begin(), "Metal");
+#endif
+ TQDict<int> stylesDict( 17, FALSE );
+ for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
+ TQString styleStr = *it;
+ TQString styleAccel = styleStr;
+ 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;
+ }
+ TQAction *a = new TQAction( styleStr, TQIconSet(), styleAccel, 0, ag, 0, ag->isExclusive() );
+ connect( a, SIGNAL( activated() ), styleMapper, SLOT(map()) );
+ styleMapper->setMapping( a, a->text() );
+ }
+ ag->addTo(style);
+ style->insertSeparator();
+ style->insertItem("&Quit", qApp, SLOT( tquit() ), CTRL | Key_Q );
+
+ TQPopupMenu * help = new TQPopupMenu( this );
+ menuBar()->insertSeparator();
+ menuBar()->insertItem( "&Help", help );
+ help->insertItem( "&About", this, SLOT(about()), Key_F1);
+ help->insertItem( "About &TQt", this, SLOT(aboutTQt()));
+
+#ifndef QT_NO_STYLE_WINDOWS
+ qApp->setStyle( new NorwegianWoodStyle );
+#endif
+}
+
+void Themes::makeStyle(const TQString &style)
+{
+ if(style == "Norwegian Wood") {
+#ifndef QT_NO_STYLE_WINDOWS
+ qApp->setStyle( new NorwegianWoodStyle );
+#endif
+ } else if( style == "Metal" ) {
+#ifndef QT_NO_STYLE_WINDOWS
+ qApp->setStyle( new MetalStyle );
+#endif
+ } else {
+ qApp->setStyle(style);
+ if(style == "Platinum") {
+ TQPalette p( TQColor( 239, 239, 239 ) );
+ qApp->setPalette( p, TRUE );
+ qApp->setFont( appFont, TRUE );
+ } else if(style == "Windows") {
+ qApp->setFont( appFont, TRUE );
+ } else if(style == "CDE") {
+ TQPalette p( TQColor( 75, 123, 130 ) );
+ p.setColor( TQPalette::Active, TQColorGroup::Base, TQColor( 55, 77, 78 ) );
+ p.setColor( TQPalette::Inactive, TQColorGroup::Base, TQColor( 55, 77, 78 ) );
+ p.setColor( TQPalette::Disabled, TQColorGroup::Base, TQColor( 55, 77, 78 ) );
+ p.setColor( TQPalette::Active, TQColorGroup::Highlight, TQt::white );
+ p.setColor( TQPalette::Active, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) );
+ p.setColor( TQPalette::Inactive, TQColorGroup::Highlight, TQt::white );
+ p.setColor( TQPalette::Inactive, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) );
+ p.setColor( TQPalette::Disabled, TQColorGroup::Highlight, TQt::white );
+ p.setColor( TQPalette::Disabled, TQColorGroup::HighlightedText, TQColor( 55, 77, 78 ) );
+ p.setColor( TQPalette::Active, TQColorGroup::Foreground, TQt::white );
+ p.setColor( TQPalette::Active, TQColorGroup::Text, TQt::white );
+ p.setColor( TQPalette::Active, TQColorGroup::ButtonText, TQt::white );
+ p.setColor( TQPalette::Inactive, TQColorGroup::Foreground, TQt::white );
+ p.setColor( TQPalette::Inactive, TQColorGroup::Text, TQt::white );
+ p.setColor( TQPalette::Inactive, TQColorGroup::ButtonText, TQt::white );
+ p.setColor( TQPalette::Disabled, TQColorGroup::Foreground, TQt::lightGray );
+ p.setColor( TQPalette::Disabled, TQColorGroup::Text, TQt::lightGray );
+ p.setColor( TQPalette::Disabled, TQColorGroup::ButtonText, TQt::lightGray );
+ qApp->setPalette( p, TRUE );
+ qApp->setFont( TQFont( "times", appFont.pointSize() ), TRUE );
+ } else if(style == "Motif" || style == "MotifPlus") {
+ TQPalette p( TQColor( 192, 192, 192 ) );
+ qApp->setPalette( p, TRUE );
+ qApp->setFont( appFont, TRUE );
+ }
+ }
+}
+
+void Themes::about()
+{
+ TQMessageBox::about( this, "TQt Themes Example",
+ "<p>This example demonstrates the concept of "
+ "<b>generalized GUI styles </b> first introduced "
+ " with the 2.0 release of TQt.</p>" );
+}
+
+
+void Themes::aboutTQt()
+{
+ TQMessageBox::aboutTQt( this, "TQt Themes Example" );
+}
+
+
diff --git a/examples/themes/themes.doc b/examples/themes/themes.doc
new file mode 100644
index 000000000..eefdea1b5
--- /dev/null
+++ b/examples/themes/themes.doc
@@ -0,0 +1,55 @@
+/*
+*/
+/*! \page themes-example.html
+
+ \ingroup examples
+ \title Themes (Styles)
+
+ This examples demonstrates how to let widgets be drawn in different
+ styles (themes). As an example, themes looking like wood and metal
+ are implemented. You can switch between the different styles
+ during runtime using the pulldown menu.
+
+ <hr>
+
+ Header file of the Wood theme:
+
+ \include themes/wood.h
+
+ <hr>
+
+ Implementation of the Wood theme:
+
+ \include themes/wood.cpp
+
+ <hr>
+
+ Header file of the Metal theme:
+
+ \include themes/metal.h
+
+ <hr>
+
+ Implementation of the Metal theme:
+
+ \include themes/metal.cpp
+
+ <hr>
+
+ Header file of the example:
+
+ \include themes/themes.h
+
+ <hr>
+
+ Implementation of the example:
+
+ \include themes/themes.cpp
+
+ <hr>
+
+ Main:
+
+ \include themes/main.cpp
+*/
+
diff --git a/examples/themes/themes.h b/examples/themes/themes.h
new file mode 100644
index 000000000..7b6f4b544
--- /dev/null
+++ b/examples/themes/themes.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef THEMES_H
+#define THEMES_H
+
+#include <qmainwindow.h>
+#include <qfont.h>
+
+class TQTabWidget;
+
+class Themes: public TQMainWindow
+{
+ Q_OBJECT
+
+public:
+ Themes( TQWidget *parent = 0, const char *name = 0, WFlags f = WType_TopLevel );
+
+protected:
+ TQTabWidget *tabwidget;
+
+protected slots:
+ void makeStyle(const TQString &);
+ void about();
+ void aboutTQt();
+
+private:
+ TQFont appFont;
+};
+
+
+#endif
diff --git a/examples/themes/themes.pro b/examples/themes/themes.pro
new file mode 100644
index 000000000..df54c3a32
--- /dev/null
+++ b/examples/themes/themes.pro
@@ -0,0 +1,31 @@
+TEMPLATE = app
+TARGET = themes
+
+CONFIG += qt warn_on release no_batch
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = themes.h \
+ ../buttongroups/buttongroups.h \
+ ../lineedits/lineedits.h \
+ ../listboxcombo/listboxcombo.h \
+ ../checklists/checklists.h \
+ ../progressbar/progressbar.h \
+ ../rangecontrols/rangecontrols.h \
+ ../richtext/richtext.h \
+ wood.h \
+ metal.h
+
+SOURCES = themes.cpp \
+ main.cpp \
+ ../buttongroups/buttongroups.cpp \
+ ../lineedits/lineedits.cpp \
+ ../listboxcombo/listboxcombo.cpp \
+ ../checklists/checklists.cpp \
+ ../progressbar/progressbar.cpp \
+ ../rangecontrols/rangecontrols.cpp \
+ ../richtext/richtext.cpp \
+ wood.cpp \
+ metal.cpp
+
diff --git a/examples/themes/trolltech.gif b/examples/themes/trolltech.gif
new file mode 100644
index 000000000..ec8f37a2e
--- /dev/null
+++ b/examples/themes/trolltech.gif
Binary files differ
diff --git a/examples/themes/wood.cpp b/examples/themes/wood.cpp
new file mode 100644
index 000000000..3d78eb5a0
--- /dev/null
+++ b/examples/themes/wood.cpp
@@ -0,0 +1,1414 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "wood.h"
+
+#ifndef QT_NO_STYLE_WINDOWS
+
+#include "qapplication.h"
+#include "qcombobox.h"
+#include "qpainter.h"
+#include "qdrawutil.h" // for now
+#include "qpixmap.h" // for now
+#include "qpalette.h" // for now
+#include "qwidget.h"
+#include "qlabel.h"
+#include "qimage.h"
+#include "qpushbutton.h"
+#include "qwidget.h"
+#include "qrangecontrol.h"
+#include "qscrollbar.h"
+#include <limits.h>
+#include "qstylefactory.h"
+
+/* XPM */
+static const char *polish_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 96 96 254 2",
+/* colors */
+".. c #9c4a34",
+".# c #a4825c",
+".a c #bc5e2c",
+".b c #d48432",
+".c c #dc9f51",
+".d c #bc6e1c",
+".e c #d4855d",
+".f c #94664c",
+".g c #bc714e",
+".h c #8c6664",
+".i c #d4923c",
+".j c #bc8444",
+".k c #d49360",
+".l c #d4794e",
+".m c #ecaf68",
+".n c #bc8365",
+".o c #d47439",
+".p c #a46954",
+".q c #dc9f70",
+".r c #e48544",
+".s c #bc7b51",
+".t c #a47761",
+".u c #bc7b42",
+".v c #a4523c",
+".w c #e4945e",
+".x c #9c784c",
+".y c #d4844a",
+".z c #eca053",
+".A c #bc614c",
+".B c #e4855c",
+".C c #bc8350",
+".D c #c48e68",
+".E c #b16634",
+".F c #e49339",
+".G c #bc703a",
+".H c #bc7c67",
+".I c #a45f34",
+".J c #cc714d",
+".K c #d48c5f",
+".L c #a47057",
+".M c #cc703a",
+".N c #dca674",
+".O c #b47859",
+".P c #bc6729",
+".Q c #d49475",
+".R c #d48b4a",
+".S c #cc8351",
+".T c #cc8466",
+".U c #ac6841",
+".V c #e4a651",
+".W c #e49576",
+".X c #d47d31",
+".Y c #ac6e4b",
+".Z c #c07650",
+".0 c #e48c43",
+".1 c #e49452",
+".2 c #9c745f",
+".3 c #e47e54",
+".4 c #cc7c4f",
+".5 c #cc7c32",
+".6 c #b46133",
+".7 c #d49a68",
+".8 c #d67e4f",
+".9 c #bc7643",
+"#. c #b47056",
+"## c #d48b3a",
+"#a c #dc9f5e",
+"#b c #e49a60",
+"#c c #cc6a31",
+"#d c #8c6244",
+"#e c #dc9a41",
+"#f c #eca753",
+"#g c #bc8a58",
+"#h c #d48c76",
+"#i c #bc693f",
+"#j c #bc715d",
+"#k c #9c6857",
+"#l c #f4b171",
+"#m c #bc8a6a",
+"#n c #eca16d",
+"#o c #a87e58",
+"#p c #a4613f",
+"#q c #a48569",
+"#r c #d4846d",
+"#s c #dc935f",
+"#t c #c47c50",
+"#u c #dc8449",
+"#v c #bc6950",
+"#w c #cc9678",
+"#x c #c4703a",
+"#y c #cc7b67",
+"#z c #dc8c5e",
+"#A c #ac7067",
+"#B c #eca86e",
+"#C c #b4786d",
+"#D c #dc8c4a",
+"#E c #b46842",
+"#F c #d47c41",
+"#G c #e48d51",
+"#H c #e59a52",
+"#I c #9c6e3f",
+"#J c #d49351",
+"#K c #cc843b",
+"#L c #ecb678",
+"#M c #9c5a38",
+"#N c #d4795c",
+"#O c #c47b39",
+"#P c #ec9560",
+"#Q c #ac764c",
+"#R c #c48351",
+"#S c #c48e74",
+"#T c #cc7650",
+"#U c #cc8a84",
+"#V c #bc6a5c",
+"#W c #e4af74",
+"#X c #b46855",
+"#Y c #e4a06e",
+"#Z c #ac775b",
+"#0 c #e48d5d",
+"#1 c #c47d65",
+"#2 c #cc763f",
+"#3 c #b47e5d",
+"#4 c #cc8a55",
+"#5 c #cc8a67",
+"#6 c #bf622f",
+"#7 c #dc853b",
+"#8 c #e49f4a",
+"#9 c #9c505c",
+"a. c #8c5644",
+"a# c #cc7329",
+"aa c #a45a51",
+"ab c #b48264",
+"ac c #9c7a7c",
+"ad c #9c5f4f",
+"ae c #b4844c",
+"af c #a46749",
+"ag c #dca664",
+"ah c #b46e1c",
+"ai c #c4762c",
+"aj c #a45a3c",
+"ak c #dc9a74",
+"al c #ac7e46",
+"am c #ac6a6c",
+"an c #eca862",
+"ao c #e49a41",
+"ap c #e49a78",
+"aq c #bc7660",
+"ar c #d57e5e",
+"as c #9c6e5c",
+"at c #ab7e65",
+"au c #cc8a44",
+"av c #9c6240",
+"aw c #bc6244",
+"ax c #bc5d3f",
+"ay c #e48550",
+"az c #eca060",
+"aA c #cc7160",
+"aB c #cc7c42",
+"aC c #b46241",
+"aD c #b4726c",
+"aE c #eca67f",
+"aF c #9c6a3c",
+"aG c #94685a",
+"aH c #c48240",
+"aI c #c48465",
+"aJ c #dc7640",
+"aK c #cc8f54",
+"aL c #e4a76f",
+"aM c #c4692e",
+"aN c #dc9474",
+"aO c #ac6050",
+"aP c #b47048",
+"aQ c #94614b",
+"aR c #ac836c",
+"aS c #a47048",
+"aT c #b4764a",
+"aU c #ec8e5c",
+"aV c #dc9a53",
+"aW c #cc765e",
+"aX c #b48a64",
+"aY c #dc9a63",
+"aZ c #c47640",
+"a0 c #ec9a60",
+"a1 c #c48a54",
+"a2 c #c48a67",
+"a3 c #ac5a3c",
+"a4 c #ac8458",
+"a5 c #dc855d",
+"a6 c #c4714d",
+"a7 c #dc9243",
+"a8 c #dc794e",
+"a9 c #ac6955",
+"b. c #cc8f67",
+"b# c #ac6032",
+"ba c #ac7056",
+"bb c #dc7a34",
+"bc c #ec9553",
+"bd c #dc8d3b",
+"be c #e4a060",
+"bf c #f4a654",
+"bg c #c46842",
+"bh c #c46f62",
+"bi c #ac613d",
+"bj c #dc866c",
+"bk c #c4694e",
+"bl c #dc7d42",
+"bm c #ec8d4f",
+"bn c #dc9351",
+"bo c #cc9177",
+"bp c #c4695f",
+"bq c #ecb075",
+"br c #e4a75f",
+"bs c #d4843c",
+"bt c #bc722c",
+"bu c #d4936c",
+"bv c #d47644",
+"bw c #bc7d5c",
+"bx c #ac563c",
+"by c #e4956c",
+"bz c #a47a4c",
+"bA c #d48454",
+"bB c #bc825c",
+"bC c #e49544",
+"bD c #bc7044",
+"bE c #bc7e74",
+"bF c #d48d6c",
+"bG c #cc7144",
+"bH c #b47864",
+"bI c #bc6a34",
+"bJ c #d49684",
+"bK c #d48b54",
+"bL c #cc845c",
+"bM c #cc8474",
+"bN c #ac684c",
+"bO c #cc7d5c",
+"bP c #eca27c",
+"bQ c #dc946c",
+"bR c #c47c5c",
+"bS c #dc8554",
+"bT c #c47244",
+"bU c #dc8c6c",
+"bV c #dc8c54",
+"bW c #b4684c",
+"bX c #cc8344",
+"bY c #c47b44",
+"bZ c #c4825c",
+"b0 c #e4a17c",
+"b1 c #ac7a64",
+"b2 c #e48c6c",
+"b3 c #c47a74",
+"b4 c #e49f54",
+"b5 c #9c674c",
+"b6 c #946764",
+"b7 c #c48674",
+/* pixels */
+"#u#G#G#P#G#G#G.1#G#G.1.1.1.w#G.r#D.1.1.1#D#DbVbV.K.K.K.KbO.Z.Z#TaP.GaT.Z.O.O.O.H.9aP.ZaPaPaPbZbo.i.k#J.k#JbKbnbn#b#sbVbV#G#G.r.ray.r.0#G.0#G.1bc.r.0.0bc.0.0.0.r.1.1.1.1#G#D.0#D.0.0.0bcbcbc.1.0",
+"#aagaLbrag#a#a#a#DbVbn#G#0.1#0#Da5#za5.4.J.Jbk#vbt.G#x.9bY.4#tbYbw.saPaP.Ub#af.Y.s.s.Z.saP#E.gbw.U.U.UaObWbWbWaPb#b#.E#t.K.K#z#s#s#sbQ#s#sbn#s#sbn#s.w#s.w#s#sbn.ybV#s#sbV#s#sbQ#aak.7.k.7.k.k.k",
+"#..g#.#.#j#.#XbW#Z#o.O.O#3.n.n.Halalalala4aXaXa4#t.u.9#R#5bu.k#5bob7aIaI.nbwbw#m#5aIa2#5#5aIb7#5.DbBbB#3bwbw.C.O#oabab.naI.C#t#R.9#tbY#tbY.ZbY.s#t#t#t#R.sbY.s#tbD.Z.Z#t.9.Z#t.4bBbw.s.saT.9aTaT",
+".ybS.ybSbVbVbVbVbl#u#u#ubSaybSay#s#za5#z#z#z.KbA.Qb.aIbZbZbB.g.U.gaP#.aP#.aPaP.O.9aP.g.s.O.ZaP.Z#CaD#Aamamamam#X#3#Z.OaPaPaPaP.saZbY#t#t#tbY#tbY#t#tbLbZ.SbR#t#tbZbRbZbRbR.sbRbR.4aBaB.4bY.4.4.4",
+"bKbV#zbKbA.ybK#zbV#z#0bS#0#0#0aya5bA.4.4.4#T#xbgbwaq.O.g.O#j#.aPaCaC#v.g.gaPaP.Z#R#R#t#t#t.Z.s.Z#O#O.5aH#KbY.S#4bD.G#xaZaZ#2.SbVbV#s.wbV#zbSbAa5.e.KbQbQbU#s#z.K#5.K#5.T#4#5.Kb..4bZbL.T.ebL.K.K",
+"#A#A#C#C#AaD#CbEatataRb1b1abb1.t#I.f#IaSbz.x.#.##v.g.g#1bR.T#5#hbObO.T.K.K#5.KbubL.4.4#t.4.Z#tbL.e#r.K.K.e.e.T#r.K#z.K#z#sbVbS#zbV#u#ubVbl#F.8.l#2.4.8bAbA.l.4bva6.g#x.g#x#i#i#i.L.Lba#Z#Z#Z#Zba",
+"aPaT.u.u.s.C.C.C.SbA.S.4.SbA.8.8#r#rbF#h.TbO.T#h.KbF.e.e.S.S.S.S#u.y.8bA.e.4bA.e.K#zbQ#s.K.KbUbQ.y.R.y.yaB#O#xbT#t.4bLbLbL.4bL.S.4.S.4#T.Za6.Z.JbD.g.Z.g.Z.g.Z.ZaP.g#iaP#i#E#EaC.Obababa.ObH#Z.O",
+"#zbSbA.e#za5.e.8bV.KbV.ybAbK#zbK.8.ybV#z.y#F.y#sbKbA.Rbn#sbn#b#b#Y.w#sbV.y.4.lbA.y.y.ybA#T.MbG.4bObO.4.SbLbOaq#..O.Yaf#p#p.I.U.UaT.Z.O.Oaq.O.H.Hb1b1#Z#Z.L#Zat#3bw.s.HbBb7aIaIaIbA.l.4aBbAbA.e.e",
+"#DbVbn.w#s.w#sbVbAbSbSbV#D#GbS#0.1#H#H#H#b.1bn.1#4.S#t#t.S.TbL.S.K.K.K.S.SbK.e.S#t.4#t#tbDaPb#b#.U#E.9.S.ebVbS#G.K.K#r.l#y#T.Z.Z#2aB.S.ybS#u.8#F#Kau.y.S.y.y.R.y#z#z#sbn.1bna7bd#F#DbVbVbV#s.w#s",
+".1#s.1#s.1bVbS.y.K#z#sbVbVbA.8#FbA.8ar.8.e#r.e#NbKbA.S.S.S.SbLbLaBaBaB#2aB.SbKbAbVbVbV#s.w#YbebQ.KbA.e.KbV.ybl.ybsbsbs#D#u#D#u.R.y#D#DbVbV#s#0.wbebe#b#bbQ.wbn#GbV#G#D#G#D#GbV#D.ybV#sbV#s#s.w#s",
+".wbn.w.w#bbQbVbV.4.4.ybKbnbV#z#z#G#D#D#D#u#D.y.R#2aB#2.M#x.M#2#2#z#s.w#sbV#s.w#s.1.w.w#b.w.1#G#G#s#zbVbVbVbSbVbVbd#ubd.r#D#D#D#D.1bC.1.1.1.1#D.1bV#G#0#0#G.w.1a0bC#G.0aybS.Ba5a5bVbVbV.w#z.w#sbV",
+"#ubVbVbVbV#GbV#D#s#sbn#b.w.w.1bVb2b2a5#z#z.K#zbA.w#s.w#sbV#s#z#s.w#b.w.w#GbV.w.w.X#Da0a0#G.1bcaz#G#GbS#GbV#ubV#0#z#0#0a5#0#0b2#0.0.r.0.0#u#u#F.o.M.M.M#F#ubV#G.1#b#P.w.w.w#0aya5.y#u.y.ybVbnbVbV",
+".wbV#GbV#G#s#G#0.1#G.1.1.1#G#G.0#0#0.w.wby.wbQbn.w.w#G.w.wa0#b#P#u#G#G#0#G#G#G.w#baz#Yaz.1.0#D.0#G#G#G#GbVbl.8blbva8.8.B#z.Ba5#0ay#G#G#z#G#z#z#z#zbU#z#z#zbQbybQ#zbK#z#s#sbn.R.y#2#2aB.8bVbV#0bV",
+".w.w.w#z.w.w.w.w#GbV.r.0.0#G#G#Gbda7a7#H#8#8#8#H#u#u#F#u#D#GbV#u#G#G.w.1.w#G.wa0bV#D#DbV.w#baz.w#G#G#G#G#0.BbSa5#u#u#D.1.1bn.0#7#z#0bSbSbSa5#z#z#r.e.e.4.4#2#2bT.4.4.4.S.R.Rbn.i#s.K#zbV#s#0bV.w",
+"#u.8#u#u#ubV#GbVby.wbQ.w#b.wbVbl#T#T.l.ear.Ba5.8.w#G#G#G.w.1.1.1.1#G#G.w.1#G#G.w#P.w#G.1.w#P.w#0#D#DbV.w.w#0#0#0.w#b#baVaVbn.1#G.y.y#F#F#2.obv#Fay#z#GbVbV#z.e.e#z#z#zbV#s#s#s#sbQbQ#sbQ.wbV#G#0",
+"#0#0#0#G#0#u#ublbDbT.4#4#zbQ.e.e#s#s#s#z.w#0#0aU#DbSbVbV#D#D#D#G.w#G#G.w#P.w.w.w#Gbmbmbmay#u#G.waz#b.w.w#Ga5bl#uaraW#i#i#ia6.4.ebVbnbQ#b.w.w#GbV#u.r.r#G#G#G#0a5.1.wbV#zbSar.J.JbT#x#2.y#F.8#u#G",
+"#5.TbL#tbD#i.g.Z.SbA#zbAbKbSbSbA#u#D#G#u#u#u#DbV#GbVay#G#0#G#G.r#D#Gbn.w#b#b#HaY.1bVbV.y#u.y#F#Fbv.o.M#2#2#2aBbG.9#OaB.y#D.1.1.1.w#s.1.w#G#G#G.rbdbda7bdbnbn#sbQ.nbw.s.Z.4.8.8.8.obl#u#zbV#z.K.K",
+"#i#x.Z#tbL.K.kbQbAbVbK#u.ybSbV#z#G.w.w#G#D#G#0#G.1#G#D.1.1.1.1.1bVbV#z.yaBaM.M.5.y.y.y#ubV.w#P.w.w.w#b.1.1.w.wby#b.w#b.w#b.w.1.1#u#u#ubVbAbK#z.S.T.TbO.Z#vbga3axbD#xaZ.8bAbAbAbA.e#4bA#ta6.P.6.6",
+".S.4bL.e.e.e.ebA.8bSbSbSbVay#0#G.1.1a0.1#ba0#H#bbc#Hbc#Ha0bc.1.0#z.8#T.J.l.ebVbV#G#G#G.w.w.w.w#P.w#b#n#b.1.1.w#n.1.1.1#G#G#D#ublbl#2.4.4.g.Z#ZbN#9#9aa#X.g.ZbOar.Mbvbla5#z#zbA.laPbNbi.U.U#..Zbw",
+"bL.e.e.e#zbSbSbl#u#DbS#G#G#0#G#G.1.1.1.1bc#Ha0.1#G.1.1a0#b.1#u#F.e.4#T.8by#b#na0a0#b.w.w.w.w#P#0bVbV.1.1#G#G#u#G.1#G#G#ubS.8.l#T.Z.g#ibW.UbNa9#p.UaP.9.S.ybVbV#Dayay#z#z.e.4bT#i.pad#pbN#.bRaI.T",
+".4.e.KbS.8blblbSbSbS#GbV#G#0#G#G#G.0.1.1bcaz#H.1#G.1.w#P.w.w#z.8bK.KbQbQbV#u#D.1#0#G#G#G#G#G.1#P.1.1beazbe.1#G#u#zbK.K.4bO.Z#j#v#A#ka9.YbW.ZbL.4.R.R.ibn#D#u#F#FbS.S.4aqaPbNbi.I#.bWaP.gbObL.8bL",
+".K.K#z.e#F.lbv#F#z#GbS#u#u#G.w#G#u#G#G#G.1a0bc.1#P#P#P.w#GbVarar.R#J#HaY.1.1.1#H#H#b.1.1bc.1#P.1.w#b#bazbe.w#zbA#t#t.Z.Z.Z.g#.#.b1ba#..Z.Z.lbS#u.y#u#ubSbS#N.laA#j.ga9#kad#ka9#..g.g#tbO.e.e.ebA",
+".l.l.8.y.8bAbAa5bSbS#ubSbS#0.w#G#G#G#G#G.1bc.1bCbm.1.1.0#Dblbv#T#D.R.ybVbe#nazanananbeaz#b#bbc#H.wa0.1#sbV.S.S#t#t.s.Z.sbwaIaIaI#t#t.4bA.lbl#ubl.3a5a5.e.4bh#V#XbN#k#kaG#k.L.OaIbL.e.K.ebA.y.4.8",
+"bSbAbAa5.ebA.8.4.8.ybS#z#G.w#0bSay#0bm#G#G.0.1.0bc#H.zbf.zbe.1#z.KbVbSbA.y#D#D.1bebebe#HbeazazazazazbebV.S.4#1bMbZbR.Z.Z.Z#t#tbYbl.o#ubS#Gay#0#uarbl.laB#t.uaT.Oad#kaGb6#ka9.g.Z#t#t.4.4#t.4bK.K",
+"aBbs.y.ybA.l.lar.4aBaB.8.y#F#u.wbn#D#D#G.0.0a7.FbdbCbc.1.1.0.1bc.F#8#H.1.ybG.4.ebn#s#s#baY#saYaV#b.w#s#J.SaZbD.sbR#t.S#z#ubs#F.R#D#D.0#G#G#G#G.0#D.R.yaBbDbDaP.g#Zb1.L.fb6.h.hac.I.YaT.u#t.Z.Z#2",
+"b3bR#1.4.4.4bX.R.K.KbV.ybl#F#F#F#za5a5.B#z#0#sby.1#G.1.1.1bm#G.1a0a0#H#H#b#b#s.ya#.X.y.ybVbn.w#bbebeaY#sbAbRbZa2au.S.R#s#z.y.e#zbs#ubn.1.1.1#G#D.0#D#D.RbA.4bO.4aPbD#Eb#af.I#Maf.2.x.L.L#Z.O.n#S",
+"aObi#Xbw.s.sbY.SbXbK#z#z.w.w.wa0#z#za5bS.l.l.8bVbSbVbS#G#G#G.w#Pbe.w#b#bazbrb4#Hbebebe.1#u#F.5.X#F.y#s#Y.NaN.Q.Q.T.Tbu.w#sbn.1be#sbVbV.y.y.ybn#b#G#G#G#G#0bn#zbSbn#bbn#D.R.RaBbX#3.O.Yaf.I.Ibi#E",
+"aVbX.G.6a3aCb3#U.y#z#s#0#z.w.w#s#H#H.1.1.0#G#Hb4bVbV#u#u#u#D.0#D.1.1.1#D#7#D#Hb4bCbc.1.w#b#b#n#nbe.1#u.yaBbX.S.kb4.cb4aYbA#T.4#r.4.K.K#s#s#s#D.y#GaybV.w.w.w.w.w#G.w.w.w#b.1bn.1#P.w.w#0#0aybS#G",
+"bnaVaYbeaNarbp.A.P#2#F.y#u#s.w#sb4b4.1.1.1.1#H#H#nbeaz#b#HbnbCa7.zbe.z.1#D#D.w#Baz.z#H.w#P.w.w.wbebeanbrbebn.RbX.4bQb0aL#BaYa7.bbA.4#xaMaZ.ybK.kbA.4.4#F.8.ybA.ybv#u#ubS#sbV#D#zbl.ray#G#G#P.w#P",
+".w#0bSbVbV#D#D.1aY#b.w#zbS#FaBaB#x.M.l.8a5byap#bbn.1bebebebebeaza7.0bd#u#ubSbS.BbC#D.0#D#G.w.w.1anazb4bebebebr#B.V.c#D#Oai.S#s.WaE#Y#Y#YaY.kaB#x#4.S.S.4aBbX.y.y.y.K#z.KbV#z.ybV.ybKbKbK.K.K#z.k",
+".8.8#u#G.w#HaV.1#s.w#s#0#zbV.wbQ#na0by#0a5bSbvbg.M#F.y#ubSbA#z.k.w.w.w.wa0a0.w.w#H.w#HbV#D#u#G.1.1.1#b.w.1.1#D#DbVakaLaLaLbq#B.VaB.XaB.ybKbQaLaL.q.qaY#a#b.w#b#b#b#b.wbn#s#D.y#D#s#s#s#JbKau.SbA",
+"b4#Hbe#baY#s.K.S.y#F.ybSbS.R#zbe#H#H.1#Gbc#b#bbn.w#bbybQ.4#xbga6#T.l#za5bV#G#Gbc.w#b#b.wbV#D.1beby.wbVbV#z#s.w#Y#bbeaY#J#s#Ybe.1#B#B#Bbr#s.RbA.KbKbnaV.w#b.w#Ha0b4anbe#Hbe.1.1#bbC#8bc#Ha0a0#Pbc",
+"b4#8#8#H#HbCbC.1b4#b.w.1#P#G#G.0akbVbXaB#2#2.4bAbA.KbAbV#s#b#YaY.1bV.8aZ.GbYaB.S.RaV#abebn.1#8az#b.w.w#b#ba0by.w.1#Hazbebe.1#s#b#ebnbnbnaVaVaYbnbnb4bebe#abe#abebnbnbnbn.ibnbnbn##a7#8#8#ea7beaL",
+"#Y.w.w#s.w#0#z#0#D#DbVbVbVbV#bana7#D.1.1#b.1#D#D#u#u#Fa#.o.y#D#D.r.r.w#b#Y#b#b.w.gbkbg#Tar#za5a5####.5.b.Ra7.1bn#HaV#H#Hbn#D#D.ybQbQ#z.K.e.K.e.ea7bnaVa7bnaY#aaL.m#Wbrbr#Ybr#W.m#L#L#L.mbeb4.w#b",
+"#sbK.ybS#z#zbSbS.k.k.K.S.SbAbKbn.w.1#D#GbV#GbV.w#G#G#G#u#u#ubl#7.r#G#G#0#zayay.0#Y.wa5bS#zbS.8.M.4.Z#xbka6#TbObO#D.Rbn#s#bbebebebV.R.R.y.R#D#DbVbebe#BbqaLbebn.Rbnbnbebr#BbrbeaV#Da7bran.mbr.1#D",
+"anazbean#Banbe#H.y#O#x#x.ybKbK.R.Jbvar.ebja5#N#TbvbS#z#0#0.1#0bV#G#u#u.o#Fbb#7bm#F#7#u#D#Dbn#bbe#s#s#sbn.w#zbVbVbkbpbpbpbhbhbhbhaAaAaWaW#N#r#rbFbs.ybKbn#b#YaLbq#Bbrbebebebr#BbqbeaLbe#Y#B#B#B#B",
+"a7#DbCb4azananan#BaL#b#Yby#b#G#ub0aN.e#x#i#xaWbObAa5.e.8.4#2.4.4.w.wbQ#zbSbSbVbV.w#z#zbS.JbGbG.l#D#GbV.1.w.1#G#G#H#8#8#8aoa7#8#8#D#Dbn.1bnbC.1bC#b.w#D#D.y.5bs.y##a7#Hbranbe.1.i#sbn#D.Rbsbs#ubs",
+"#b#0.y.8#2#2#2#2#F#u#G.w#0#G#Pazb4b4beb4bnbn##.5#xaB.4.4.4.e#z.K.e.SbA.8bA.ebK.K#zbV.y#ubVbVbVbVar.8ara8ara8a5ar.RbV#zbVbA.y#D#sbSa5a5bV#zbSbVbS#G#DbV#b#b.1bn#bananbeb4b4anananbean#B#B#Bazbebe",
+"#0a5bSbV.w#Y#BaE.1#0.wbSay#uay#Gbd.FbCbC#H.zanaz#b#b#b.w#zbA#2#c.P#6#6.M#2.e.K.k#KaB.Xbsbn.1.1#7#Hbna7#D#D#D#D.0#0#zbVbV#u#F#FblbdbCbC.1bC#G.1.1bV#u#D#G#Hbean.manbeanan#B.manan.mbebe.1bV.1.1.1",
+".zbCa7#Hazanb4#8#Y.w.y.8#z.w#G#D#G#0#P#0#0#0#uaJ#D#u#ubl#D#0.wb2.w.1#0#0.w#z.4.G#vbhbRbO#rar#N.l#4bL.S.4.4.4.4bLay#D#uay.1#Ha0.w.1.w.1.w#G#s#0.w#G.1.1an#Bazb4b4anazb4b4.zananan#f#f#8#b#H.w.1#b",
+"b4#Hbd#Ha7#H.1.0a7#H#b.wbV#s.w#0#D#D#D#D#G#u#u#G#G#G#GbV#u.8.y#ubs#7#G.1.1bn#D.y#xbXbAbAbYbt.Z#RbXbK#s.k.R.S.RbAbl#F.o.o#Fbv.yblbV#u#7#G.1.z.z.z.w.1#G#u#D.0#G#nb4#H.1.1#b.zb4.z#H.1.1.1#Hbe.m#B",
+"#Y.w#D.1ay.w.w#Ga7#H#H.w#G#G#G#G#D.wbV#G.1.w#G.1#D#D#ubSbA#u.KbV#s#G#u#u#ubVbn#s.zb4b4#sbO.g#V#X.MaB.yaBaB#2aZ#2.y.y.R.KbQ.KbQbu#zbAbK#s#bbe#Ybea0be#bbn.w#D.y#G.1bC.1.1a0#b.z.z.zbc#H.zbCao#HbC",
+".wbS#0.wa0a0#na0azaz#b#H.1#G.0.0.w#P.w#G#0#G#uay#D#DbAbK#z.KbSbK.l.4bv.8#F.l.e.S#ubAbA.RbK.K.K#s.4bAa5#z#z#z#z#z#w#m#3ba.p.p.L.L.ZaZbD#t#R.SaKaKakap#Y#bak#s#zakbn#D#u#D.y#7bs#7#F#F#u#0#0#0by.w",
+"bna7anbran#8az#8.1#ba0#bbcbeaza0a0.w#G#G.1bm#G#0.1#z#GbV#z#0#s#G.e#z#z#za5.8bGbgaAbv#T.l#F#Da7a7bQbybQ#z.e#z.ebAblblay.0ay.raJ.obR.s#tbR#t.s.s#tbDaZa6bT.Z.gbT.SbA.S.S.KbQ.q.q#YbqaLbeaV#D#u#D#u",
+"auauaL#W#Wbr#L#Wbe#nbe.w.w.w.1a7.1#H.1.0#u#7#7.r.0#ubl#uay#Gay#u#z#za5#u#ubS#za5#D#u#u.8.8.8.8#r.4bYaZ.G.GaZaZaZ#t.SbLbFb.#5bO.Z#t.Z.Z#t.Z#iaC.E.Z#1.g.ga6#ibWbR.C.s#..OaPbNbi.Ua9ajaO#X#v#y#r#h",
+"bL#1b.aI.g.I.UaP.GaZ#t.4.SbK#sbQbe#Bbe#b.1#D#D.w#G#DbSbl.8bl#u#F.8aB#F#F#F#ubV.w.ybSbS#u.8.8a5#z.k.K.KbK.KbQaYakbu.K.S.4.4.4.S.e.4.8.4.ebF.Kb.#h.gbR#taq.ZbW#E.gaP.YbNba#.babaaP#3.u.s#R#R.S.KbK",
+"a6a6.Z.ebO.T.QaNa2a2aIaT.Ub#.6.EbIaZaZ.4.S.SbA.kakbQ.k.KbF.ebA.y.e.ebSbS#u.8#FbG#r#r#r.e#F.ybsbdbV#zbV.yaBaB#2#2#MavaS#Z.O.O.OaPa6#i#i.ZbRaI.H.n.ZaIaI.T#5aIbRb.b.bLaIbRbR.gbWaP.g#v.g.Z#x.gbT#i",
+"#H.1#DaY.ybV.SaB.Y.O.O#.#X.ObBaIbR.T#1#t#1.Z.g.ZaP.U.U#EbW.g.g.g#T#T.4.l.l.8bS.e#F.8#F.l.8arararblbSa5#0bS.BbS#ubV#u#ubl#ublblbl#5bZ.gaP#.babN.pb##E#E#E.Z.g.gaIaB#2.ZbL.T.e.e.K#z.kby#b#b#Y#Baz",
+"brbrb4#Hb4.1#D.0.R.y.y#F.yaBbvaB.Z.g.g.g#jaOaxbxaFaS.Y.O.s.s#ta2#Fbla5bSay#ua8bl.y.y.RbK#J.KbKbK.S#F.y.8.8bA#F.l.y.y.8.8.4.4.4.4aPbtaPaP#E.YaPbNaP.Z.sbwbw.C.CbZbB.C.Z#..O.H.OaP#RbX.SbK#JbnaV#a",
+"aZ#taZ.Z.4bLbO.ebLbR.S.TbL.T#4buaK.S#R#R#4.Sbw#t#3aT.Z.ZbD#i.E#i#Z#ZafafbN#Z.na2.3ay.B.Bay.B.8a8bn.y.4.4.4.8.8bAbl.y.ybKbS.e.e.8#F.K#s#s.k.KbLbObL#t.Z.9.G.GbI.E.G.9aP.g.ZbZbZ#tbJaI#.#EbW#E.g.Z",
+"aKaKaH.u.C.C.sbw.O.O.O.O.Y.Uba.O.uaPbtaT.u.s.s#Rb.#4#5bLbL#T.Z.4.4#t.4.4#t.4.y.ebKbAbV.KbAbAbA.K.KbVbAa5#z#z#z.y#z#zbS.8aB#2.M#2.o#F#ubl#F#u#G.wbQbKbKbnbQ#YaL#Y#saY.KbAbYaBaBbY#.bibiaPaI.Tb7bR",
+"#h#5#1#X#jaOaaaa#M#paf.Ybaba.n#S.H#.#.aDaqaqaq.HaPbW#x.Z.4.Z.4bR#RbLb.b..k#4#R.4#RaH.u.u.u.ja1aK#F.S.4.K#zbQ#zbVbSbSbS.ybS#DbVbVayayayblbbbl#u#G#D#u#u#D.1.1#b#H#H#b#b#GbV#s#b.1#L#WaL#WbqaLbK#K",
+".zanbeb4be#aaY#aak.k#4bL#t.G.G#i#1#j#j.gaq#j#.bW.ZaT#tbRbObRbLb.#u.r.r.r.r.rbmbm#za5bv.la5a5a5a5.K.4#xbg#xbg.MaM#2.8bV#s.w#sbV#ubS#z.1#z#G#G.1#G.1.1.1.1.1.1bc.1.1.1.1#G.wazaz#Bb4#8bC#Hbebe#H#b",
+"#D#G#G#u#0#zbSbSbVbVbAbAbV#z#z#s#JbK.R#s#saYaVaYb.#4.SbL.4.Z#t#t.L.LaS.Lba.O.n#mbQ#z.K#zbQ#0.e#2bQ.K.K.K#z#s#z#D.y#F#F#F#F#F.oaB.8.y.8.y#ubV#0#D#u.r#G.0#G#G#Gbc.1#G#G#G#G#Hbc.1#naz#b.w.1#0#0#P",
+".z.zbcbCbcbC.0.0be#b#ba0#H.1.1.w#Dbdbdbn#H#8.z.z#BaL#b.w#sbV#z#s.K.K.K#z.K.K#z.K#R.C.j#RauaubYbt.6#6a6bL#zak#bak#D#D#D.y#u#u#0#0.w#sbV#u#F#Fbl#u.w#0#G#G.1#G.1#G.r#GbV#GbV.1bc#H.w.w.wa0#0bS#G#0",
+".w.w.1#G.1#P#G#P.w.1#H.1.1#D#D.1by#0#0#G#P.w.w#b#Hbc#Gay#G.r.1.wbv#F.l#F.laJbvblbA.8.l.8a5#z#zbS.K#4bO.4#TaBaB#Fb4#baz#b#P#zbl.o#F#D#0#G#G#GaU#0.B#u#u#u#G#G#0.1.w.w.w.w#0#G.1.1b4anbraz#8.1#8az",
+"b4.1bnbC.1b4.zaz#f#fbr#fb4#8.Van#f#8#8ananbe#G#u.1#G#DbC.1.1.w.1.w.1#G#G#GbS#ubSaiaB.SbXaB#2.4bKbvar.ebF.T#1#j.gah#O##bnbn#D#baY.1#D#DbS#u#D#7#7.o#u#0.wbya0a0#0.wbn#0bSbAbS#z#0#8#8an.z.1bd.1a0",
+"#b.1.1bn.1bebran#W.man.manbran.m.m#Bbebe.1#D#D#bbCbCbC#GbC#G.1#G#u.8#ubSbVbS#z#z.w#s#D#ubV.1.w.w#Da7bd#Dbs.5.5#O.Q.Q.K#N.Jbgawax#O.y#z#s#z#z#b#B.zazaz.1#GbC.0bd#7#D#ubSbV#G.wbebr.Vbe#8#D#7#7#G",
+"#b#b#b#b.w#b#bbeb4#H.cbebe#bbnbK.e#z#z#sbVbs#D#G#z#z#za5a5#za5a5#sbn#z#z#z.y.8bAbl#F.o.o#u#G#G.r.1bnbn#D#DbV#z.w#T#x.MbGbla5a5.eaB.S.SbT.6.a#2bK.1bn.1bn.1bean#lazazbe.1.R#F.5a#.S.e.ebUbU.W.Wap",
+".ybAbAbKbK#DbV.waV#HbebebeaYbnbn#z#FaB#F.y#D#Dbnbe#H.1bn.1#Dbnbn#8#eao#e#8#8#8#8#0#0#0.w#G#G.ray#2.J#2#2.la5#z.w#b.1#u#Gbnbn#D#DbAbA.4.4.8bA#z#z.e.8#T.J#x.l.K#z#D#0.w.w#b.qbraLanbr.Vbr#8bd.b.b",
+"#B#B#Bazbrbebebe#8brbrbrbe.zbrbr.mbrb4#H#b#sbVbV#NaW#T#T.J.JbkbkaAbp#Vbpbhbpbpbp.e#zbQ.w.w#s.1.w#H#b.1#G#D#7#7#FbS.8.l.l.8a5#sbybV#G#0.w#0#z#Fa#.4#NbOar#r#r#z#za8.ybS.8.4aB.SbK.cb4anan.mbeanan",
+"brbrbebrazbr#f.Vbr#f.manb4bebean.V.V.m.maL.1bA.y.Rbnbnbnbnbn#Hb4#Y.w#saYbQbnbK.RbT.GaM#2.4bVbVbK.8#F#u#z.wbybyby#G#G#zbV#u#F#F.obb#uay#0#0.w.w.w#b#b#sbn#D.X.5.b#z#0#za5bAbA.K#s#TaAbObO#T#T#raN",
+"bnbnbnbeanbq#l#Lan.maLbrbebebrbeaVb4b4aVbnbn.wbe#T.4.ybAbK.KbQbQ#D.R#D.1.1#H.1#H#Y#s#zbVbV#z#u.ya5a5ar.l#T.J#vawa7#Hb4be#b.1.0.0#G#ublbv#c#c#2#u#Dbd#D.1.w#Hbean#b.w.wbVbSbVbVbVbVbV#D.1bV.1#ban",
+"#Bbebe#abebeaVbnbn#sbn#D#s#a#b.w.q#b.q#Y#Ybe#HbnaY#baY#baVbnaVaV#bbn.w#bbebeaV#H#D.1bebe.w#G.wa0.z.z#HaV#HaYbnaV.ebLa6a6a6bOa5b2.w#b.w#zbU#s#s#zbA.lbv#T#T.l.y#0#8.1#D.1.wazaza0.w#P.wbebe#H#baz",
+"az.1bcbc.1.1bCa0#H#8b4b4#H#Hbebr#b#bbn.ybXbK#s.c.ia7bebe#zbV.8a5bnaY.caLaLbe#H#H.kbKbKbK#s#b#b#H#bbV#DbV.wbe.w.1bCbCbn#D#2bg#i#i.J.lbA#s#b#bbQbQ#JbVbVbS#G#u.R.R.SaB#2#2aB#Fbd#H.z.1.wa0#b#Ybe#Y",
+"au.S.S#J.k.R.kaY#DbVbV#sbn#s#s#b#Y#Y#Y#Yak.q#Y.N#Y#Y#a.R.y.y.ybV#ebrbq#WaL#B#bbV.i.RbVbn.1#bb4b4#s#D.y#ubV.1#b#H.1.1#bbe#Y#b#s#z#z#z#D#7bs#u.y.lai.5#F#u#0.wbebe.qakbQbQ#baY#b#b.1.1.0#G#D#ubb#F",
+".k#s.k.k.K.KbK.KbA.KbK.K#z#s#z.K.5aBbX.4bY#RaHbY.Z.4.e#s#sbnb4#H.q#Y#sai.dbs#8anbeanan#Ybe#H#H#8#b#H.wbV#G#G.0.1.wbV#u#F#7#D.1b4#bbebebeazb4.1bVbebe.w#z#u#FaBai.4#2.4.ebQbQ.w#Y.w#G#GbVay#u#z.w",
+"bm#G#Gaybl#ublblbAbA.8bSbAa5bS#F#D.1#zbnbVbK.K.K.K.e.4aB.y#Dbnbea7#8brbq#Y.K.ebU#Hbe#Yanazbeazanazaz#n#n.w.1.1.1.w.w.1#Pa0#b.1.0bV#G.1.1az#b.w#s#sbVbV#ubVbV.1#s#z.yaB#2bG.M#xbgbG.8#z#Yb0#b#s#z",
+"bS#GaybS#G.w#b#b#zbV#0bV.w.w#G#G#G#G.1#G#zbV#D#u.y#D#z#s#s.K.8aiar.4.4bV#sbn.cbr#s#u#2.M#x.y#D#b.1#b#b#b#na0a0a0a0.1.0.X#7#u.1a0#z#D#u#F#u#ubVbV#n#n#b#Pby#b#Y#n#bbn#D#DbV.KbV#z.K#1#i.6.6bDbL.Q",
+"#Ebi#p.U.Y#Z#C#3bAbAbKbV#s#G#s#0#D#G.w.w#0bc#Gay.1#D#7#F.ya5#s.WaV.cbebn#sbQ#h.T.K.kbQb0aE#YbV.X.y.y.y.ybV.w#b.1#8.1azazaza0a0.wa0.w#0#GbV#z#z#0#F#F#F#F#F#u#ubVbe#b.1aY.wbV.ybAbRbR.Zaq.Z#E.U.U",
+".n#Z.p.Las.faQ.fafaf.U.UaPbD.Z#t.4bK#za5#z#G#G#G#G#G.w#G#GbV#u.ybUbQ#z#zbV#JbKbYb.#R.Z#tbA.wbe#n.R#D.y.y.8#Dbn#D#Y.w.wbn.w.waza0.1.1#H#b#P.w#GbV.w#0bV#u#u#u#u#ubv.o#F.y#DbK#z.K#z#4.4.S.TbL#t#t",
+"bLaZbD#R#taP.U#Z.hb6as.L#k.pba#ZbD.s.ZbTbG.8bS#Gay.B#G#0#G#D.0#D#s.y.ybVbV.4.ZbL.s.s#R#4#s.w#H.1aY.qbebQ#s#s#sbnar.l.l#u.1#HbC.FbC.1bC.1.1.1.1.1aybVbV.w#s.w#s#0by#za5#u.y.4.l#r.y.8#F.8.K.e.4#T",
+"#4#4.S.4#taZ#T#2aZaTbNaQ#daQ.fasaS#QaT.s.4.8ararbl#ubVbV#ubl#F.XbT.G#t.S#tbkbT.T.uaH#OaB#D.1.zaz.z#f.z.zb4.za0.z#Jbn#JbK.ybAbK#s#z#baz.z.z.zaobc.0.1#G.0#G#u#G#G#ubS#0bVa5bS#uaBaB.y.y#u#F#FbA.K",
+"#zbK.e.S.8.S.S.T.O#Z.LaQaQaQb5af#..Z#t.4#F.yblblbl#ubVbVbK.S#t.saI#tbwbZaI#t#t.S.n#1.TbF#zbQby.wbebranbraz#b.1.wan#nbe.w#z.y#FaB.8.ybn#Haobcbcbc.1.1.1.1#G#G#G#0#G#0#GbV#ubVbVbV.8bAblbAbSbS.K.K",
+"#F.l.8.4bLbRbRbR#Z.L#kafafbN#..Zbg.Jbv.8#u#D.0#7#ubS.y#t.s.Obaas#3baaP.Z.sbD.Z.Z.y#JaY#a#Ybe#b.wb4#b#bbebebebe#bbm.0#u#G.w.w#0bVbGbAbVbV.1.1.w#P.1#Ha0bc.1#Day#D#0.1bS#u#ubV#zbVar.8.l.8a5a5.e#N",
+"#T.4.4bObw#.bNad#k.pba#.bR.4bAa5ara5#zbVbV#u.y.4.K#t.gbi#pb5.p#k.ZaP.Z#t.S.y#Dbna7bCb4.zazb4ao.1#b.1.1bVaybV#G.wa0.w#G#z#0#z.K.y.8bV.w.1.1.1bc.1bcbc#Ha0.1.0#G#G#G#G#G#G#GbVbV#ubla8a8blbSa5.8.4",
+".e.T#1bw#..paQa.#E#v.Z.8.ebSbSay#FblbA.y.S.T.TaIaDbN#paj.U#v.g#ta6#TbAbSbS#G.1bc#GaU#P.w#0#GbSbS#G#Gay.r#D#G.w#P#D.y.8.4.4.e.e.e#u.1#P.1bc.1.1.1.0#Ha0#Hbc.1.1.way#0.w#0bV#GbV.ybl#F#u#zbVbKbA.y",
+".g#.bW.UaOa9#..O.4.8bAbSbS#u.lbv.K.K.S#x#Eb#.v...Yba#..Z#T.4#Fbvbl#ubS#G.0#GbCbc#Pbc#P#P#G.w.w#P#Gbc.w.w.w.w#P.wb0.qbQ.K#r.S.S.S#G.1b4#P#H.1bc.1.1bca0.1#P.w.w.w#G#z#GbVbVbSbSbS#DbV#s.K#4.S.4.4",
+"#EaC#i.gbT.4.4bAbAbAbSbAbA.4.ZaPa3.6#6#E#x.4bLbL.4bAbKbAbSbS#ubS#0#P#P.w.w.1.w.1#H.1a7bCbn#H#H#Hbybyby#z#z.8.4.4aM#xaZ#2.8.y#GbV#Gbc.w.1#G.w.1.wbcbC#G#G.1#G#GaybSbSbS.8bla5bA.8#z#z.KbZbRaT.ZaP",
+".4#r.K#z#z#G#ubb.8.y.y.y#R.O#Z.tbMbM#5.ebA.R#D#Day.rayaybV#G.wby.1#G.w#G.w.wbV#u.TbObO.Z.Za6bD#ia6bTbDbD#iaP.s#t.K#s.wbya0#P.1bm#G#0#0.BbSayb2#0.1#G#u#GbVay.8.8blbSa5bSa5#za5bAar.Z.gbaa9baba.O",
+"b2bS.8#N#T.Ja6bk.M.M.lbS#z#G#z.w#ubV#GbV.1#G#D.ra7bnaV#H#Hbnbn#D.l.4#2.E.6.6bT.T.X.X#u#D.1.1b4be.1#G#G#G.0#Gbcbc.1.1.w.1.w.1#D#G#D.0.0#D#GbVaybS#G.1.1#Dbn#DbnbV.SbA.KbVbK.4aZbD#F#ubVbSaybV.wbn",
+"#D.0#Dbn.1#sbQ#s#za5#z.w#zbS.y#ubV.kbVbVbVbVbVbnaW.l.l.4#Narar.8bCbn#HaVbnaVbebea0.w.w.1.1a7#u#7.1#s#H.1.w#Ha0#b#G.w.w.w.1.w#G#G.0#G.1#0.w#0#0.wbS.ebS.e.l.4.JbG.y#u#D.w.w.w#sbQbV#s#0ay#ubV#D#D",
+".0bn#Gbn#D.R.R.RbV#G#z#0bV#u#u.y.SaBbYaB#t.4bA.ea5#zb2bSbSbVbV.w.0.0a7#Hb4#Hbn#7a5#z#z.w.wa0a0#bbeaz#b#b#bbn#D.y.1#G#G#G#G#u#G#u.1.1#b.1aybl#Fa8bG#T.8.eby.Wb0bP#G#Gbm#Gbm#G#G#G#sbn.w#z#G#G#zbn",
+"#z.w.w#zar.4#T.Jbv#F.ybSbV#ubSbVaY#s#s.Ka5.K#z.Kbl#u#D#G#D.rbd.ra5#0bS.BbVa5#ua8.ybla8#u#0#G#G#G.0#D#G.wbe#B#Ybe#P.w.w.w.1#0#G#G#G.1#P.w.w#0#0.w#baY#s.wbn.0#D#7ay.rbm.r#G#G#G#GbV#0#z#0#G#z.1.w",
+".8ara5.Ka5.ear.e.w.w.wa0#bby.w#b#0#0bV#u#F#FbGbv.8.8ay#z#0#0#0#0#z#0a5aya5ayb2#0bV#GbV#D#u#u#D#Ga0a0bc.1bc#G#D#u#Day#D#GbV#G.w#s.w.w.w.w.w#z.w.waBbs.y#D#DbC.1bCbV#G#0.1#0#G#0#zbKbSbSbS#u#ubVbV",
+"#Hb4bebeazbeaz#Y#ubV#u#z#u.y.8#F.w.w.w.w#0.w#0#z#G#ubl#F#u#u#u#Fbd#u#D.0#7#7#7#D#u#D#GbV#G.w#bbebc.1#G#G.1.w#P.w#b.wby#s.w.w#s.w#z#z.KbA.4#F#T#2ar.e.ebA.ebAbAbSbQ.w#s.w#z#zbK.4.y.8bSbS#0bSbVbn",
+"bn.1a7bnbn#D###u.1#0bn.w#G#z#D#0#0bV.w.w.w#bbe#bb4b4#HbCa7#Dbd.ybs.R#D#u#u#F#7bs#u#u#u.ybA.S.4bLap#b.WbQ#z#s#z#z.8.4.8#2#2bG.MbT.4.SbA.S.4.S.K.Kararar.ea5.ebS.e.8.8.ybS#z#z#s.KbAbla5#0#0.w#s.w",
+"#s#z#s#z#z#z#za5#D#D#GbV.wbV#z#0.Ka5bKbAau.R.S.R.lbAa5.e#r#NaAaAa6.ZaW#N#N.e.e.e.BbSa5.earbOa6#Ebi#EbDbDa6#t.4.4.ebA.SbA.e.K.K#zbL.T.KbL#t#TbL.Kbn.1.1.1.w#Hbeb4bV#z#z#G.w#z#z.K#za5#zby#0bVbV#z",
+"#u#D#DbV#u#ua8#ubXau.y.y.ybs#DbsbK.SbL#RaIaI.C#3bw#t#R#R.S.S.S.y#t.gaPaP.gaT.Z.ObabaaP.Z.Z.Z.4.l#F#2#2#O.S.ebA.8.S#2aB.y#zbKbS.y#u#D.1.w.1bnbVbn#zbK.y.SbK#4.S#tbSbV#u.8.8#u.8#ubV.y.y.y#ubA#ubV",
+".##q#qat.tas.2.2#A#A#AbH.H#C.H#CaMbI#x.GaZ.9bD.G.9bD.GbT#2#2aBaBbK.ybAbKbK.S.S.S#t.Z.Z.4bAbK#zbV#sbV.K.K.K#s.KbV.K.y.SbA.KbK.y.S.4.ybAbK.K.K.K.K.K.K.e.K#4.K#4bLa2#5.D#5a2aIaIa2aIbBbZbwbw.s.OaP",
+"ba.O.Obaba#.#.#..A.A#v.Abkbkbk.A.y.8.SbA.e.S.S.4.K.e.e.e.e#z#z#0bS#ubV#zbV.y.ybS#4.SbY.S.y.yaBaB.4#t#t#t#t.S.S.S.e.4.4.S.K.KbL.S#hbF.TbR.gaPbWaP#Z#ZbaaS.p#kb5b5bNa9#..O.O.Oaq.ObaaP.O.O#Zba.Y.Y",
+"#D#u#u#uaybSbS#u#s#s#z.w#s#s.1bnbQbQbQbQbQ.Q.K.T#t.4.Z#2#T.4.4.4bAbA.SbA.S.S.K.KbQ.K.K.K#5bLbL.SbO#R.T#5b.#5.K.kb.#5bLbZbZbR.Z.gaP#.aPbNbNbN.O.Hbwbwbwbw#3.O.O.O#2.4.8.8.8.8.ybAbA.e#z#s#z#s#z#s",
+"#5.TbLbL.TbLbLbL#m#gae.CaX.Caeae.Z.4#tbLbLbZbR#tbObR#tbR.4.4.4#t.saP.U#E.YaP.U#..UbWbibWbNbNa9#..gbW.Z.sbwaP.G.9aP#E.U#E#EaPaP.U.Y#3bBaIbw.Cb.#w.ybSa5bVbSbV#z.w#z#z#z.K.K.e.ea5bAa5.ea5.ea5a5.e",
+".U.Y.YaTaT.Z.O.gbRbRbwbw#tbB.s.ZbTbT.Z#t.4.4.4a6#t.Z#t#t#t#ta6bDaIbZbB.n#m.n#3#3#X#.aq.HbH#..H#m.TbRaIa2.DaI.T#4bwbRbwbwbZb.bob.#4b.buaK#R.s.9#t#3.O.O.Obw.sbw.sbwbwbwbw#tbwbRbB.Z.gaP.gaP.gaP.g",
+"aB#FbSbVbV#D#ubVaya8bl.8aybS#u#u#zbVbV#zbV#zbK#u#u#u.y.8.ybA.ybA.4bY.4.4#t#tbDaZ#tbR.4#t.4#t#tbL.K#tbwaI#5aIbLbFaIaIbwbD.U#E.Ubi#EbDbD.ZbT#xbT#xabaRaR#oabat.O#Z.s#t.SbLaI#4aKb.b.b..Kbu.7.Qbub.",
+".w#b#b#Y.w#0.1#G#z#G#z#G#b#b#b#s.1#G#G#G.1bc#G#G#G#Day#G#G#G#G#G.w#G#GbV.1#z.w#b.kbnbKbn#s#DbVbV.K#t#iaP.ZbW.g.Z.s.s.gaPaP.Zbw.Za6.Z.Z.8#r#z#ra5#D.r.r.r#Gbcbmbm#G.1.w.wbc.w#G#G#G#G#G#Ga0#P.1.r"
+};
+
+
+
+/* XPM */
+static const char *button_xpm[] = {
+/* width height num_colors chars_per_pixel */
+" 96 96 254 2",
+/* colors */
+".. c #9c3218",
+".# c #a4733e",
+".a c #bc450a",
+".b c #d4700c",
+".c c #dc8c29",
+".d c #bc5e00",
+".e c #d46b37",
+".f c #945431",
+".g c #bc5a2c",
+".h c #8c4e4b",
+".i c #d47e16",
+".j c #bc7422",
+".k c #d47d3a",
+".l c #d45e28",
+".m c #ec9b3e",
+".n c #bc6b43",
+".o c #d45a13",
+".p c #a45236",
+".q c #dc8848",
+".r c #e46b1b",
+".s c #bc652f",
+".t c #a46243",
+".u c #bc6920",
+".v c #a4391e",
+".w c #e47b35",
+".x c #9c6b30",
+".y c #d46d24",
+".z c #ec8a29",
+".A c #bc452a",
+".B c #e46833",
+".C c #bc702e",
+".D c #c47845",
+".E c #b15314",
+".F c #e47e10",
+".G c #bc5a18",
+".H c #bc6145",
+".I c #a44d16",
+".J c #cc5728",
+".K c #d47439",
+".L c #a45b39",
+".M c #cc5815",
+".N c #dc8f4c",
+".O c #b46239",
+".P c #bc5307",
+".Q c #d4794f",
+".R c #d47624",
+".S c #cc6c2c",
+".T c #cc6941",
+".U c #ac5222",
+".V c #e49328",
+".W c #e4754d",
+".X c #d4650b",
+".Y c #ac592c",
+".Z c #c05e2d",
+".0 c #e4751a",
+".1 c #e47d29",
+".2 c #9c6143",
+".3 c #e45f2b",
+".4 c #cc632a",
+".5 c #cc660d",
+".6 c #b44b13",
+".7 c #d48442",
+".8 c #d66228",
+".9 c #bc6221",
+"#. c #b45736",
+"## c #d47714",
+"#a c #dc8936",
+"#b c #e48237",
+"#c c #cc530c",
+"#d c #8c522b",
+"#e c #dc8819",
+"#f c #ec9129",
+"#g c #bc7936",
+"#h c #d46f50",
+"#i c #bc521d",
+"#j c #bc553b",
+"#k c #9c523b",
+"#l c #f49a45",
+"#m c #bc7548",
+"#n c #ec8643",
+"#o c #a86d3a",
+"#p c #a44d21",
+"#q c #a4754b",
+"#r c #d46547",
+"#s c #dc7937",
+"#t c #c4642d",
+"#u c #dc6c21",
+"#v c #bc4d2e",
+"#w c #cc7e53",
+"#x c #c45917",
+"#y c #cc5c42",
+"#z c #dc7036",
+"#A c #ac5448",
+"#B c #ec8f44",
+"#C c #b45c4d",
+"#D c #dc7622",
+"#E c #b45222",
+"#F c #d4651b",
+"#G c #e47328",
+"#H c #e58429",
+"#I c #9c5f23",
+"#J c #d47f2b",
+"#K c #cc7116",
+"#L c #eca24e",
+"#M c #9c471c",
+"#N c #d45b36",
+"#O c #c46716",
+"#P c #ec7836",
+"#Q c #ac642d",
+"#R c #c46f2e",
+"#S c #c47551",
+"#T c #cc5b2b",
+"#U c #cc685f",
+"#V c #bc4b3a",
+"#W c #e49a4b",
+"#X c #b44c35",
+"#Y c #e48745",
+"#Z c #ac613c",
+"#0 c #e47234",
+"#1 c #c46242",
+"#2 c #cc5e1a",
+"#3 c #b4683d",
+"#4 c #cc7430",
+"#5 c #cc7042",
+"#6 c #bf4b0d",
+"#7 c #dc6e13",
+"#8 c #e48c21",
+"#9 c #9c3445",
+"a. c #8c432b",
+"a# c #cc5e04",
+"aa c #a43f33",
+"ab c #b46d44",
+"ac c #9c5e62",
+"ad c #9c4833",
+"ae c #b4742c",
+"af c #a4522b",
+"ag c #dc943c",
+"ah c #b46000",
+"ai c #c46309",
+"aj c #a4441e",
+"ak c #dc7f4c",
+"al c #ac6e27",
+"am c #ac4b4e",
+"an c #ec9238",
+"ao c #e48518",
+"ap c #e47c4f",
+"aq c #bc5c3e",
+"ar c #d56238",
+"as c #9c5840",
+"at c #ab6946",
+"au c #cc761f",
+"av c #9c5024",
+"aw c #bc4922",
+"ax c #bc421d",
+"ay c #e46927",
+"az c #ec8836",
+"aA c #cc513b",
+"aB c #cc661d",
+"aC c #b44a21",
+"aD c #b4544c",
+"aE c #ec8a55",
+"aF c #9c5a20",
+"aG c #94533f",
+"aH c #c4701d",
+"aI c #c46b42",
+"aJ c #dc5a18",
+"aK c #cc7b2f",
+"aL c #e49046",
+"aM c #c4520b",
+"aN c #dc774c",
+"aO c #ac4631",
+"aP c #b45b28",
+"aQ c #944e30",
+"aR c #ac6e4d",
+"aS c #a45f2a",
+"aT c #b4612a",
+"aU c #ec7032",
+"aV c #dc872b",
+"aW c #cc5939",
+"aX c #b47844",
+"aY c #dc843b",
+"aZ c #c4601d",
+"a0 c #ec7f36",
+"a1 c #c47531",
+"a2 c #c47344",
+"a3 c #ac431d",
+"a4 c #ac7439",
+"a5 c #dc6735",
+"a6 c #c4582a",
+"a7 c #dc7c1b",
+"a8 c #dc5d26",
+"a9 c #ac5036",
+"b. c #cc7742",
+"b# c #ac4b13",
+"ba c #ac5a37",
+"bb c #dc5f0c",
+"bc c #ec7a29",
+"bd c #dc7813",
+"be c #e48b37",
+"bf c #f48e28",
+"bg c #c44e1f",
+"bh c #c44e3f",
+"bi c #ac4b1e",
+"bj c #dc6544",
+"bk c #c44c2b",
+"bl c #dc611a",
+"bm c #ec7125",
+"bn c #dc7d29",
+"bo c #cc7752",
+"bp c #c4473c",
+"bq c #ec994b",
+"br c #e49336",
+"bs c #d46f16",
+"bt c #bc600a",
+"bu c #d47a46",
+"bv c #d45b1e",
+"bw c #bc653a",
+"bx c #ac3c1d",
+"by c #e47943",
+"bz c #a46b2e",
+"bA c #d46b2e",
+"bB c #bc6c3a",
+"bC c #e47f1b",
+"bD c #bc5b22",
+"bE c #bc6052",
+"bF c #d47346",
+"bG c #cc561f",
+"bH c #b46044",
+"bI c #bc5312",
+"bJ c #d4775e",
+"bK c #d4732e",
+"bL c #cc6b37",
+"bM c #cc644f",
+"bN c #ac512d",
+"bO c #cc6137",
+"bP c #ec8552",
+"bQ c #dc7944",
+"bR c #c46339",
+"bS c #dc6a2c",
+"bT c #c45a21",
+"bU c #dc6f44",
+"bV c #dc732c",
+"bW c #b4502c",
+"bX c #cc6d1f",
+"bY c #c46521",
+"bZ c #c46939",
+"b0 c #e48653",
+"b1 c #ac6445",
+"b2 c #e46e43",
+"b3 c #c45851",
+"b4 c #e48b2b",
+"b5 c #9c5430",
+"b6 c #944d49",
+"b7 c #c46a51",
+/* pixels */
+".waB.U#5#Dba.##u#sbn#H.8#z.0#Db2.4#E.g.e#T#F#z#4bL.n#EbSbm.kauaz#Bbnbr#B.y#b#bb4.w.z#D.z#haKaZbr#Ha6bLaubn.w#Yb4.z#0#ba7an#s#Yb4b4.8.wbnaVaOb3aBbS.l.K.4bL.S#i#5#0#u.w.w#u.w.1#D#zaP#AbK.y#.#a#u",
+"#b#F.Y.T#u.O#q#D#z.1b4ar.wbn.0bS#raC#..T.4.lbK#4aZ#Zbi#G#G#s.S.1bebnbr#BbA#b.1.1.w.z#Gan#5aK#tbr.1a6#1aua7bS.w#HbCa5#0#DazbK.w#8#H.8#0aVbXbibRbsbA.l.K.e.e.4#x.T#0.8.wbVbVbn#sbVbSaT#AbVbS.gag#G",
+"#bbS.YbL#u.O#q#D#sa7bea5.w#G#D.8.K#ibW#1.4.8.e.SbD.p#pay#G.k.Sbcbebnbe#BbA#b.1bn.1bc#Gbe#1aHaZb4#D.Zb.aLan#0#Dbda7bS.ybCbe.y.w#8be#ubSaY.G#X#1.ybA.8#z.K.ebL.ZbL#0#u.w#GbV.w.1bnbA.u#C#z.y#.aL#G",
+"#YbVaTbL#ubaatbV#zbnbe.K#zbnbn#N#z.g.UbwbO.4.S.4#R.L.UbSay.k#Jbc#abebrazbK#bbnbC#GbC#ub4#X.u.Z#HaY.eaI#Wbr.w.1#H#HbV.8b4anbS#s#H#b#GbVbe.6bw.4.ya5.y.ebS.e.e#t#t#G#u#zbVbV.w#s.w.e.u#CbKbS#.br#P",
+".wbVaT.Tayba.t#u#zbnaza5ar#D.1#T#zbTaO#.bwbL.8#t#tas.Y#Gbl.K.k.1beanazbrbK.w.1.1.1bc#0be#j.C.4b4.ybO.g#Wana0aya7az.w#2az#B#z.w#HaY.wbVaNa3.s.4bA.e.8#F.8#z.ebLbD#0#u.w#GbV#b.1#s#z.s#AbAbV#jag#G",
+"#0#D.ZbLbS#.as#u#z#Dbe.e.4.R#s.J#G.4a9.p#.bR.SaZaP.f#Z.w#u.K.R.1bebqbrbe#D#bbeb4#PbC#z#aaO.CbL.1bV.T.Ibr#8a0.w#Han#Y#2anan#z#0bC#s#H#DaraC.s.4.lbAbA.lblbS.e.K#i#ubV.w#s#GbQbV.wa5.CaD.ybV#.#a#G",
+".1#u.ObLbS#..2a8#z##azar#T.RbQa6#u.4#.aQbNbR.S#T.UaQ#C#bblbK.kbCaV#l#fbebV#bbr.z#G.0bSaYaa.sbO#D.S.Q.U#Laz#n.w.1b4#B#2anbebS#zbC.KaV#Dbpb3bYbX.l.8bAbvblbS.e.k.g#u#G.w#GbVbVbS#s.e.C#CbKbV#X#a#G",
+"#GbV.gbL#u#..2#ua5#u#Y.e.J.R#sbkbbbA.Oa.adbR.T#2#Z.f#3#bbl.KaYa0bn#L.Vbe.wbeanaz#P.0bS#aaabw.e.0aBaNaP#W#8a0#G.0#8aE#2an#HbS#0.1.S.1.1.A#U.S.Rar.4a5#FbSblbAbQ.ZblbV.w#0#DbV.ybV.8.CbE#zbVbW#a.1",
+"#zaybR#m#s.A#AbX#D.1#u.wbvbV#z.M.8bA.4#E#k#Z.OaZ.hafbA#zbAbA#D#Hbnanbr#8aVb4#W#f.wbebVak#M.ObL.R.Ya2.Gbe.1aza7a7#Y.1#F#B.y.k#Db4.y#saY.P.ybX.K.4.8bS#zbS#u.8bA.SbDby#G.1#s.4.KbAbV.SatbVbl#Z#D#G",
+"#Ga8bR#g#s.A#Aau#D#0bV.w#F#Ga5.M.ybA.8#v.p.L#ZaTb6afbAbVbA.KbV#8#s.m#fbr#H#H.m#f.1#bbV.k#p.ObR.y.Oa2aZ#n#baz#H#H.w#0#uaL#O.k#D#b#F.w#b#2#zbK.KaB.ybS#GbS#DbSbVbAbT.wbV#G#s.4#zbS.KbAat#z#u#obV#G",
+"#zblbwae#z#v#A.y#Gbn#u.w.y#z#z.l.ybSbA.Zba#k.LbNas.UbK#0.8bKbVb4bnaL.mbrbe.canbr#H#bbA#4af.O.S.y.OaI#tbea0#b#H#b.y.w#G#b#x.KbV.w.y#s.w#F#s#zbVaBbS#ubS#GbSbSbK#z.4bQ.r.1bn.y#sbSbV.SaR#0#u.Obn.1",
+"#G.8bw.C.w.AbH.ybV.w#za0bS#0.wbS.ybAbS.8#.afaQaQ.L.UbVbVbS.K#sb4#Dbranbrbebe.m#f.1a0bAbL.Y.O.T#F#.aT.4.w#b#H.w.w.8bS.w#Y#x.SbV.1bS#0#z.y#0#z.y.8#zbS#ubV#GbS#ubA#4.w.0.1#bbKbVbV.y.4b1bS#u.O#G.1",
+"#bay#taX#sbk.H.y.w#G#u#bbVbV#z#z#RbAbS.ebRafaQ#d#kaP#s.wbA#zbn#H#sbeb4bebebeanb4.1#HbV#tba.YbL.y#X.U.S.wbc.1#GbV#zay#0by.y.SbV#PbS#zbS#u#z.wbl.y#GbS#u#G#GbV.ybK#z#b.0.1.wbnbV#DbA.Sb1#0bS#3#0.1",
+"#bbSbB.C#sbk#CbsbV#z.yby#u#ubS#G.O.4#ubS.4bNaQaQ.pbD#G.wa5#s#s#H#abebe.zaY#bbr#8#D.1#z.Gba.U.TaB.Ob#bK.wbe#G#G#s.w#u#G#bbKbAbV#G.RbV#F#s.w.w#F#F.w#0#G#0#0aybSbSbQ.w#G#G.wbVbA#GbKbAab#0ay.n.1.w",
+"#b#u.sae.1bk.H#D#z#D.8.wbS#u.y#z#Z.Z.lbSbA#.b5.fba.Z#s#GbS#z#sbe#bbrbebrbnbnan.V#D.1#z.G.nba#4bvbB.6#s.1az.0#G.w#Gay#P#GbKbK#b#G#z.waB.w.w.w#F#u#0.w.w#G#G#0bVbS.ebV#G#G.1#z.8bS#z.8b1#0bS.n#0#G",
+"#s#u.Zaebn.A#Cbs#0#0#F#bbV.y#u.w.taPbvaya5.Zafas#Z#t#0#G#F.K#bbr.wbeanbrbnbK.man.1.w#s#i#S.ObuaBaI.EbQa7a0.0#G#0#D#Gaz#u.Rbnan.0bebQaB#s#sa0#F.wbS#G#G#G#G#G#zbA.ebl#G.0bV#z#F#0bK.8.tayay.H#D.r",
+".1#zbT.ZbQ.yaMbK.K#0.w#0aY.SbV#ubMa3.K#Farbg#.aSbD.4#D#G#D.5#Y#b.qaV.V.m#z.e.m#fby#D#J#1.H.uaK.ZbRbIbe.1a0.w#D#D#Gbdb4b0.J.wa7ak#H#n#xb4#H#z#zbnay#G#u#G.1.1#G#u#s#Tbd#0b2#GbA.1.8#r#Ia5#sala5#D",
+"#GbVbT.4bQ.8bI.Sa5bV.w#0#saB.kbVbM.6.Kbla5.J.Z#Q.sbK#G#G.1aB#Y#b#bb4.Vbr#F#z#B#8#0bdbK#j#.aP.S.g.TaZ#B#H.w#P.w#D#0.Fb4aNbv.1#DbV#Ha0.Mb4#H#za5#D#0#G#G.0.1.1.w#D#s#Ta7#0b2#D.8#H.y#r.fbA#zal#z.1",
+"#GbV.Z#tbQ.S#xbLbK.w.wbV#sbYbV#G#5#6.SbA#zbv#taT.Z#z.w.1#zbX#Ybn.qb4.mb4aB#zbe#8#0bd.R#j#.bt#R.g#1aZbe.1#G.wbV#D#PbCbe.ear#D.1bX.1by.l.1.1a5a5#Dbm#G#G.1.1a0.w#G#s.la7.wa5#Dar#HbVbF#I.4a5ala5.1",
+"#G#z#tbLbQbA.G#RbA.w.w#u.KaBbVbV.e#E#x.ybV.8.4.sbTa5.w#Gbn.4#Y.y#YaV.m#H#F#sbean#Gbn#s.gaDaT#R.g#t.4#b.0#G#G#G#D#0bCb4#x.e#G.1aB#G#0.8.1.1bS.B#G#G#G#G.1.1.1#G#u#z.e#H.w#z#D.8#H#z#haS.4#zal.4.1",
+".1bV.4bLbQ.eaZaIau.w#0#Fa5#tbV.1bA#x#E.SbV#u#F.4bG#z#0#zbVbYakbX#YbnaL#b.ybV.1an#P#H#saqaq.u#4#j#1.S.1#u.1#0.1#G#0#Hbn#ibjbV#b#2bca5a5.1.0.l#z.0#G.1.1bcbc#b#D#u.war#8by#z#u.e#b.y.Tbz.4#za4.J#D",
+"bc#z.4bZ.Q.S.9aI.R#b.w#F.K.4bV#G.R.4b#.T#u#D.y.8.8#GbcbVbK#R.qbKbebn.1#s#Dbs#Dbe.w#8aY#jaq.s.SaO.Z.S#D#7bm#G.w#u#0.zbn#xa5#G.1#2#bbSby.1#G.l#0.0.0bca0az#Ha0#G#u#0.B#8.w.K#D#r.1#FbO.x#T#zaX.J#D",
+"#GbK.4bR.K.SbD.C.Sbe#0bG#zbAbV#D#DbL.v.T.y.0blarbS#G#G#D.KaH#Y#s#H.wbAbV#D#D#D#G.w.zaV#.aq.sbwax.gbA#D#7#G#u#G#u#uan##aW#NbV#D.4#bbvap#H#H.8#sa7.1.1bc#Ha0#H#0#D#0a5#8bQ#z.y.ebn.y.T.##x.KaXbkbV",
+"#G#ua6#t.T.4.G#3.R#b#zbv.K.ebn.r#DbL..aI.4#7blar#G#Gay#u.KbY.N.cbnbe.ybVbn#G#b#u#b.zaYbW.H#R#tbx.Z.k.w.r#0ay.1#GaJaz.5bO#T.w#DbAbnbg#b#Hb4bVby.F.0bC.1.1.1#b#GbVaU.8#HbnbA.R#N.1#s#h.#bgbAa4#vbV",
+"#G#u#tbO#t.K.9bw.lb4#G.8bla5aWa7ay.4.YaD.K#ublblay#G.1.y.K.Z#Y.iaY#T.R#Nbe#zbC.1#H#Bb..ZaPb.#3aFaPak#G.0.1#D#D#G#D#b#xbAbv#G#ubA.w.Mbn#nbVbS.1bdbcbm#P#G#Gbc.1#G#D.w#u.w.w#2bK#4bK.K#vbw.Q#tbt.K",
+"#D#u.ZbR.4.ebD#tbAb4#u.8#u#z.lbn.rbAbabN#tbS#u#u.B#G#D#D.e.4#Ya7#b.4bnaW#H#zbC#GbcaL#4aTbW#4aTaS.UbQ#D#u#z#D#D#G#u#baBa5bS#G#u.K#b#F.1bebVbV#GbC#H.1#P.1.1#H#GbVbS#G#u.w#saBbA.SbAbF.gaqb..u.G.K",
+"ay.y#t#t.Z.e.G#Ra5#Hblay#Db2.laVaybK#.#p.g.ybVbV#G.w#7#z.4.e#abeaY.ybn#T.1#zbC#D#G#b.S#t#x#5.Z.Y.U.kbSbl#GbA#u#G#u#b.4.e#z#G#FbAby.ybeaz#ubS.1bc.z.1#P.w.1bc#DaybV#G#F#G.w#2.S#t.R.e.g.OaI.9#x.K",
+"#G.8#tbR#2.ebT#R.ebC#F#z#GbS.4#HaybA.Zajbi#tbVbV#0#G#F#saB#s.Rbe#bbAbn#Tbna5#GbCay.wbLbR.ZbL.Z.O#E.Kbl#ubVbKbSbVbl.w.4.8#0#ua#bVbQ#ube#b#u#G.1.1bf.0.w#Pa0#H.1#GbV#G#u.w#s.M.S#tbn.e#1.gbZ#R.9.K",
+"#G.y#t.4#T.e#2.S#ra7#u#0#DbS#N#HbVbS#T.U#p.sbK#u#G#G.y#s.y#s.y#zaVbKbn.J.1a5bC.1#G#s.4bO.4bLbD.sbWbF.8ay#z#zbA#u#D#z.4.4#0#u.o#s.4bSbe#H#u#G.1.1.z#D#G.w#ba0.1#0#D.w#D.wbV#x.S.S#s.SbR.ObZ#5bYbO",
+"#GbA#t.4.4#z#2.S#N#D#u#0.rbVarbn#GbS.4#vb5.O.Sbl#DbVa5.K#Dbn.ybVbn.Kbn.J#D#z#G.1.rbV.ZbR.Z#T#i.s.g.ebl#G#0.K#u.8#0bA.e#2.1#u.y#b#xbAbebn#D#Gbm.0beblbV.w.1bc.1#G#D.1#Ga0#s.M.S.Tbn.S.T#jbBbu.4.Z",
+"#G.ya6.4.4#zaB.SaAbd#u#0bdbVarbn.w#u#F.g.pba#t#F.0#u#s.8bnb4.y.8aVbQ#Hbkbna5.1.w.1#z#tbL.4.Z.E#t.gbA#uay#sbS.K.y.w#2#z.4#0bl#D#Ybg#zbebC.0.w#G.1.1bvar#z#u.1.1#G#D.1bV#b#z#2bLbL#b.S#5#..g.k#t.Z",
+"#GbAbD#t.4#0aB.yaA.y#F#0.r.w.8#DbybSbv#t#kas.s.X#D.y.Waibe#HbVa5aVbQb4bkbna5#G.1.w#s#tb.bR.4#ia2.g.y#F#u#GbKbV#ub2#c.K.4bV#7#DaYa6.kaza7#D#P.1bc#z#Tar.8#F.0.1.r#G.1#u#P#s#2bL.S#b.S#haP.U#5bY#T",
+".w.4aI.sbAbSbK#ta6bsbd#za5.0bC.l.1#0bla6.Z#3aIbT#sbUaVara7.q#ebn#b#D#YaA#8#s#u.wbv.K.L#u#R.4#Z#F#T.e.8#z.e.l#sbs.w.P.e.w#G.r.r.1#T.wa7.z.1bea0.F.K#D.RbK.e#zbV#D.w.1#G#u.w#zaB.K#Y#ubOaC.gbobwaP",
+"#GbYbZaPbA#u.y.g.Z.R#u#0#0.0bn.4#G#P#u#TaPba#t.G.ybQ.c.4#8#YbraYbn.R.wbp#ebn.8.1#F.K.L.rbL#t#Zbl#T.eaB#z#z.4#G#7.1#6.S.w#u#G.rbV.l.w.0be.1.wa0#8bV.R#J.K.4.8bV#G#G#G#G#G#b#saB.K.w.ybOaCaPb7.s.G",
+"#G.4bB.U.SbVbAaPaW#D#Da5bSa7#H#2.w#PbSbA.ZaPbw#t.y#zbe.4br#sbq.c.w#D#s#Vao#z#u#G.l.KaS.rb..4afa5.4bS#Fa5#zbv#u#G#0#6bAbQ#u#G.w.8#z.wbd.z.1#b#H#HbS.y#HbQ#T#T#zbn#G#G.w#G.w.waB.K#s.8.T#v#.aIaPaT",
+"bV.4.n#EbA#zbKaP#N#u.0ay.B#HaV.E#G.w#GbS#t.ZbZ.SbV#zbnbVbqai#WaL#b.1aYbp#e#zbS#G#F#z.L.rb..4afbS.lbS#F#u#z.8#u.1#0.M.8#z.o#0#baZa5.w#u.1#D#b#H.1bAbVaYbQ.8.J.y.w.w.w.1#0.w#s#2.SbVbA.K.gaPaIaP.Z",
+".1#t#m.Y.SbVbK.g#N#u#7a5bVb4bn.6.w.w.0bS.S.saI#tbVbV#s#s#Y.daLaLbe.1bQbh#8#zbV#G.l.Kba.r.k#tbNay.l#u#F#ua5#F#u.1.w#2bAbS#F#z#Y.GbVa0#u#D#7az#b.y.ybe.1bVby.laB#b#P.1.w#G#GbVaB.S.y.e.K.g#..n.U.O",
+"#z#t.naP.S.y.SaT.e#F#7aya5#HaV.6.w.1#G#G.ybD#tbk.4#JbQbn.Kbs#Bbebe#Hbnbp#8.ybSbSaJ.K.O.r#4.4#Z#u.8.8#ubS.8.lbVbn#z.e.ebSbbay#bbY#Ga0bS#D#Dbr#bbG#D#n.1#u#b.eaM#b.w#G#G#GbV#s.SbK.4.4#5aPaPbwb#.O",
+".wbD#3.U.K.y.S.Z.e#7#7b2#ubnbebTbV.wbC.1#D.Z#tbT.ZbK#h.c.e#8#b#HaV.1bKbp#8.8#z#ubv#z.nbm#R.y.na8bS#FbV#zbG.ebn#D.4.KbKbV#7ay#baB#G.wbS.w#Hb4#s.4#Daz.1#D#nbV.M#H.w#G.w#G.w.wbK.e.lbA.KaPaPbwaf.O",
+"#baZ#3#..KbS.S.O.ebs#D#0a8#7be.T#u.1bcbcbn.Z.S.TbLbY.TbrbUanbV#H#H#H.Rbp#8bA#zbSbl.K#mbm.4.ea2bl.ebG.wa5bg.S#s.y.G.k.KbVbm.0.w.Sbc.w.B#Bb4#H.y.e.1an#H.1a0bV.5aY.w.wa0.w.w#sbA.SbA.ebu.Z.O#m.Y.H",
+".k#t#X.UbQ#4#tba.B#u#ubV.ya5a0.X.T#H#P#Ga7.y.n.u.sb..K#s#Hbe.i.k#D#YbT.e#0bl.waibA#RbQ#z#RbK.3.y#F#r.y#DaA#u.z#x#v#K#z.w#F#Y.g.R.w#HbCazbCbea#bnbean#H#0a0#G.y.1#G#PbV#b.X.1bV#t.y.KbL#R.9#5.s.9",
+"bnbR#.bW.K.S.ZbabS#u#D#Gbl#z.w.XbO.1bcaUbC#J#1aH.s#R.k#ubean.RbK.1#s.G#z#0#F#saB.8.C#za5aHbAay.y.8#rbS#ubvbAb4bXbhaBbV#z#7.wbkaV#b.w#D.zbcbe.X#sbean#b#G#b#G.ybVbm.w#Daz#D.wbV.4.y#z.4#RaPaI.saP",
+"bK.4aqbi.KbY.ZaPa5#u#GbVa8#z.w#ubOa7#P#Pb4aY.T#O#R.ZbQ#2#YanbVbKbe#zaMbQ#0.o#D.S.l.j.Kbv.ubV.B.R#F#rbS#u#TbAb4bAbR.X.y#z#ua5bg#a#b#H.0#H.1be.y#sbebe.1#G.w#G.ybVbm#G#D#Ya0.wbV#t.ybQ.4#t.ga2.Z.Z",
+"bn#t.HbW.K.S.4.Z.e.ybV#D#u.w.1#D.ZbC#P.w.z#abFaB#4#tb0.Man#YbnbKbebV#2.w.w.o#ubX.8#R#z.l.u.K.BbK.l.e#u.8.l.R#sbAbObs#ubS#DbS#Tbe.wbV#D.w.w.1.y#b#Haz.1#G.w.w#u.ybm.1bVaza0#b#s#tbA#s#t#t.s#5.saP",
+"#s.4bHbN#5.ybA.ZarbA#G#u#0.w.1.1.Zbn#G#0az#Y#z#D#sbAaE#xazbe.1#s.wbV.4.w#G#ubVaBa5aubQa5.ubAay#J.8#F.8.8#FbKbObY#rbnbV.J#D#zarbnbV#D#G#P#b#ubVaYbe#bbc#G.w.wbV#uay.w.w.1#G.w.wbD#T.K.4#t.O#5aPaP",
+"#D#t#.bNbL.ybK.ZbO.S.w#u#Ga0a7.1a6#H.w#Gb4bebQ.1.w.w#Y.ybe#H#b#b#G#zbV#s#G#G.1#2#zau#0a5.jbA.B.Kar.y.8.8#D.K.gbtar.1bVbGbnbS#z.1#D#u.w.w#b#Fbn#saz#b.1#G.w.w.w.y#u#P#b.0.1.1#YaP.M.K.Z.Z.ZaI#EaP",
+"bV#t.Ha9bLaB#z.4a6.4#b#D#Ga0#ub4bD#H.wbSao#bby.z#HbebV#Daz#Hb4#b.w#ubV.1.r#G.w.4#zbY.ea5a1bA.8bKarbsa5.8a7.K#V.Z#N.1bVbG#b.8a5#8.1#G.w.w#n.5.waYazbc#P.1#P.w#P#F#G.waz#Dbc#Gbeb#bGbU#t.saPb7.gbZ",
+"bVbL#m#..SaBbV.l#EbLbe#G#G#b#7be#i#H#PbS.1.w.waz.1#n.X#ban#8b4#Ha0.ybK.way.r.wbKbSbt#2a5aK.Ka8bKarbd#z#ra7#s#X#R.l#7bV.lbe.Ma5azbe.1.1.w#n.X#baVaz#H.1#P#0#P.w#F.w#0.w.0az#GbQb#.4bQbL.Z.Z#5bwbo",
+".K.K.T.gbO.4#s#Fbiapbca0.0be.1.1a6by#G#G#bb4be.zaY.R.y.1az#b#s#b.za5.8#H#2.1#Dbv.K.6bQ.K#F.Kbn.SblbV.k.4bQ.4.MbX#4#Har#D#s.4###bby.1anbebe#Fbe#baz.w.w.1bV.w.wbvaz#D#G#G#G#s.K.UbO.y.e#O#C.D.U.i",
+"#t#tbRbW#R#tbV#2#E#b.1a0#Daz#s#GbTbybc#G.1#bbr#f.q#D.y#baz#H#DbV.za5#F#b.Jbna7ar#4#6.K.4.SbV.y#FbS#z.KbYbybAaBbKbLbn.8#G#s.Z##.w.w.1azbe.1.ybe.waza0#b.1bV#b.w.o#b#D#G#G#G#zbA#EbO.R#r#OaDbB.U.k",
+"#ibwaI.Z.T#t.K#2bD.W#Gbc#G#b#H#GbDby.way.1#ban.zbe.y.y#b#n.w.y#D#Har#u.1#2bnbd.ebOa6.K#x.4bA.4.ya5bV.KaZbQa5.y#s.Sa7arbV#s#x.5.wbV#bb4an#u#saY#sbe.1#bbe.1#n#b.M.wbV#G#GbSbV.e.9.4.y.K.5#AbB.U#J",
+"aPaIa2.s#5#t.K#ObDbQ#G.1.w#b.1#GbD#z.w.rbVbebr.zbQ.y.y#b#nbV#ubVaV.l#z#G#2#D#DbF.4bL.Kbg.Ka5.4.8#0.ybK.G#z#zaB.k.4#Da8.1bnbk.b#bbV.wbebr.y#Y#s#JbV#sazaz.1#b.1#2.w.w#G#G#GbV.K.S.S.y.KaHam#3aO.k",
+".Z#5.Dbwb.#t.K.Sa6#z.1bcbe#b.w.0#i#z.w#Daybeazb4#s.8bV#n.w#GbV.w#H#T.w#D.l#Dbs.T#T#z#z#x#z#z.4.8bSaB.K.G.e#zaB.R.4#Dar.w.wa6.R#b#z.1bebeaB.NbA.S.SbVbebe#G.1.1#2#G.w#0bVbVbVbV.ebLaB.e#KambwbW#J",
+"bWaIaIaP#5.S#s.e#t#s.w#G#Bbn#H#GaP.8.w#GbVbe#b.z#s#D.wa0.1#G.1beaY.Jby#7a5bV.5#1aBak#sbgbQ#z.8bA.BaBbQaZ#z#z#2.S.4#Da8.1#z#Ta7a0#s.1bebnbXaNbRaZ.4.S.w.1#G.1.w#2a5#0.Bbl#ubS.ybVbO#O.ebYambwbWbK",
+".gbL.T.G.K.S.KbA.4#z#P#D#Y#Da0bc.s.4#P.w#Gbe.1a0#sbn#ba0.1.0#b.wbn#vby#7#z#z.5#jaB#b#z.M#z#z.8#FbS#2aYaZ.e#zaZ.R.4#Da5#GbVbO.1by.w#Dbr.R.S.QbZbD#1.S#z#G#u.w.waBbl#0bS.8bVbVblbSaq#x.T.Sam.CbWbn",
+".ZbF#4.9.k.SbV.8.4#z.w#ube.y#bbc#t.4.w#P.w#b.w.zbn#D.1a0.1.1#H.1aVawby#F.w.w#O.g#Fak#DaMbV.ybA.l#u#2akaZbA#z#2bAbL.0ar#GbVbObn.w#Y#D#BbX.k.Qa2.sbM#tbA#u#G#nbybG#u#0a5bl#0bV.y#G#.bT#r#4#X.OaPbn",
+".saIbwaPb..e.K.S.e.8#b#D#P.1#G.1.KaMb0#Da0bman#Jar#Y#8a0.w.w.1bC.ea7#GbS#b#T.Qahb4#D.y#2bS#zbl.ybV#Mbu#tbl#w.yblay#0.R#Hbk#D#H.1#bbV.V.4b4.TaubRbZ#t#t#z.1.1#b.9ar.w#ubv#zbdbs.K.O#t.KbD#3#ob##b",
+".saIbR#E#5.4.y#2bA.4.way.w#G.w.1#s#x.q.y.w.0#nbn.l.w.1.1.wbV.1bCbL#H#G.8.1#x.Q#O#b#D#F.8bS#z.y.y#uav.K.Sbl#m.y#F#D#zbV#8bp.RaV#Hbeak.cbQ.c.T.S#tbR.s#tbK#G.1.w#OaW#b#ua8#0#ubs.K.Y.4#z.G#Zabb##s",
+".gbwbw.UbL.4.SaB.S.8by#D.w#G.w.w.waZbQ.8#G#ube#J.l.waz.0.1#u#bbna6b4#z.l#u.M.K##az#D#FbVbSbS.y.8#uaS.SbLay#3.R.o#ubV#z#8bpbn#HazaYaL#Db0b4bu.R.S.Z.Z.Z.K#G.1#baB#i#b#D.8#0bdbs#rafbL.K#x.Oab.EbV",
+"aPbDbw#EbZ.SbA.ybA#2#s#G.w#G.w.1by#2.K.4#z#G.wbK#ubnaz.X#P#Fbe#Da6bebV.l#GbG#Nbn#b.y#F#s.y.8bK.8bl#Z.4bF.0ba.K.oaybVbV#8bp#s#Hbe#JaL#OaLaY.w#s#z.Z.s.Z.4#u#G.w.y#iaV.1.Ba5.r#D.l#pbL#zaZaP.n#tbV",
+"aP.UbZ#EbZ.K.K#z.e#2.wbV.1#G.1.wa0.8#r.4#0.w#z.y.1.waz#7a0#7#Y#2a6#b#u.8bnbl.Jbn#P#u#F.wbSaBbS.4#u.O.4b.ay.pbQ#F.1#ubAaobh#bbnbe#saLai#BbA#s#z#u.Zbw.ZbObS#G#b#D#iaV.1#z#0#D#u#y#pbL#saZaPaI.K#G",
+".Z#Eb.aPbR.KbKbK.KbG.w#G#0#u.w.1#P.y.S.e#z.w.ybA#H.wa0#u#b#D#bbgbO.1#Fa5bna5bg#D#z#u#F#s#D#2.e.4bl.O.4#5.r.p.Kbv#H#F.ya7bhbe#D.1#Ybq.SaY#Tbn.ybs#taI.g.Z.8#D.w.1a6bnbn.B#0#D#D#T.I.4bV#2aP.C.K#G",
+"bw.UboaP.ZbL.ybS.K.M#s.w#G#G#G#D.1#G.S.e.K#0#FbKbCaza0.1.1.1#s#ia5.0#F#s#Da5aw#bbl#0.obVbV.M.e.4bl.O.SbOaJ.LbQ.ya0#F#D#8bhbe#D#sbe#B#sa7.4.1.e#F#taI#.#j.l#u.1.1.4.1.0a5b2#D#u.Z.UbLbS.SaP#t#z.r",
+".Zbib..U.g.S.S.y#zbT.w#s#G#u#G#GbmbV.S.e.ybVaB#s.Fa0.wa0.0b4#z#ib2.0.oby#D.eaxaY.o#0aB#ubV#2.8.4blaP.e.Z.o.Lbubl.wbl#s#8bhbe.y#b.1.V.W.b#rbe#z.RbYaI#.#v#Tbl.1.1.e#G#7#0#0#D.R.Z.U.S#zbV.s#R#s.r",
+"a6#E#4.YaP#h.4#ubL.4#z.w#G.1.0#D#G#G#G#u.8bG.8#zbC.1a0#zbV#b#z.J.w#GbbbVbAaB#O.1#F.w.8bSay.o#FaP#5a6.4#tbR.Z#zbV.1bdbS#DaAbVbQ#e#BaBaEbA.4#sbs#Dbl#tb1#A.Zbl#u.wbV.y#zay.0.1.y#2aT.4bVbVaZ.9#say",
+".ZbDb.#3#.bF.y#D.T.S#z.w.1.1#G.0#0bc.1.1bVbA.y#b.1.1.w#D#Gbe#z.l#b#u#u#GbA.S.y#D#D#s.y#zay#F.KbtbZ#i.8.Z.saZbA#u.wbCa5#DaA.RbQbn#B.X#Y.4.KbV#u#D.o#tba#k.g#2#u#sbn.y#0#G.rbC#DaB.Z.S#u#sbY#t#s.r",
+".ZbDbubBaP.TbA.1.KbA.K.w#P#b.1.0#0.wb4#P.wbVbnazbC#H#0#u.1be#DbA.wblay#0.4.S#z#D#0bV.8.1ay#u#saP.g#i.4.Z#tbDbK#7.1bCa5bnaW.R#zbn#BaB#Y#x.KbVbn.0#u.4#.a9#i.4#u.1bQ#FbS#G.0.1#D.S.O.4#u.w#tbYbQ.0",
+".8.ZaKaIbNbRbK.wbL.SbA.w.w.1#0#D.B.1#P.1.1bV#H.z.1#b#G#F.1be#7#s#zbv#0.w.4bT#sbS#G#u.y#zblbl#saPaP.Z.e#tbR#t#s#G.w.1bV.1aW.y.Kbnbr.y#YaM#s.y.1#GbSbA.Z.YbW.4bV.w#b#FbS#z.0.1bV.y.O#TbVbV#t#t#s#G",
+"#rbT#RbwbN.g.K.1#t.4.4.w.way.w#GbS#G#Hbc.1.1ao.z.1#PbV#uazazbs#bbU#c#0#0.8.6#z#u#G#F#u#Gbb#F.k#E#.bRbF.Z#t#R#b.1#GbC#zbn#N.R.eaV#sbKaYaZ#s.y.1#G#G.l.ZbW.U.gbA#G.w#2bS#G#u.1bVbSaq.Zbl#z#tbY#s.0",
+"#z#x.s.CbNaP.Kbn#T.S#F#z#0bl#0bVay.w.1.1.1.1bc.z.1.w#z#u#bb4#u#b#s#c.w#zbA.a#z#D#G#FbV#Gbl#u.K.YbaaI.K#i.s.Sbe.z#s#GbSbC#r#D.KaV.RbQ.k.y#s.y.1#Gaybl.l.ZbN.ZbK#G.w.oa5#z#u.1#s#u.Oa6#FbSbY.Zbn#G",
+"#rbT.9b..ObW.KbVbL.K#T.w#0#F#0ayb2.1bc.1bc.wbcao.1#G#zbV.w.1.ybQ#s#2.w#F#z#2#b#7aUbl#0.1#u#GbLaPbN.Hb.aC.saK#Y.z#0.1bV.1#r#D.eaYbAaLaBbK#Dbn#G#G#0#ubSbLa9#Z#z#G#Gbv#z#z#F#D#0.8.H.Z.8bA#tbY#s.1",
+"a5#x#t#w.HaP.Kbn.K.K#2.w.wa8.wbS#0.w.1.1.1#Pbcbc.1bV#0bV#sbV.lbQ#z#u.wa##zbK#B#7#0#u#D#G#G.wbObN.p.n#h.E#taKbe.z.w.1bSbCbFbV.ebn.KaL#x.k.y#b#D.0#ubl#u.4#pbN.S.rbV#F#z#z.o.1.w#F.H.J.la5bY.s#sbc",
+"#Dab#3.ybw#Z.K#zbnararaB#bbGbS#G.1bc.1.0bc.1.1.0ay.w#F#n#sbeai#JbA#D#b.4.e.1.z.o.B.w#u.1#DbQbLaPb#.Z.g.ZbDaka0.w#GbV#G#bbsbea7bnbK.q#4bA#G#G.0#Dar.3.y.R.U#9.Tbd#uay#r#z.MbVbe#Kb1bD#2.e#t#tbn.r",
+".raR.ObSbw#Z.KbK.1ar.ebsaY#T.e.1#GbCbc#Hbc#H.1.1bV#0#F#nbVbe.5bV.lbd#b#N.8bnaz#u#u#0.r.1#ubK#t.Z#EaIbR#1aZapbe.1.1#u#D.w.ybebnb4bn.q.S.4ay#G#D.Rbla5#u.RaP#9.Tbd.r#z.ebU.M#Gbeaub1.g.4.K#t#t#s.0",
+".raR.Oa5bwba.e.y.1ar.e.y#s.8bS.1#u#Ga0a0#Ha0.1#GbVbV#F#bbV.w#FbVbv#D#sbO#T.1az#0#u#G#G.1#ubK.Z.s#EaI#t.ga6#Y#b#G.1#DbV#DbK#BaVbeaVaY.S.4bV#G#D.y.la5#u.i.9aabOa7.r#G.e#z.M#0#b.y#Z.Z.8bQbL#t.w.0",
+".r#o.ObVbwaS.K.S.1.ebA#D.w.e.e#D#G#G.1#Ha0bc.1.0.w#u#F#P#u#z#ubS#T.1bnar.Jbn.1.w#u#G.0.1#Dbn.9bw#E.Taq.gbT#bbn#uan#G#b#Dbnbqa7be.w#a.4#F.w#G.RaBaB.ebSbn.S#X.Zbd#GbV.4#z#F#0#b.S#Z.gbAbQbZ#R#sbc",
+"#GabbwbS#3.p#4bK.wa5.e#Dbnby.lbnbV.1#Pbc.1.1#G#G#s#u#FbybV#u#0#G#T.w#D#r#x.1#Gby#G.1#G.1.1bQ.Gbw.Z#5.Za6.Zak.w#D#B#H#b.y#baLbn#a#b#baB.8.w#0bAbD#t.4bS#D.y.g#vbn#GbV.4#z#u#GbQ.y.L.ZbAbU.S.s.w.0",
+"bcat.sbV.O#k.K#4#H.ebAbC.0.W.4#Day#G.w.1.0#D#G#u.w#u#u#bbV#F.w#u.l#H.X#r.lbebCa0#G#G#G.1.1#Y.G.C.gaIbW#i.g#s#D.0azbe.1.5#YbeaYbe.w.wbX.y.wbn.4bD.ubh#N#ubV.Zbgbn#G#z#2bQbV.w.w.y#Z.g.l#sbRbY#s.0",
+"bm.Obw#z.Ob5#4.SbebSbA.1#Db0.Jbn.8#G.w.1#Gay#G#G#s#u#u#Y.1aBbe.R.ybe.5#z.Kan.0a0#0.1#Gbc#baLbI.C.gbR#EbWbT#z.y#Gb4anbnbsaLbn#a#a#H#b.ybA.w#zbOaPaT#V.l#FbVbOa3#s#0.e#2by#G.1bn.Rat.Z.4#z#t.s#s.0",
+"bm#Z.s.w.Ob5bL#tb4.ebSbC#7bPbGbV.8ay.w.w#G#D#0#G#0#ubV#n#saibe.R#0an.b#z#z#lbd#0.1#Gbc.1#H#Y.EbZaIb..gbR.Sak#G#nb4.m#b.ybq.RaLbea0#b.y.y.wbS.4.g.O#XaA#F#DaraxbQa5.ebTbQ.1a0#G.y#3.Zbv.K#t#tbn.r",
+"#G.sbw#z#2bNa2bSbV.8bQbVay#G.y.SblbS#Gay#G#0#G#ubybvbe#b#z.4.q.S#8#b#za8#Daz#7.w.w.r.1.1#H#s.GbBaBb.aP.CbAbn.1b4ananan###Bbn.mbnb4#b.ybv#GbnaP#ZadbN#jbSay.MbD.n.1#z.4#z#bbCbV#zbwaPa6#5bZbD.y.1",
+".1#tbw#z.4a9#5bV#z.8.w#G.r#G#ubAbSbS#z#0#G.1#0bS#z.o#bbn.y#2akaB.1.w#0.y#0az#Dbn.w#G#G.1#baY.9.C#2bL.Y.s.S#DbC#Hazbeana7brbn#Wbnan#b.K#u.w#bbDb1#k#k.g.Saybv#xbw.w#z.4bK#P#G#G#z.s.g.g.KbR.ZbV.1",
+".w.Sbw#z.8#..D#u#z.y#s#0bmbm#D.Ka5bS#G.w#GbS#G#0a5#F.1#DaB.4bQ#2#D.w#zbS.wbe#u#0.wbV#G.1#b.KaP.Z.ZaIbN#..S#u.1.1b4anbe#Hbebebrbnbe.w#z#u.wbn#E.LaG#ka9.4#zblaZ.sbV#z.4#z.w.0#D#s.H#i#x#5bZ.Z#s.1",
+".wbLbw.K.8.O#5.8#GbS.w.1.r#G.wbVbS.8bV#0#G#ubVbV#u.yaY#D#2.ebQ#2.1bVa5.8.w.1bSbS.w#G#G#G#GbA.g#.bLbRba.O.K#D.1.1b4anb4brbebrbrbn#Hbn.KbS.w#Db#.fb6aG#kaq#za5.8.Z#zbV.S#s.way#GbnbBaP.g.TbR#t#s.1",
+"bcaI#t.K.8.Oa2.8.w#z#z#0#Gbm.wbKa5blbVbV#G#u#ua5.y#D.wbVbGbQ#baB.wbSbA.4#b.RbVbA#0bV#G.wbVbY.Z.O.TbR#.aPbQ.ya0#b.z#Bb4anbe#B#Y.ibe#sbV#s#b.Rafb6#k#kadaP.e#zbA.4bS#s.R#s.wbS#D.1b7#i#x#4bR.9bV#G",
+".w#4bw.e.8.OaI#u#z#z#z#G#G#G.w.4#za5bS#GbVbVbVbS.4bKbV.K.MbQaY#FazbVbAaB.q#F#GbS#G.1#Haz#saBbZ.H.e.gbabN.q#7#b.zan.manbebrbrbrbn.1#D#zbV.1.R.I.ha9.L#kbN.4#zbA.8ar#s.Rbn#0.B#GbnaI#E#i#5.s.Z#s#D",
+"#GaKbR.e.yaqaI.8#z#sbK#0#G#G#saZa5bAbSbVbV#zbV#u.l#z.ybV#x.w#bbdazbV.K.Sbr.5.w#z.1bcbcaz#baBbZ.O.ebWbabi.qbs.zb4ananan.1#Bbe#Wbn.1.y.y#DbnaB#M.h.g.Oa9bibTbAbA.8.J#sbn.Raya5bVa7aI#E#i.KbR#t#s.0",
+"#Gb.bBa5bA.Oa2#u.K.K.4#z#G#GbQbDbA.8bS.y#ubVbVaB#r.KbA#zbg#Y#b#Ha0bV#sbKaLa#be#0.1#H.1#B.1bY#taP.KaPaP.U#Y#7.z.zananan.ibqaV.mbn#b#DbV#z.1bXafac.ZaI#..I#i.lbA.8.J#s.i.ya5a5#DbdaIaC#ib.bR.4bQ#D",
+"#Gb..ZbAbAbaaIbV#zbA.ybKbV#sbV#Far#z#Dblblar.8aB.y#zbR.KbG.w.1.z.wbV#T.can.Sbr#8b4.w#nb4#L#.bJ#R#z.g#3a9bq#F.z#H#f.mbe#sbe#D#L##bC#s.ybl#P#3.2.I#tbL.g#..paP.e.obTbQ#s#2.ybV.y#FbA.O.L.4.4bB#a.0",
+"#Gb..ga5.eaPbB.ya5bl.8bS#0bn#s#u.Z#zbV#Fa8.8bA.y.8#4bR#1.8#G.1.1#PbVaAb4br.e.V#8an.waz#8#WbiaIbX.k#v.uajaL#Fbc.1#fbeanbnaLa7#La7#8#sbK.r.w.O.x.Y#t.e.gbWadbN#4bl#xbQ.K#2#ubVbV#D.lba.LbZaBbwak.0",
+"#G.KaP.e#z.ObZ.y#za5bSbS#z.w#0bV.g.K#s#ua8.lbl.y#F.4.Z#i#z#G.0.w.w#DbOan.V.ebeanbr.w#bbCaLbi#..Sby.g.saObe#u#H.1#8be#B#Dbebr#L#8bc#sbKay.w.Y.LaT.4.K#taP#pbibA#u#2#s#zaB.ybV#sbV.4bababLaB.s.7.0",
+"#Gbu.ga5#s.Obw.yby#0bSbS#0#zaybSbabZ.K#zbl.8bA#u.8.Saq.6#YbV#Ga0be.1bOanbrbU#8.zaza0.w#H#WaP#EbK#b.Z#R#XaV#0.z.1#b.1#B.R#Yan.m#8#H#JbK#G#0af.L.u.4.ebO.gbN.U#t#z.ybQbV.8.y.wbVbVaBba#Z.T.4.s.kbc",
+"a0.7aP.e#z#Zbw#u#0#0#0#u#G#G#uaya9bR#4bVbSa5bS#F.K.T.Z.6b0ay#D#bbebV#T.m#8bU#D.1#8#0.1bebqaIbW#J#b#x#R#v#D#0bC#H#HbV#Bbs#B.mbe#ea0bK.K#G#0.I#Z#t#tbA.ebO#..Ua6bV#F.w#sbVbV#z#sbVbA.O#Z.ebYaT.7bc",
+"#P.Q.ga5#sba.sbAbV.wbS#u#z#GbVbVbaaT.SbKa5a5bS#F.ebL#EbD#b#u#u#Y#H.1#Tbebd.W#7bd.1bS#0beaL.T#Ebn#Y.g.S#y#u#0aobe.w.1azbs#Bbrb4a7a0au.K#Pay.I.O.Z.4.y.ebLbR#..P#z.8bV#0bVbn.w#s#sbAbH#ZbL.4.9.kbc",
+".1buaPa5#z.Y.O#ubV#sbVbV.1#z#D.wba.Z.4bA.8.e.KbA.4#t.UbL#s#zbbbe#b#b#ran.b.W#7.1#8#G#0#HbKb7.gaV#BbT.K#r#Dby#H.m.1.1be#u#B.1.wbe#P.S#z.wbSbi.n.ZbK.4.e.8aI.Z.6.K#u#GbV#0bV#s.w.w.e#Z#Z.K.4aT.k.1",
+".rb..g.e#s.YaPbV#z.wbnbV.wbn#Dbn.OaP.4.y.4#N.K.K#T#t.U.Q#z.w#F#YazanaNan.bap#Ga0az#0#P#b#KbR.Z#aaz#ibK#h#u.wbC#B#b.1bebs#B#D#baLbcbA.k#P#G#E#S#2.K.8bAbL.Tbw.6.K#G#0.wbVbVbV#s#s.e.Oba.K.4aT.k.0"
+};
+
+static void drawroundrect( TQPainter *p, TQCOORD x, TQCOORD y,
+ TQCOORD w, TQCOORD h, TQCOORD d );
+
+static inline int buttonthickness( int d );
+
+static TQRegion roundRectRegion( const TQRect& g, int r );
+
+static void get_combo_parameters( const TQRect &r,
+ int &ew, int &awh, int &ax,
+ int &ay, int &sh, int &dh,
+ int &sy );
+
+static int get_combo_extra_width( int h, int *return_awh = 0 );
+
+enum { PointUp, PointDown, PointLeft, PointRight };
+
+
+NorwegianWoodStyle::NorwegianWoodStyle() : TQWindowsStyle()
+{
+}
+
+/*!
+ Reimplementation from TQStyle
+ */
+void NorwegianWoodStyle::polish( TQApplication *app)
+{
+
+ oldPalette = app->palette();
+
+ // we simply create a nice TQColorGroup with a couple of fancy wood
+ // pixmaps here and apply to it all widgets
+
+ TQImage img(button_xpm);
+ TQImage orig = img;
+ orig.detach();
+ TQPixmap button;
+ button.convertFromImage(img);
+
+
+ int i;
+ for (i=0; i<img.numColors(); i++) {
+ TQRgb rgb = img.color(i);
+ TQColor c(rgb);
+ rgb = c.dark(120).rgb();
+ img.setColor(i,rgb);
+ }
+ TQPixmap mid;
+ mid.convertFromImage(img);
+
+ img = orig;
+ img.detach();
+ for (i=0; i<img.numColors(); i++) {
+ TQRgb rgb = img.color(i);
+ TQColor c(rgb);
+ rgb = c.light().rgb();
+ img.setColor(i,rgb);
+ }
+ TQPixmap light;
+ light.convertFromImage(img);
+
+ img = orig;
+ img.detach();
+ for (i=0; i<img.numColors(); i++) {
+ TQRgb rgb = img.color(i);
+ TQColor c(rgb);
+ rgb = c.dark(180).rgb();
+ img.setColor(i,rgb);
+ }
+ TQPixmap dark;
+ dark.convertFromImage(img);
+
+
+ TQImage bgimage(polish_xpm);
+ TQPixmap background;
+ background.convertFromImage(bgimage);
+
+ img = bgimage;
+ img.detach();
+ for (i=0; i<img.numColors(); i++) {
+ TQRgb rgb = img.color(i);
+ TQColor c(rgb);
+ rgb = c.dark(180).rgb();
+ img.setColor(i,rgb);
+ }
+ sunkenDark = new TQPixmap;
+ sunkenDark->convertFromImage(img);
+
+
+ img = bgimage;
+ img.detach();
+ for (i=0; i<img.numColors(); i++) {
+ TQRgb rgb = img.color(i);
+ TQColor c(rgb);
+ rgb = c.light(130).rgb();
+ img.setColor(i,rgb);
+ }
+ sunkenLight= new TQPixmap;
+ sunkenLight->convertFromImage(img);
+
+
+
+ TQPalette op(TQColor(212,140,95));
+ // TQPalette op(white);
+ TQColorGroup active (op.active().foreground(),
+ TQBrush(op.active().button(),button),
+ TQBrush(op.active().light(), light),
+ TQBrush(op.active().dark(), dark),
+ TQBrush(op.active().mid(), mid),
+ op.active().text(),
+ TQt::white,
+ TQColor(236,182,120),
+ TQBrush(op.active().background(), background)
+ );
+ TQColorGroup disabled (op.disabled().foreground(),
+ TQBrush(op.disabled().button(),button),
+ TQBrush(op.disabled().light(), light),
+ op.disabled().dark(),
+ TQBrush(op.disabled().mid(), mid),
+ op.disabled().text(),
+ TQt::white,
+ TQColor(236,182,120),
+ TQBrush(op.disabled().background(), background)
+ );
+
+ app->setPalette(TQPalette(active, disabled, active), TRUE );
+
+}
+
+void NorwegianWoodStyle::unPolish( TQApplication *app)
+{
+ app->setPalette(oldPalette, TRUE);
+}
+
+/*!
+ Reimplementation from TQStyle
+ */
+void NorwegianWoodStyle::polish( TQWidget* w)
+{
+
+ // the polish function sets some widgets to transparent mode and
+ // some to translate background mode in order to get the full
+ // benefit from the nice pixmaps in the color group.
+
+ if ( !w->isTopLevel() ) {
+ if ( w->inherits("TQPushButton")
+ || w->inherits("TQToolButton")
+ || w->inherits("TQComboBox") ) {
+ w->setAutoMask( TRUE );
+ return;
+ }
+ if ( w->backgroundPixmap() )
+ w->setBackgroundOrigin( TQWidget::WindowOrigin );
+ }
+}
+
+void NorwegianWoodStyle::unPolish( TQWidget* w)
+{
+ // the polish function sets some widgets to transparent mode and
+ // some to translate background mode in order to get the full
+ // benefit from the nice pixmaps in the color group.
+ if ( !w->isTopLevel() ) {
+ if ( w->inherits("TQPushButton")
+ || w->inherits("TQToolButton")
+ || w->inherits("TQComboBox") ) {
+ w->setAutoMask( FALSE );
+ return;
+ }
+ if ( w->backgroundPixmap() )
+ w->setBackgroundOrigin( TQWidget::WidgetOrigin );
+ }
+}
+
+void NorwegianWoodStyle::drawPrimitive( PrimitiveElement pe,
+ TQPainter *p,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags flags, const TQStyleOption& opt ) const
+{
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+ switch ( pe ) {
+ case PE_ButtonCommand:
+ {
+ int d = TQMIN( w, h ) / 2;
+ int b = buttonthickness( d );
+
+ TQRegion internR = roundRectRegion( TQRect(x + b, y + b,
+ w - 2 * b,
+ h - 2 * b), d - b );
+ TQPen oldPen = p->pen();
+
+ TQBrush brush( flags & Style_Sunken ? cg.brush(TQColorGroup::Mid) :
+ cg.brush(TQColorGroup::Button) );
+ p->setClipRegion( internR );
+ p->fillRect( r, brush );
+
+ int e = TQMIN( w, h ) / 2;
+ TQPoint p2( x + w - 1 - e, y + e );
+ TQPoint p3( x + e, y + h - 1 - e );
+
+ TQPointArray a;
+ a.setPoints( 5, x,y, x+w-1, y, p2.x(), p2.y(), p3.x(), p3.y(),
+ x, y + h - 1 );
+ p->setClipRegion( TQRegion(a) - internR );
+
+ p->fillRect( r, (flags & Style_Sunken ? TQBrush( cg.dark(), *sunkenDark)
+ : cg.brush(TQColorGroup::Light)) );
+
+ // A little inversion is needed the buttons
+ // ( but not flat)
+ if ( flags & Style_Raised || flags & Style_Sunken ) {
+ a.setPoint( 0, x + w - 1, y + w - 1 );
+ p->setClipRegion( TQRegion( a ) - internR );
+
+ p->fillRect( r, (flags & Style_Sunken ? TQBrush( cg.light(), *sunkenLight) : cg.brush( TQColorGroup::Dark ) ) );
+ }
+ p->setClipRegion( internR );
+ p->setClipping( FALSE );
+ p->setPen( cg.foreground() );
+ drawroundrect( p, x, y, w, h, d );
+ p->setPen( oldPen );
+ break;
+ }
+ case PE_ScrollBarAddLine:
+ if ( flags & Style_Horizontal )
+ drawSemicircleButton( p, r, PointRight, flags & Style_Down, cg );
+ else
+ drawSemicircleButton( p, r, PointDown, flags & Style_Down, cg );
+ break;
+ case PE_ScrollBarSubLine:
+ if ( flags & Style_Horizontal )
+ drawSemicircleButton( p, r, PointLeft, flags & Style_Down, cg );
+ else
+ drawSemicircleButton( p, r, PointUp, flags & Style_Down, cg );
+ break;
+ default:
+ TQWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt );
+ break;
+ }
+}
+
+void NorwegianWoodStyle::drawControl( ControlElement element,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how, const TQStyleOption& opt ) const
+{
+ switch( element ) {
+ case CE_PushButton:
+ {
+ const TQPushButton *btn;
+ btn = ( const TQPushButton * )widget;
+ TQColorGroup myCg( cg );
+ SFlags flags = Style_Default;
+ if ( btn->isOn() )
+ flags |= Style_On;
+ if ( btn->isDown() )
+ flags |= Style_Down;
+ if ( btn->isOn() || btn->isDown() )
+ flags |= Style_Sunken;
+ if ( btn->isDefault() )
+ flags |= Style_Default;
+ if ( ! btn->isFlat() && !(flags & Style_Down) )
+ flags |= Style_Raised;
+
+ int x1, y1, x2, y2;
+ r.coords( &x1, &y1, &x2, &y2 );
+
+ p->setPen( cg.foreground() );
+ p->setBrush( TQBrush( cg.button(), NoBrush ) );
+
+ TQBrush fill;
+ if ( btn->isDown() )
+ fill = cg.brush( TQColorGroup::Mid );
+ else if ( btn->isOn() )
+ fill = TQBrush( cg.mid(), Dense4Pattern );
+ else
+ fill = cg.brush( TQColorGroup::Button );
+ myCg.setBrush( TQColorGroup::Mid, fill );
+
+ if ( btn->isDefault() ) {
+ x1 += 2;
+ y1 += 2;
+ x2 -= 2;
+ y2 -= 2;
+ }
+
+ drawPrimitive( PE_ButtonCommand, p,
+ TQRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1),
+ myCg, flags, opt );
+
+ if ( btn->isDefault() ) {
+ TQPen pen( TQt::black, 4 );
+ pen.setCapStyle( TQt::RoundCap );
+ pen.setJoinStyle( TQt::RoundJoin );
+ p->setPen( pen );
+ drawroundrect( p, x1 - 1, y1 - 1, x2 - x1 + 3, y2 - y1 + 3, 8 );
+ }
+
+ if ( btn->isMenuButton() ) {
+ int dx = ( y1 - y2 - 4 ) / 3;
+
+ // reset the flags
+ flags = Style_Default;
+ if ( btn->isEnabled() )
+ flags |= Style_Enabled;
+ drawPrimitive( PE_ArrowDown, p,
+ TQRect( x2 - dx, dx, y1, y2 - y1),
+ myCg, flags, opt );
+ }
+
+ if ( p->brush().style() != NoBrush )
+ p->setBrush( NoBrush );
+ break;
+ }
+ case CE_PushButtonLabel:
+ {
+ const TQPushButton *btn;
+ btn = (const TQPushButton*)widget;
+ int x, y, w, h;
+ r.rect( &x, &y, &w, &h );
+
+ int x1, y1, x2, y2;
+ r.coords( &x1, &y1, &x2, &y2 );
+ int dx = 0;
+ int dy = 0;
+ if ( btn->isMenuButton() )
+ dx = ( y2 - y1 ) / 3;
+ if ( dx || dy )
+ p->translate( dx, dy );
+
+ x += 2;
+ y += 2;
+ w -= 4;
+ h -= 4;
+ drawItem( p, TQRect( x, y, w, h ),
+ AlignCenter | ShowPrefix,
+ cg, btn->isEnabled(),
+ btn->pixmap(), btn->text(), -1,
+ (btn->isDown() || btn->isOn()) ? &cg.brightText()
+ : &cg.buttonText() );
+ if ( dx || dy )
+ p->translate( -dx, -dy );
+ break;
+ }
+ default:
+ TQWindowsStyle::drawControl( element, p, widget, r, cg, how, opt );
+ break;
+ }
+}
+
+void NorwegianWoodStyle::drawControlMask( ControlElement element,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQStyleOption& opt ) const
+{
+ switch( element ) {
+ case CE_PushButton:
+ {
+ int d = TQMIN( r.width(), r.height() ) / 2;
+ p->setPen( color1 );
+ p->setBrush( color1 );
+ drawroundrect( p, r.x(), r.y(), r.width(), r.height(), d );
+ break;
+ }
+ default:
+ TQWindowsStyle::drawControlMask( element, p, widget, r, opt );
+ break;
+ }
+}
+
+void NorwegianWoodStyle::drawComplexControl( ComplexControl cc,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how,
+ SCFlags sub,
+ SCFlags subActive,
+ const TQStyleOption& opt ) const
+{
+ switch( cc ) {
+ case CC_ComboBox:
+ {
+ const TQComboBox *cmb;
+ cmb = (const TQComboBox*)widget;
+
+ int awh, ax, ay, sh, sy, dh, ew;
+ get_combo_parameters( subRect(SR_PushButtonContents, widget),
+ ew, awh, ax, ay, sh, dh, sy );
+ drawPrimitive( PE_ButtonCommand, p, r, cg, Style_Raised, opt );
+ TQStyle *mstyle = TQStyleFactory::create( "Motif" );
+ if ( mstyle )
+ mstyle->drawPrimitive( PE_ArrowDown, p,
+ TQRect(ax, ay, awh, awh), cg, how, opt );
+ else
+ drawPrimitive( PE_ArrowDown, p,
+ TQRect(ax, ay, awh, awh), cg, how, opt );
+
+ TQPen oldPen = p->pen();
+ p->setPen( cg.light() );
+ p->drawLine( ax, sy, ax + awh - 1, sy );
+ p->drawLine( ax, sy, ax, sy + sh - 1 );
+ p->setPen( cg.dark() );
+ p->drawLine( ax + 1, sy + sh - 1, ax + awh - 1, sy + sh - 1 );
+ p->drawLine( ax + awh - 1, sy + 1, ax + awh - 1, sy + sh - 1 );
+ p->setPen( oldPen );
+
+ if ( cmb->editable() ) {
+ TQRect r( querySubControlMetrics(CC_ComboBox, widget,
+ SC_ComboBoxEditField, opt) );
+ qDrawShadePanel( p, r, cg, TRUE, 1,
+ &cg.brush(TQColorGroup::Button) );
+ }
+
+ break;
+ }
+ default:
+ TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how,
+ sub, subActive, opt );
+ break;
+ }
+}
+
+void NorwegianWoodStyle::drawComplexControlMask( ComplexControl control,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQStyleOption& opt ) const
+{
+ switch ( control ) {
+ case CC_ComboBox:
+ {
+ int d = TQMIN( r.width(), r.height() ) / 2;
+ p->setPen( color1 );
+ p->setBrush( color1 );
+ drawroundrect( p, r.x(), r.y(), r.width(), r.height(), d );
+ break;
+ }
+ default:
+ TQWindowsStyle::drawComplexControlMask( control, p, widget, r, opt );
+ break;
+ }
+}
+
+TQRect NorwegianWoodStyle::querySubControlMetrics( ComplexControl control,
+ const TQWidget *widget,
+ SubControl sc,
+ const TQStyleOption& opt ) const
+{
+ TQRect rect;
+ switch ( control ) {
+ case CC_ComboBox:
+ {
+ switch( sc ) {
+ case SC_ComboBoxEditField:
+ {
+ rect = subRect( SR_PushButtonContents, widget );
+ int ew = get_combo_extra_width( rect.height(), 0 );
+ rect.setRect( rect.x() + 1, rect.y() + 1,
+ rect.width() - 2 - ew, rect.height() - 2 );
+ break;
+ }
+ default:
+ rect = TQWindowsStyle::querySubControlMetrics( control, widget,
+ sc, opt );
+ break;
+ }
+ break;
+ }
+ case CC_ScrollBar:
+ {
+ const TQScrollBar* sb;
+ sb = (const TQScrollBar*)widget;
+ bool horz = sb->orientation() == TQScrollBar::Horizontal;
+ int b = 2;
+ int w = horz ? sb->height() : sb->width();
+
+ switch ( sc ) {
+ case SC_ScrollBarAddLine:
+ rect.setRect( b, b, w - 2 * b, w - 2 * b );
+ if ( horz )
+ rect.moveBy( sb->width() - w, 0 );
+ else
+ rect.moveBy( 0, sb->height() - w );
+ break;
+ case SC_ScrollBarSubLine:
+ rect.setRect( b, b, w - 2 * b, w - 2 * b );
+ break;
+ default:
+ rect = TQWindowsStyle::querySubControlMetrics( control, widget,
+ sc, opt );
+ break;
+ }
+ break;
+ }
+ default:
+ rect = TQWindowsStyle::querySubControlMetrics( control, widget,
+ sc, opt );
+ break;
+ }
+ return rect;
+}
+
+TQRect NorwegianWoodStyle::subRect( SubRect sr, const TQWidget * widget ) const
+{
+ TQRect r;
+ switch ( sr ) {
+ case SR_PushButtonContents:
+ {
+ const TQPushButton *btn;
+ btn = (const TQPushButton*)widget;
+ r = btn->rect();
+ int d = TQMIN( r.width(), r.height() ) / 2;
+ int b = buttonthickness( d );
+
+ d -= b;
+ b++;
+
+ if ( r.width() < r.height() )
+ r.setRect( r.x() + b, r.y() + d,
+ r.width() - 2 * b, r.height() - 2 * d );
+ else
+ r.setRect( r.x() + d, r.y() + b,
+ r.width() - 2 * d, r.height() - 2 * b );
+ break;
+ }
+ case SR_ComboBoxFocusRect:
+ {
+ r = subRect( SR_PushButtonContents, widget );
+ int ew = get_combo_extra_width( r.height() );
+ r.setRect( r.x() + 1, r.y() + 1, r.width() - 2 - ew,
+ r.height() - 2 );
+ break;
+ }
+ default:
+ r = TQWindowsStyle::subRect( sr, widget );
+ break;
+ }
+ return r;
+}
+
+static void drawroundrect( TQPainter *p, TQCOORD x, TQCOORD y,
+ TQCOORD w, TQCOORD h, TQCOORD d )
+{
+ int rx = (200*d)/w;
+ int ry = (200*d)/h;
+ p->drawRoundRect( x, y, w, h, rx, ry );
+}
+
+static TQRegion roundRectRegion( const TQRect& g, int r )
+{
+ TQPointArray a;
+ a.setPoints( 8, g.x()+r, g.y(), g.right()-r, g.y(),
+ g.right(), g.y()+r, g.right(), g.bottom()-r,
+ g.right()-r, g.bottom(), g.x()+r, g.bottom(),
+ g.x(), g.bottom()-r, g.x(), g.y()+r );
+ TQRegion reg( a );
+ int d = r*2-1;
+ reg += TQRegion( g.x(),g.y(),r*2,r*2, TQRegion::Ellipse );
+ reg += TQRegion( g.right()-d,g.y(),r*2,r*2, TQRegion::Ellipse );
+ reg += TQRegion( g.x(),g.bottom()-d,r*2,r*2, TQRegion::Ellipse );
+ reg += TQRegion( g.right()-d,g.bottom()-d,r*2,r*2, TQRegion::Ellipse );
+ return reg;
+}
+
+
+
+
+static int get_combo_extra_width( int h, int *return_awh )
+{
+ int awh;
+ if ( h < 8 ) {
+ awh = 6;
+ } else if ( h < 14 ) {
+ awh = h - 2;
+ } else {
+ awh = h/2;
+ }
+ if ( return_awh )
+ *return_awh = awh;
+ return awh*3/2;
+}
+
+
+static void get_combo_parameters( const TQRect &r,
+ int &ew, int &awh, int &ax,
+ int &ay, int &sh, int &dh,
+ int &sy )
+{
+ ew = get_combo_extra_width( r.height(), &awh );
+
+ sh = (awh+3)/4;
+ if ( sh < 3 )
+ sh = 3;
+ dh = sh/2 + 1;
+
+ ay = r.y() + (r.height()-awh-sh-dh)/2;
+ if ( ay < 0 ) {
+ //panic mode
+ ay = 0;
+ sy = r.height();
+ } else {
+ sy = ay+awh+dh;
+ }
+ ax = r.x() + r.width() - ew +(ew-awh)/2;
+}
+
+static inline int buttonthickness( int d )
+{ return d > 20 ? 5 : ( d < 10 ? 2: 3 ); }
+
+void NorwegianWoodStyle::drawSemicircleButton( TQPainter *p, const TQRect &r,
+ int dir, bool sunken,
+ const TQColorGroup &g ) const
+{
+ int b = pixelMetric( PM_ScrollBarExtent ) > 20 ? 3 : 2;
+
+ TQRegion extrn( r.x(), r.y(), r.width(), r.height(), TQRegion::Ellipse );
+ TQRegion intern( r.x()+b, r.y()+b, r.width()-2*b, r.height()-2*b, TQRegion::Ellipse );
+ int w2 = r.width()/2;
+ int h2 = r.height()/2;
+
+ int bug = 1; //off-by-one somewhere!!!???
+
+ switch( dir ) {
+ case PointRight:
+ extrn += TQRegion( r.x(), r.y(), w2, r.height() );
+ intern += TQRegion( r.x()+b,r.y()+b, w2-2*b, r.height()-2*b );
+ break;
+ case PointLeft:
+ extrn += TQRegion( r.x()+w2, r.y(), w2, r.height() );
+ intern += TQRegion( r.x()+w2+b,r.y()+b, w2-2*b, r.height()-2*b );
+ break;
+ case PointUp:
+ extrn += TQRegion( r.x(), r.y()+h2, r.width(), h2 );
+ intern += TQRegion( r.x()+b,r.y()+h2+b, r.width()-2*b-bug, h2-2*b-bug );
+ break;
+ case PointDown:
+ extrn += TQRegion( r.x(), r.y(), r.width(), h2 );
+ intern += TQRegion( r.x()+b,r.y()+b, r.width()-2*b-bug, h2-2*b-bug );
+ break;
+ }
+
+ extrn = extrn - intern;
+ TQPointArray a;
+ a.setPoints( 3, r.x(), r.y(), r.x(), r.bottom(), r.right(), r.top() );
+
+ TQRegion oldClip = p->clipRegion();
+ bool bReallyClip = p->hasClipping(); // clip only if we really want.
+ p->setClipRegion( intern );
+ p->fillRect( r, g.brush( TQColorGroup::Button ) );
+
+ p->setClipRegion( TQRegion(a)&extrn );
+ p->fillRect( r, sunken ? g.dark() : g.light() );
+
+ a.setPoints( 3, r.right(), r.bottom(), r.x(), r.bottom(),
+ r.right(), r.top() );
+ p->setClipRegion( TQRegion(a) & extrn );
+ p->fillRect( r, sunken ? g.light() : g.dark() );
+
+ p->setClipRegion( oldClip );
+ p->setClipping( bReallyClip );
+}
+
+#endif
diff --git a/examples/themes/wood.h b/examples/themes/wood.h
new file mode 100644
index 000000000..c05efb10c
--- /dev/null
+++ b/examples/themes/wood.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Definition of something or other
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef WOOD_H
+#define WOOD_H
+
+
+#include <qpalette.h>
+
+#ifndef QT_NO_STYLE_WINDOWS
+
+#include <qwindowsstyle.h>
+
+
+class NorwegianWoodStyle : public TQWindowsStyle
+{
+public:
+ NorwegianWoodStyle();
+ void polish( TQApplication*);
+ void polish( TQWidget* );
+ void unPolish( TQWidget* );
+ void unPolish( TQApplication*);
+
+ void drawPrimitive( PrimitiveElement pe,
+ TQPainter *p,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags flags = Style_Default,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+
+ void drawControl( ControlElement element,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how = Style_Default,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+
+ void drawControlMask( ControlElement element,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+
+ void drawComplexControl( ComplexControl cc,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQColorGroup &cg,
+ SFlags how = Style_Default,
+ SCFlags sub = SC_All,
+ SCFlags subActive = SC_None,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+
+ void drawComplexControlMask( ComplexControl control,
+ TQPainter *p,
+ const TQWidget *widget,
+ const TQRect &r,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+
+ TQRect querySubControlMetrics( ComplexControl control,
+ const TQWidget *widget,
+ SubControl sc,
+ const TQStyleOption& = TQStyleOption::Default ) const;
+
+ TQRect subRect( SubRect r, const TQWidget *widget ) const;
+
+
+private:
+ void drawSemicircleButton(TQPainter *p, const TQRect &r, int dir,
+ bool sunken, const TQColorGroup &g ) const;
+ TQPalette oldPalette;
+ TQPixmap *sunkenDark;
+ TQPixmap *sunkenLight;
+
+};
+
+#endif
+
+#endif
diff --git a/examples/thread/prodcons/prodcons.cpp b/examples/thread/prodcons/prodcons.cpp
new file mode 100644
index 000000000..f6ff4500a
--- /dev/null
+++ b/examples/thread/prodcons/prodcons.cpp
@@ -0,0 +1,409 @@
+#include <qthread.h>
+#include <qwaitcondition.h>
+#include <qmutex.h>
+#include <qapplication.h>
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qprogressbar.h>
+#include <qlayout.h>
+#include <qevent.h>
+#include <qlabel.h>
+#include <qcstring.h>
+#include <qtextstream.h>
+#include <qfile.h>
+
+#include <stdio.h>
+
+// 50kb buffer
+#define BUFSIZE (100*1000)
+#define PRGSTEP (BUFSIZE / 50)
+#define BLKSIZE (8)
+TQByteArray bytearray;
+
+
+class ProdEvent : public TQCustomEvent
+{
+public:
+ ProdEvent(long s, bool d)
+ : TQCustomEvent(TQEvent::User + 100), sz(s), dn(d)
+ { ; }
+
+ long size() const { return sz; }
+ bool done() const { return dn; }
+
+
+private:
+ long sz;
+ bool dn;
+};
+
+
+class ProdThread : public TQThread
+{
+public:
+ ProdThread(TQObject *r, TQMutex *m, TQWaitCondition *c);
+
+ void stop();
+ void run();
+
+
+private:
+ TQObject *receiver;
+ TQMutex *mutex;
+ TQWaitCondition *condition;
+
+ bool done;
+};
+
+
+ProdThread::ProdThread(TQObject *r, TQMutex *m, TQWaitCondition *c)
+ : receiver(r), mutex(m), condition(c), done(FALSE)
+{
+}
+
+
+void ProdThread::stop()
+{
+ mutex->lock();
+ done = TRUE;
+ mutex->unlock();
+}
+
+
+void ProdThread::run()
+{
+ bool stop = FALSE;
+ done = FALSE;
+
+ uchar *buffer = new uchar[BUFSIZE];
+ int pos = 0, oldpos = 0;
+ int loop = 1;
+ int lastpostedpos = 0;
+
+ ProdEvent *pe = new ProdEvent(pos, done);
+ TQApplication::postEvent(receiver, pe);
+
+ while (! stop) {
+ oldpos = pos;
+ int i;
+ for (i = 0; i < BLKSIZE && pos < BUFSIZE; i++) {
+ buffer[pos++] = (loop % 2) ? 'o' : 'e';
+ }
+
+ mutex->lock();
+
+ if (pos == BUFSIZE) {
+ done = TRUE;
+ }
+
+ while (! bytearray.isNull() && ! stop) {
+ condition->wakeOne();
+ condition->wait(mutex);
+
+ stop = done;
+ }
+
+ stop = done;
+ bytearray.duplicate((const char *) (buffer + oldpos), pos - oldpos);
+ condition->wakeOne();
+
+ mutex->unlock();
+
+ if ( pos - lastpostedpos > PRGSTEP || stop ) {
+ lastpostedpos = pos;
+ ProdEvent *pe = new ProdEvent(pos, stop);
+ TQApplication::postEvent(receiver, pe);
+ }
+
+ loop++;
+ }
+
+ condition->wakeOne();
+
+ delete [] buffer;
+}
+
+
+class ConsEvent : public TQCustomEvent
+{
+public:
+ ConsEvent(long s)
+ : TQCustomEvent(TQEvent::User + 101), sz(s)
+ { ; }
+
+ long size() const { return sz; }
+
+
+private:
+ long sz;
+};
+
+
+class ConsThread : public TQThread
+{
+public:
+ ConsThread(TQObject *r, TQMutex *m, TQWaitCondition *c);
+
+ void stop();
+ void run();
+
+
+private:
+ TQObject *receiver;
+ TQMutex *mutex;
+ TQWaitCondition *condition;
+
+ bool done;
+};
+
+
+ConsThread::ConsThread(TQObject *r, TQMutex *m, TQWaitCondition *c)
+ : receiver(r), mutex(m), condition(c), done(FALSE)
+{
+}
+
+
+void ConsThread::stop()
+{
+ mutex->lock();
+ done = TRUE;
+ mutex->unlock();
+}
+
+
+void ConsThread::run()
+{
+ bool stop = FALSE;
+ done = FALSE;
+
+ TQFile file("prodcons.out");
+ file.open(IO_WriteOnly);
+
+ long size = 0;
+ long lastsize = 0;
+
+ ConsEvent *ce = new ConsEvent(size);
+ TQApplication::postEvent(receiver, ce);
+
+ while (! stop) {
+ mutex->lock();
+
+ while (bytearray.isNull() && ! stop) {
+ condition->wakeOne();
+ condition->wait(mutex);
+
+ stop = done;
+ }
+
+ if (size < BUFSIZE) {
+ file.writeBlock(bytearray.data(), bytearray.size());
+ size += bytearray.size();
+ bytearray.resize(0);
+ }
+
+ stop = done || size >= BUFSIZE;
+
+ mutex->unlock();
+
+ if ( size - lastsize > 1000 || stop ) {
+ lastsize = size;
+ ConsEvent *ce = new ConsEvent(size);
+ TQApplication::postEvent(receiver, ce);
+ }
+ }
+
+ file.flush();
+ file.close();
+}
+
+
+class ProdCons : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ ProdCons();
+ ~ProdCons();
+
+ void customEvent(TQCustomEvent *);
+
+
+public slots:
+ void go();
+ void stop();
+
+
+private:
+ TQMutex mutex;
+ TQWaitCondition condition;
+
+ ProdThread *prod;
+ ConsThread *cons;
+
+ TQPushButton *startbutton, *stopbutton;
+ TQCheckBox *loopcheckbox;
+ TQProgressBar *prodbar, *consbar;
+ bool stopped;
+ bool redraw;
+};
+
+
+ProdCons::ProdCons()
+ : TQWidget(0, "producer consumer widget"),
+ prod(0), cons(0), stopped(FALSE), redraw(TRUE)
+{
+ startbutton = new TQPushButton("&Start", this);
+ connect(startbutton, SIGNAL(clicked()), SLOT(go()));
+
+ stopbutton = new TQPushButton("S&top", this);
+ connect(stopbutton, SIGNAL(clicked()), SLOT(stop()));
+ stopbutton->setEnabled(FALSE);
+
+ loopcheckbox = new TQCheckBox("Loop", this);
+ loopcheckbox->setChecked(FALSE);
+
+ prodbar = new TQProgressBar(BUFSIZE, this);
+ consbar = new TQProgressBar(BUFSIZE, this);
+
+ TQVBoxLayout *vbox = new TQVBoxLayout(this, 8, 8);
+ vbox->addWidget(new TQLabel(TQString("Producer/Consumer using %1 byte buffer").
+ arg(BUFSIZE), this));
+ vbox->addWidget(startbutton);
+ vbox->addWidget(stopbutton);
+ vbox->addWidget(loopcheckbox);
+ vbox->addWidget(new TQLabel("Producer progress:", this));
+ vbox->addWidget(prodbar);
+ vbox->addWidget(new TQLabel("Consumer progress:", this));
+ vbox->addWidget(consbar);
+}
+
+
+ProdCons::~ProdCons()
+{
+ stop();
+
+ if (prod) {
+ delete prod;
+ prod = 0;
+ }
+
+ if (cons) {
+ delete cons;
+ cons = 0;
+ }
+}
+
+
+void ProdCons::go()
+{
+ stopped = FALSE;
+
+ mutex.lock();
+
+ if ( redraw ) {
+ startbutton->setEnabled(FALSE);
+ stopbutton->setEnabled(TRUE);
+ }
+
+ // start the consumer first
+ if (! cons)
+ cons = new ConsThread(this, &mutex, &condition);
+ cons->start();
+
+ // wait for consumer to signal that it has started
+ condition.wait(&mutex);
+
+ if (! prod)
+ prod = new ProdThread(this, &mutex, &condition);
+ prod->start();
+ mutex.unlock();
+}
+
+
+void ProdCons::stop()
+{
+ if (prod && prod->running()) {
+ prod->stop();
+ condition.wakeAll();
+ prod->wait();
+ }
+
+ if (cons && cons->running()) {
+ cons->stop();
+ condition.wakeAll();
+ cons->wait();
+ }
+
+ if ( redraw ) {
+ // no point in repainting these buttons so many times is we are looping...
+ startbutton->setEnabled(TRUE);
+ stopbutton->setEnabled(FALSE);
+ }
+
+ stopped = TRUE;
+}
+
+
+void ProdCons::customEvent(TQCustomEvent *e)
+{
+ switch (e->type()) {
+ case TQEvent::User + 100:
+ {
+ // ProdEvent
+ ProdEvent *pe = (ProdEvent *) e;
+
+ if (pe->size() == 0 ||
+ pe->size() == BUFSIZE ||
+ pe->size() - prodbar->progress() >= PRGSTEP)
+ prodbar->setProgress(pe->size());
+
+ // reap the threads
+ if (pe->done()) {
+ bool loop = (loopcheckbox->isChecked() && ! stopped);
+ bool save_redraw = redraw;
+ redraw = !loop;
+
+ stop();
+
+ if (loop)
+ go();
+
+ redraw = save_redraw;
+ }
+
+ break;
+ }
+
+ case TQEvent::User + 101:
+ {
+ // ConsEvent
+ ConsEvent *ce = (ConsEvent *) e;
+
+ if (ce->size() == 0 ||
+ ce->size() == BUFSIZE ||
+ ce->size() - consbar->progress() >= PRGSTEP)
+ consbar->setProgress(ce->size());
+
+ break;
+ }
+
+ default:
+ {
+ ;
+ }
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ TQApplication app(argc, argv);
+ ProdCons prodcons;
+ app.setMainWidget(&prodcons);
+ prodcons.show();
+ return app.exec();
+}
+
+
+#include "prodcons.moc"
diff --git a/examples/thread/prodcons/prodcons.pro b/examples/thread/prodcons/prodcons.pro
new file mode 100644
index 000000000..e728223ea
--- /dev/null
+++ b/examples/thread/prodcons/prodcons.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+TARGET = prodcons
+
+CONFIG += qt warn_on
+
+REQUIRES = thread large-config
+
+SOURCES = prodcons.cpp
+CLEAN_FILES = prodcons.out
diff --git a/examples/thread/semaphores/main.cpp b/examples/thread/semaphores/main.cpp
new file mode 100644
index 000000000..69d4779d5
--- /dev/null
+++ b/examples/thread/semaphores/main.cpp
@@ -0,0 +1,274 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+#include <qapplication.h>
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qmultilineedit.h>
+#include <qthread.h>
+#include <qsemaphore.h>
+#include <qmutex.h>
+#include <qlayout.h>
+#include <qmessagebox.h>
+#include <qlabel.h>
+
+#if defined(QT_NO_THREAD)
+# error Thread support not enabled.
+#endif
+
+// Use pointers to create semaphores after TQApplication object!
+TQSemaphore* yellowSem, *greenSem;
+
+
+class YellowThread : public TQThread
+{
+public:
+ YellowThread(TQWidget *o)
+ : receiver(o), stopped(FALSE)
+ { ; }
+
+ void run();
+ void stop();
+
+
+private:
+ TQWidget *receiver;
+ TQMutex mutex;
+ bool stopped;
+};
+
+
+void YellowThread::run()
+{
+ for (int i = 0; i < 20; i++) {
+ (*yellowSem)++;
+
+ TQCustomEvent *event = new TQCustomEvent(12345);
+ event->setData(new TQString("Yellow!"));
+ TQApplication::postEvent(receiver, event);
+ msleep(200);
+
+ (*greenSem)--;
+
+ mutex.lock();
+ if (stopped) {
+ stopped = FALSE;
+ mutex.unlock();
+ break;
+ }
+ mutex.unlock();
+ }
+
+ (*yellowSem)++;
+
+ TQCustomEvent *event = new TQCustomEvent(12346);
+ event->setData(new TQString("Yellow!"));
+ TQApplication::postEvent(receiver, event);
+
+ (*greenSem)--;
+}
+
+void YellowThread::stop()
+{
+ mutex.lock();
+ stopped = TRUE;
+ mutex.unlock();
+}
+
+
+class GreenThread: public TQThread
+{
+public:
+ GreenThread(TQWidget *o)
+ : receiver(o), stopped( FALSE )
+ { ; }
+
+ void run();
+ void stop();
+
+
+private:
+ TQWidget *receiver;
+ TQMutex mutex;
+ bool stopped;
+};
+
+
+void GreenThread::run()
+{
+ for (int i = 0; i < 20; i++) {
+ (*greenSem)++;
+
+ TQCustomEvent *event = new TQCustomEvent(12345);
+ event->setData(new TQString("Green!"));
+ TQApplication::postEvent(receiver, event);
+ msleep(200);
+
+ (*yellowSem)--;
+
+ mutex.lock();
+ if (stopped) {
+ stopped = FALSE;
+ mutex.unlock();
+ break;
+ }
+ mutex.unlock();
+ }
+
+ (*greenSem)++;
+
+ TQCustomEvent *event = new TQCustomEvent(12346);
+ event->setData(new TQString("Green!"));
+ TQApplication::postEvent(receiver, event);
+ msleep(10);
+
+ (*yellowSem)--;
+}
+
+void GreenThread::stop()
+{
+ mutex.lock();
+ stopped = TRUE;
+ mutex.unlock();
+}
+
+
+
+class SemaphoreExample : public TQWidget
+{
+ Q_OBJECT
+public:
+ SemaphoreExample();
+ ~SemaphoreExample();
+
+ void customEvent(TQCustomEvent *);
+
+
+public slots:
+ void startExample();
+
+
+protected:
+
+
+private:
+ TQMultiLineEdit *mlineedit;
+ TQPushButton *button;
+ TQLabel *label;
+
+ YellowThread yellowThread;
+ GreenThread greenThread;
+};
+
+
+SemaphoreExample::SemaphoreExample()
+ : TQWidget(), yellowThread(this), greenThread(this)
+{
+ yellowSem = new TQSemaphore(1);
+ greenSem = new TQSemaphore(1);
+
+ button = new TQPushButton("&Ignition!", this);
+ connect(button, SIGNAL(clicked()), SLOT(startExample()));
+
+ mlineedit = new TQMultiLineEdit(this);
+ label = new TQLabel(this);
+
+ TQVBoxLayout *vbox = new TQVBoxLayout(this, 5);
+ vbox->addWidget(button);
+ vbox->addWidget(mlineedit);
+ vbox->addWidget(label);
+}
+
+
+SemaphoreExample::~SemaphoreExample()
+{
+ bool stopYellow = yellowThread.running(),
+ stopGreen = greenThread.running();
+ if (stopYellow)
+ yellowThread.stop();
+ if (greenThread.running())
+ greenThread.stop();
+ if (stopYellow)
+ yellowThread.wait();
+ if (stopGreen)
+ greenThread.wait();
+ delete yellowSem;
+ delete greenSem;
+}
+
+
+void SemaphoreExample::startExample()
+{
+ if (yellowThread.running() || greenThread.running()) {
+ TQMessageBox::information(this, "Sorry",
+ "The threads have not completed yet, and must finish before "
+ "they can be started again.");
+
+ return;
+ }
+
+ mlineedit->clear();
+
+ while (yellowSem->available() < yellowSem->total()) (*yellowSem)--;
+ (*yellowSem)++;
+
+ yellowThread.start();
+ greenThread.start();
+}
+
+
+void SemaphoreExample::customEvent(TQCustomEvent *event) {
+ switch (event->type()) {
+ case 12345:
+ {
+ TQString *s = (TQString *) event->data();
+
+ mlineedit->append(*s);
+
+ if (*s == "Green!")
+ label->setBackgroundColor(green);
+ else
+ label->setBackgroundColor(yellow);
+ label->setText(*s);
+
+ delete s;
+
+ break;
+ }
+
+ case 12346:
+ {
+ TQString *s = (TQString *) event->data();
+
+ TQMessageBox::information(this, (*s) + " - Finished",
+ "The thread creating the \"" + *s +
+ "\" events has finished.");
+ delete s;
+
+ break;
+ }
+
+ default:
+ {
+ qWarning("Unknown custom event type: %d", event->type());
+ }
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ TQApplication app(argc, argv);
+ SemaphoreExample se;
+ app.setMainWidget(&se);
+ se.show();
+ return app.exec();
+}
+
+
+#include "main.moc"
diff --git a/examples/thread/semaphores/semaphores.pro b/examples/thread/semaphores/semaphores.pro
new file mode 100644
index 000000000..7804ce341
--- /dev/null
+++ b/examples/thread/semaphores/semaphores.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = semaphores
+
+CONFIG += qt warn_on release thread
+
+REQUIRES = thread full-config
+
+HEADERS =
+SOURCES = main.cpp
+INTERFACES =
diff --git a/examples/tictac/README b/examples/tictac/README
new file mode 100644
index 000000000..150f5d84b
--- /dev/null
+++ b/examples/tictac/README
@@ -0,0 +1,7 @@
+This is a very simple implementation of the tic-tac-toe game.
+
+We didn't put much effort in making a clever algorithm so it's not a
+challenge to play against the computer. Instead, study the source code to
+see how you can make reusable components such as the TicTacGameBoard
+widget.
+
diff --git a/examples/tictac/main.cpp b/examples/tictac/main.cpp
new file mode 100644
index 000000000..1a18598c9
--- /dev/null
+++ b/examples/tictac/main.cpp
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <stdlib.h>
+#include "tictac.h"
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+ int n = 3;
+ if ( argc == 2 ) // get board size n
+ n = atoi(argv[1]);
+ if ( n < 3 || n > 10 ) { // out of range
+ qWarning( "%s: Board size must be from 3x3 to 10x10", argv[0] );
+ return 1;
+ }
+ TicTacToe ttt( n ); // create game
+ a.setMainWidget( &ttt );
+ ttt.setCaption("TQt Example - TicTac");
+ ttt.show(); // show widget
+ return a.exec(); // go
+}
diff --git a/examples/tictac/tictac.cpp b/examples/tictac/tictac.cpp
new file mode 100644
index 000000000..60cd0eb71
--- /dev/null
+++ b/examples/tictac/tictac.cpp
@@ -0,0 +1,375 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "tictac.h"
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qdrawutil.h>
+#include <qcombobox.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <stdlib.h> // rand() function
+#include <qdatetime.h> // seed for rand()
+
+
+//***************************************************************************
+//* TicTacButton member functions
+//***************************************************************************
+
+// --------------------------------------------------------------------------
+// Creates a TicTacButton
+//
+
+TicTacButton::TicTacButton( TQWidget *parent ) : TQPushButton( parent )
+{
+ t = Blank; // initial type
+}
+
+// --------------------------------------------------------------------------
+// Paints TicTacButton
+//
+
+void TicTacButton::drawButtonLabel( TQPainter *p )
+{
+ TQRect r = rect();
+ p->setPen( TQPen( white,2 ) ); // set fat pen
+ if ( t == Circle ) {
+ p->drawEllipse( r.left()+4, r.top()+4, r.width()-8, r.height()-8 );
+ } else if ( t == Cross ) { // draw cross
+ p->drawLine( r.topLeft() +TQPoint(4,4), r.bottomRight()-TQPoint(4,4));
+ p->drawLine( r.bottomLeft()+TQPoint(4,-4),r.topRight() -TQPoint(4,-4));
+ }
+}
+
+
+//***************************************************************************
+//* TicTacGameBoard member functions
+//***************************************************************************
+
+// --------------------------------------------------------------------------
+// Creates a game board with N x N buttons and connects the "clicked()"
+// signal of all buttons to the "buttonClicked()" slot.
+//
+
+TicTacGameBoard::TicTacGameBoard( int n, TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ st = Init; // initial state
+ nBoard = n;
+ n *= n; // make square
+ comp_starts = FALSE; // human starts
+ buttons = new TicTacButtons(n); // create real buttons
+ btArray = new TicTacArray(n); // create button model
+ TQGridLayout * grid = new TQGridLayout( this, nBoard, nBoard, 4 );
+ TQPalette p( blue );
+ for ( int i=0; i<n; i++ ) { // create and connect buttons
+ TicTacButton *ttb = new TicTacButton( this );
+ ttb->setPalette( p );
+ ttb->setEnabled( FALSE );
+ connect( ttb, SIGNAL(clicked()), SLOT(buttonClicked()) );
+ grid->addWidget( ttb, i%nBoard, i/nBoard );
+ buttons->insert( i, ttb );
+ btArray->at(i) = TicTacButton::Blank; // initial button type
+ }
+ TQTime t = TQTime::currentTime(); // set random seed
+ srand( t.hour()*12+t.minute()*60+t.second()*60 );
+}
+
+TicTacGameBoard::~TicTacGameBoard()
+{
+ delete buttons;
+ delete btArray;
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacGameBoard::computerStarts( bool v )
+//
+// Computer starts if v=TRUE. The human starts by default.
+//
+
+void TicTacGameBoard::computerStarts( bool v )
+{
+ comp_starts = v;
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacGameBoard::newGame()
+//
+// Clears the game board and prepares for a new game
+//
+
+void TicTacGameBoard::newGame()
+{
+ st = HumansTurn;
+ for ( int i=0; i<nBoard*nBoard; i++ )
+ btArray->at(i) = TicTacButton::Blank;
+ if ( comp_starts )
+ computerMove();
+ else
+ updateButtons();
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacGameBoard::buttonClicked() - SLOT
+//
+// This slot is activated when a TicTacButton emits the signal "clicked()",
+// i.e. the user has clicked on a TicTacButton.
+//
+
+void TicTacGameBoard::buttonClicked()
+{
+ if ( st != HumansTurn ) // not ready
+ return;
+ int i = buttons->findRef( (TicTacButton*)sender() );
+ TicTacButton *b = buttons->at(i); // get piece that was pressed
+ if ( b->type() == TicTacButton::Blank ) { // empty piece?
+ btArray->at(i) = TicTacButton::Circle;
+ updateButtons();
+ if ( checkBoard( btArray ) == 0 ) // not a winning move?
+ computerMove();
+ int s = checkBoard( btArray );
+ if ( s ) { // any winners yet?
+ st = s == TicTacButton::Circle ? HumanWon : ComputerWon;
+ emit finished();
+ }
+ }
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacGameBoard::updateButtons()
+//
+// Updates all buttons that have changed state
+//
+
+void TicTacGameBoard::updateButtons()
+{
+ for ( int i=0; i<nBoard*nBoard; i++ ) {
+ if ( buttons->at(i)->type() != btArray->at(i) )
+ buttons->at(i)->setType( (TicTacButton::Type)btArray->at(i) );
+ buttons->at(i)->setEnabled( buttons->at(i)->type() ==
+ TicTacButton::Blank );
+ }
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacGameBoard::checkBoard()
+//
+// Checks if one of the players won the game, works for any board size.
+//
+// Returns:
+// - TicTacButton::Cross if the player with X buttons won
+// - TicTacButton::Circle if the player with O buttons won
+// - Zero (0) if there is no winner yet
+//
+
+int TicTacGameBoard::checkBoard( TicTacArray *a )
+{
+ int t = 0;
+ int row, col;
+ bool won = FALSE;
+ for ( row=0; row<nBoard && !won; row++ ) { // check horizontal
+ t = a->at(row*nBoard);
+ if ( t == TicTacButton::Blank )
+ continue;
+ col = 1;
+ while ( col<nBoard && a->at(row*nBoard+col) == t )
+ col++;
+ if ( col == nBoard )
+ won = TRUE;
+ }
+ for ( col=0; col<nBoard && !won; col++ ) { // check vertical
+ t = a->at(col);
+ if ( t == TicTacButton::Blank )
+ continue;
+ row = 1;
+ while ( row<nBoard && a->at(row*nBoard+col) == t )
+ row++;
+ if ( row == nBoard )
+ won = TRUE;
+ }
+ if ( !won ) { // check diagonal top left
+ t = a->at(0); // to bottom right
+ if ( t != TicTacButton::Blank ) {
+ int i = 1;
+ while ( i<nBoard && a->at(i*nBoard+i) == t )
+ i++;
+ if ( i == nBoard )
+ won = TRUE;
+ }
+ }
+ if ( !won ) { // check diagonal bottom left
+ int j = nBoard-1; // to top right
+ int i = 0;
+ t = a->at(i+j*nBoard);
+ if ( t != TicTacButton::Blank ) {
+ i++; j--;
+ while ( i<nBoard && a->at(i+j*nBoard) == t ) {
+ i++; j--;
+ }
+ if ( i == nBoard )
+ won = TRUE;
+ }
+ }
+ if ( !won ) // no winner
+ t = 0;
+ return t;
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacGameBoard::computerMove()
+//
+// Puts a piece on the game board. Very, very simple.
+//
+
+void TicTacGameBoard::computerMove()
+{
+ int numButtons = nBoard*nBoard;
+ int *altv = new int[numButtons]; // buttons alternatives
+ int altc = 0;
+ int stopHuman = -1;
+ TicTacArray a = btArray->copy();
+ int i;
+ for ( i=0; i<numButtons; i++ ) { // try all positions
+ if ( a[i] != TicTacButton::Blank ) // already a piece there
+ continue;
+ a[i] = TicTacButton::Cross; // test if computer wins
+ if ( checkBoard(&a) == a[i] ) { // computer will win
+ st = ComputerWon;
+ stopHuman = -1;
+ break;
+ }
+ a[i] = TicTacButton::Circle; // test if human wins
+ if ( checkBoard(&a) == a[i] ) { // oops...
+ stopHuman = i; // remember position
+ a[i] = TicTacButton::Blank; // restore button
+ continue; // computer still might win
+ }
+ a[i] = TicTacButton::Blank; // restore button
+ altv[altc++] = i; // remember alternative
+ }
+ if ( stopHuman >= 0 ) // must stop human from winning
+ a[stopHuman] = TicTacButton::Cross;
+ else if ( i == numButtons ) { // tried all alternatives
+ if ( altc > 0 ) // set random piece
+ a[altv[rand()%(altc--)]] = TicTacButton::Cross;
+ if ( altc == 0 ) { // no more blanks
+ st = NobodyWon;
+ emit finished();
+ }
+ }
+ *btArray = a; // update model
+ updateButtons(); // update buttons
+ delete[] altv;
+}
+
+
+//***************************************************************************
+//* TicTacToe member functions
+//***************************************************************************
+
+// --------------------------------------------------------------------------
+// Creates a game widget with a game board and two push buttons, and connects
+// signals of child widgets to slots.
+//
+
+TicTacToe::TicTacToe( int boardSize, TQWidget *parent, const char *name )
+ : TQWidget( parent, name )
+{
+ TQVBoxLayout * l = new TQVBoxLayout( this, 6 );
+
+ // Create a message label
+
+ message = new TQLabel( this );
+ message->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken );
+ message->setAlignment( AlignCenter );
+ l->addWidget( message );
+
+ // Create the game board and connect the signal finished() to this
+ // gameOver() slot
+
+ board = new TicTacGameBoard( boardSize, this );
+ connect( board, SIGNAL(finished()), SLOT(gameOver()) );
+ l->addWidget( board );
+
+ // Create a horizontal frame line
+
+ TQFrame *line = new TQFrame( this );
+ line->setFrameStyle( TQFrame::HLine | TQFrame::Sunken );
+ l->addWidget( line );
+
+ // Create the combo box for deciding who should start, and
+ // connect its clicked() signals to the buttonClicked() slot
+
+ whoStarts = new TQComboBox( this );
+ whoStarts->insertItem( "Computer starts" );
+ whoStarts->insertItem( "Human starts" );
+ l->addWidget( whoStarts );
+
+ // Create the push buttons and connect their clicked() signals
+ // to this right slots.
+
+ newGame = new TQPushButton( "Play!", this );
+ connect( newGame, SIGNAL(clicked()), SLOT(newGameClicked()) );
+ tquit = new TQPushButton( "Quit", this );
+ connect( tquit, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+ TQHBoxLayout * b = new TQHBoxLayout;
+ l->addLayout( b );
+ b->addWidget( newGame );
+ b->addWidget( tquit );
+
+ newState();
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacToe::newGameClicked() - SLOT
+//
+// This slot is activated when the new game button is clicked.
+//
+
+void TicTacToe::newGameClicked()
+{
+ board->computerStarts( whoStarts->currentItem() == 0 );
+ board->newGame();
+ newState();
+}
+
+
+// --------------------------------------------------------------------------
+// TicTacToe::gameOver() - SLOT
+//
+// This slot is activated when the TicTacGameBoard emits the signal
+// "finished()", i.e. when a player has won or when it is a draw.
+//
+
+void TicTacToe::gameOver()
+{
+ newState(); // update text box
+}
+
+
+// --------------------------------------------------------------------------
+// Updates the message to reflect a new state.
+//
+
+void TicTacToe::newState()
+{
+ static const char *msg[] = { // TicTacGameBoard::State texts
+ "Click Play to start", "Make your move",
+ "You won!", "Computer won!", "It's a draw" };
+ message->setText( msg[board->state()] );
+ return;
+}
diff --git a/examples/tictac/tictac.doc b/examples/tictac/tictac.doc
new file mode 100644
index 000000000..05b16fb47
--- /dev/null
+++ b/examples/tictac/tictac.doc
@@ -0,0 +1,33 @@
+/*
+*/
+/*! \page tictac-example.html
+
+ \ingroup examples
+ \title Tic Tac Toe
+
+ This is an implementation of the Tic-tac-toe game.
+
+ We didn't put much effort in making a clever algorithm so it's not a
+ challenge to play against the computer. Instead, study the source code
+ to see how you can make reusable components such as the \e TicTacGameBoard
+ widget.
+
+ <hr>
+
+ Header file:
+
+ \include tictac/tictac.h
+
+ <hr>
+
+ Implementation:
+
+ \include tictac/tictac.cpp
+
+ <hr>
+
+ Main:
+
+ \include tictac/main.cpp
+*/
+
diff --git a/examples/tictac/tictac.h b/examples/tictac/tictac.h
new file mode 100644
index 000000000..876def88d
--- /dev/null
+++ b/examples/tictac/tictac.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef TICTAC_H
+#define TICTAC_H
+
+
+#include <qpushbutton.h>
+#include <qptrvector.h>
+
+class TQComboBox;
+class TQLabel;
+
+
+// --------------------------------------------------------------------------
+// TicTacButton implements a single tic-tac-toe button
+//
+
+class TicTacButton : public TQPushButton
+{
+ Q_OBJECT
+public:
+ TicTacButton( TQWidget *parent );
+ enum Type { Blank, Circle, Cross };
+ Type type() const { return t; }
+ void setType( Type type ) { t = type; repaint(); }
+ TQSizePolicy sizePolicy() const
+ { return TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ); }
+ TQSize sizeHint() const { return TQSize( 32, 32 ); }
+ TQSize minimumSizeHint() const { return TQSize( 10, 10 ); }
+protected:
+ void drawButtonLabel( TQPainter * );
+private:
+ Type t;
+};
+
+// Using template vector to make vector-class of TicTacButton.
+// This vector is used by the TicTacGameBoard class defined below.
+
+typedef TQPtrVector<TicTacButton> TicTacButtons;
+typedef TQMemArray<int> TicTacArray;
+
+
+// --------------------------------------------------------------------------
+// TicTacGameBoard implements the tic-tac-toe game board.
+// TicTacGameBoard is a composite widget that contains N x N TicTacButtons.
+// N is specified in the constructor.
+//
+
+class TicTacGameBoard : public TQWidget
+{
+ Q_OBJECT
+public:
+ TicTacGameBoard( int n, TQWidget *parent=0, const char *name=0 );
+ ~TicTacGameBoard();
+ enum State { Init, HumansTurn, HumanWon, ComputerWon, NobodyWon };
+ State state() const { return st; }
+ void computerStarts( bool v );
+ void newGame();
+signals:
+ void finished(); // game finished
+private slots:
+ void buttonClicked();
+private:
+ void setState( State state ) { st = state; }
+ void updateButtons();
+ int checkBoard( TicTacArray * );
+ void computerMove();
+ State st;
+ int nBoard;
+ bool comp_starts;
+ TicTacArray *btArray;
+ TicTacButtons *buttons;
+};
+
+
+// --------------------------------------------------------------------------
+// TicTacToe implements the complete game.
+// TicTacToe is a composite widget that contains a TicTacGameBoard and
+// two push buttons for starting the game and tquitting.
+//
+
+class TicTacToe : public TQWidget
+{
+ Q_OBJECT
+public:
+ TicTacToe( int boardSize=3, TQWidget *parent=0, const char *name=0 );
+private slots:
+ void newGameClicked();
+ void gameOver();
+private:
+ void newState();
+ TQComboBox *whoStarts;
+ TQPushButton *newGame;
+ TQPushButton *tquit;
+ TQLabel *message;
+ TicTacGameBoard *board;
+};
+
+
+#endif // TICTAC_H
diff --git a/examples/tictac/tictac.pro b/examples/tictac/tictac.pro
new file mode 100644
index 000000000..8ce064084
--- /dev/null
+++ b/examples/tictac/tictac.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = tictac
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = tictac.h
+SOURCES = main.cpp \
+ tictac.cpp
diff --git a/examples/tooltip/README b/examples/tooltip/README
new file mode 100644
index 000000000..cdfe50cd2
--- /dev/null
+++ b/examples/tooltip/README
@@ -0,0 +1,8 @@
+The tooltip example demonstrates advanced use of tool tips.
+
+There are dynamic tool tips on the blue rectanges - QToolTip asks
+tooltip whether to display anything, and if so, what. The Right Thing
+happens when you click on the rectangles.
+
+There is also a static tool tip on the red rectangle.
+
diff --git a/examples/tooltip/main.cpp b/examples/tooltip/main.cpp
new file mode 100644
index 000000000..fa02f0e86
--- /dev/null
+++ b/examples/tooltip/main.cpp
@@ -0,0 +1,23 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "tooltip.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+
+ TellMe mw;
+ mw.setCaption( "TQt Example - Dynamic Tool Tips" );
+ a.setMainWidget( &mw );
+ mw.show();
+
+ return a.exec();
+}
diff --git a/examples/tooltip/tooltip.cpp b/examples/tooltip/tooltip.cpp
new file mode 100644
index 000000000..628c4d94f
--- /dev/null
+++ b/examples/tooltip/tooltip.cpp
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "tooltip.h"
+#include <qapplication.h>
+#include <qpainter.h>
+#include <stdlib.h>
+
+
+DynamicTip::DynamicTip( TQWidget * parent )
+ : TQToolTip( parent )
+{
+ // no explicit initialization needed
+}
+
+
+void DynamicTip::maybeTip( const TQPoint &pos )
+{
+ if ( !parentWidget()->inherits( "TellMe" ) )
+ return;
+
+ TQRect r( ((TellMe*)parentWidget())->tip(pos) );
+ if ( !r.isValid() )
+ return;
+
+ TQString s;
+ s.sprintf( "position: %d,%d", r.center().x(), r.center().y() );
+ tip( r, s );
+}
+
+
+TellMe::TellMe( TQWidget * parent , const char * name )
+ : TQWidget( parent, name )
+{
+ setMinimumSize( 30, 30 );
+ r1 = randomRect();
+ r2 = randomRect();
+ r3 = randomRect();
+
+ t = new DynamicTip( this );
+
+ TQToolTip::add( this, r3, "this color is called red" ); // <- helpful
+}
+
+
+TellMe::~TellMe()
+{
+ delete t;
+ t = 0;
+}
+
+
+void TellMe::paintEvent( TQPaintEvent * e )
+{
+ TQPainter p( this );
+
+ // I try to be efficient here, and repaint only what's needed
+
+ if ( e->rect().intersects( r1 ) ) {
+ p.setBrush( blue );
+ p.drawRect( r1 );
+ }
+
+ if ( e->rect().intersects( r2 ) ) {
+ p.setBrush( blue );
+ p.drawRect( r2 );
+ }
+
+ if ( e->rect().intersects( r3 ) ) {
+ p.setBrush( red );
+ p.drawRect( r3 );
+ }
+}
+
+
+void TellMe::mousePressEvent( TQMouseEvent * e )
+{
+ if ( r1.contains( e->pos() ) )
+ r1 = randomRect();
+ if ( r2.contains( e->pos() ) )
+ r2 = randomRect();
+ repaint();
+}
+
+
+void TellMe::resizeEvent( TQResizeEvent * )
+{
+ if ( !rect().contains( r1 ) )
+ r1 = randomRect();
+ if ( !rect().contains( r2 ) )
+ r2 = randomRect();
+}
+
+
+TQRect TellMe::randomRect()
+{
+ return TQRect( ::rand() % (width() - 20), ::rand() % (height() - 20),
+ 20, 20 );
+}
+
+
+TQRect TellMe::tip( const TQPoint & p )
+{
+ if ( r1.contains( p ) )
+ return r1;
+ else if ( r2.contains( p ) )
+ return r2;
+ else
+ return TQRect( 0,0, -1,-1 );
+}
diff --git a/examples/tooltip/tooltip.doc b/examples/tooltip/tooltip.doc
new file mode 100644
index 000000000..41800ff07
--- /dev/null
+++ b/examples/tooltip/tooltip.doc
@@ -0,0 +1,33 @@
+/*
+*/
+/*! \page tooltip-example.html
+
+ \ingroup examples
+ \title Advanced use of tool tips
+
+ This example widget demonstrates how to use tool tips for static and
+ dynamic regions within a widget.
+
+ It displays two blue and one red rectangle. The blue ones move every
+ time you click on them, the red one is static. There are dynamic
+ tool tips on the blue rectangles and a static tool tip on the red one.
+
+ <hr>
+
+ Header file:
+
+ \include tooltip/tooltip.h
+
+ <hr>
+
+ Implementation:
+
+ \include tooltip/tooltip.cpp
+
+ <hr>
+
+ Main:
+
+ \include tooltip/main.cpp
+*/
+
diff --git a/examples/tooltip/tooltip.h b/examples/tooltip/tooltip.h
new file mode 100644
index 000000000..c9d26d9ac
--- /dev/null
+++ b/examples/tooltip/tooltip.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qwidget.h>
+#include <qtooltip.h>
+
+
+class DynamicTip : public TQToolTip
+{
+public:
+ DynamicTip( TQWidget * parent );
+
+protected:
+ void maybeTip( const TQPoint & );
+};
+
+
+class TellMe : public TQWidget
+{
+ Q_OBJECT
+public:
+ TellMe( TQWidget * parent = 0, const char * name = 0 );
+ ~TellMe();
+
+ TQRect tip( const TQPoint & );
+
+protected:
+ void paintEvent( TQPaintEvent * );
+ void mousePressEvent( TQMouseEvent * );
+ void resizeEvent( TQResizeEvent * );
+
+private:
+ TQRect randomRect();
+
+ TQRect r1, r2, r3;
+ DynamicTip * t;
+};
diff --git a/examples/tooltip/tooltip.pro b/examples/tooltip/tooltip.pro
new file mode 100644
index 000000000..d0c2fdb47
--- /dev/null
+++ b/examples/tooltip/tooltip.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = tooltip
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = large-config
+
+HEADERS = tooltip.h
+SOURCES = main.cpp \
+ tooltip.cpp
diff --git a/examples/toplevel/main.cpp b/examples/toplevel/main.cpp
new file mode 100644
index 000000000..1987a3f52
--- /dev/null
+++ b/examples/toplevel/main.cpp
@@ -0,0 +1,9 @@
+#include <qapplication.h>
+#include "options.h"
+
+int main( int argc, char ** argv )
+{
+ TQApplication a( argc, argv );
+ OptionsDialog dlg;
+ return dlg.exec();
+}
diff --git a/examples/toplevel/options.ui b/examples/toplevel/options.ui
new file mode 100644
index 000000000..04641a5c3
--- /dev/null
+++ b/examples/toplevel/options.ui
@@ -0,0 +1,587 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>OptionsDialog</class>
+<widget class="TQDialog">
+ <property name="name">
+ <cstring>OptionsDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>371</width>
+ <height>482</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Select Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQButtonGroup">
+ <property name="name">
+ <cstring>bgBorder</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Border</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select different types of borders, or turn the border off. Windows without a border are ignored by the window manager.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQRadioButton">
+ <property name="name">
+ <cstring>rbBorderNormal</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Normal</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A normal border</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Gives the window a normal, resizable border. The window should have a layout installed to handle the resizing gracefully.</string>
+ </property>
+ </widget>
+ <widget class="TQRadioButton">
+ <property name="name">
+ <cstring>rbBorderDialog</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Dialog</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A thin dialog border</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Gives the window a thin dialog border. Depending on the window manager the window will not be resizable. Use TQWidget::setFixedSize() in addition to enforce a static size on all systems.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="TQButtonGroup">
+ <property name="name">
+ <cstring>bgTitle</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Titlebar</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select different controls you want to see in the titlebar, or turn the titlebar off. Popup windows should not have a titlebar.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbTitleSystem</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;ystem Menu</string>
+ </property>
+ <property name="accel">
+ <string>Alt+Y</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A window system menu.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Adds a window system menu. Many window managers retquire a system menu to be able to provide minimize or maximize controls. A system menu implies a close button.</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbTitleMinimize</cstring>
+ </property>
+ <property name="text">
+ <string>Minimi&amp;ze</string>
+ </property>
+ <property name="accel">
+ <string>Alt+Z</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A minimize button</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Adds a minimze button. This option retquires a system menu on many window managers.</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbTitleMaximize</cstring>
+ </property>
+ <property name="text">
+ <string>Ma&amp;ximize</string>
+ </property>
+ <property name="accel">
+ <string>Alt+X</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A maximize button</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Adds a maximze button. This option retquires a system menu on many window managers.</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbTitleContext</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;What's This</string>
+ </property>
+ <property name="accel">
+ <string>Alt+W</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A context help button</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Adds a context help button. This option retquires a system menu on many window managers, and often doesn't work together with minimize and maximize buttons.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQButtonGroup">
+ <property name="name">
+ <cstring>bgBehavior</cstring>
+ </property>
+ <property name="title">
+ <string>Behavior</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select different behaviors of the window in runtime.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbBehaviorTaskbar</cstring>
+ </property>
+ <property name="text">
+ <string>Taskbar &amp;Entry</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Entry in the taskbar</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Gives the window a separate task bar entry.</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbBehaviorStays</cstring>
+ </property>
+ <property name="text">
+ <string>Stays on T&amp;op</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Stay on top of the desktop</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Informs the window system that the window should stay on top of all other windows, including windows from other applications. This is not supported on all X11 window managers.</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbBehaviorPopup</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Popup</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A popup window</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates that this widget is a popup window. Popup windows are modal, but close automatically when the mouse is clicked.</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbBehaviorTool</cstring>
+ </property>
+ <property name="text">
+ <string>Too&amp;l</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A tool window</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Makes the window a tool window. Tool windows often have a smaller titlebar and decoration, and don't activate automtically when displayed. Tool windows often cannot have their own taskbar entry.</string>
+ </property>
+ </widget>
+ <widget class="TQCheckBox">
+ <property name="name">
+ <cstring>cbBehaviorModal</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Modal</string>
+ </property>
+ <property name="accel">
+ <string>Alt+M</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Show modal</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The window is modal for the application, e.g. input for other windows are blocked by this window.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQGroupBox">
+ <property name="name">
+ <cstring>gbProperties</cstring>
+ </property>
+ <property name="title">
+ <string>Properties</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Set other properties of the window.</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>leCaption</cstring>
+ </property>
+ <property name="text">
+ <string>Caption</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Window caption</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The caption of the window.</string>
+ </property>
+ </widget>
+ <widget class="TQLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TQLineEdit">
+ <property name="name">
+ <cstring>leIcon</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Icon file</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Provide an image file.</string>
+ </property>
+ </widget>
+ <widget class="TQToolButton">
+ <property name="name">
+ <cstring>tbPick</cstring>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Pick an icon</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an image file.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="TQSlider" row="2" column="1">
+ <property name="name">
+ <cstring>slTransparency</cstring>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="pageStep">
+ <number>10</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Below</enum>
+ </property>
+ <property name="tickInterval">
+ <number>10</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Window transparency</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Set the transparency of the window.
+A high value gives a high window transparency, e.g. it is less visible.
+
+Note that this attribute is not supported on many windowing systems and will have no effect.</string>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Transp&amp;arency:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>slTransparency</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Icon:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leIcon</cstring>
+ </property>
+ </widget>
+ <widget class="TQLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Caption:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leCaption</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </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>70</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>pbApply</cstring>
+ </property>
+ <property name="text">
+ <string>Apply</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Creates a new window with the selected flags, or modifies the visible window.</string>
+ </property>
+ </widget>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>pbClose</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Closes this dialog and exits the application.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>pbClose</sender>
+ <signal>clicked()</signal>
+ <receiver>OptionsDialog</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>pbApply</sender>
+ <signal>clicked()</signal>
+ <receiver>OptionsDialog</receiver>
+ <slot>apply()</slot>
+ </connection>
+ <connection>
+ <sender>bgBorder</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bgTitle</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbTitleSystem</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cbTitleMinimize</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbTitleSystem</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cbTitleMaximize</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbTitleSystem</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cbTitleContext</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>bgTitle</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>cbBehaviorPopup</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cbBehaviorPopup</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>bgTitle</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>tbPick</sender>
+ <signal>clicked()</signal>
+ <receiver>OptionsDialog</receiver>
+ <slot>pickIcon()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">qguardedptr.h</include>
+ <include location="global" impldecl="in declaration">qvbox.h</include>
+ <include location="global" impldecl="in implementation">qfiledialog.h</include>
+</includes>
+<variables>
+ <variable access="private">TQGuardedPtr&lt;TQVBox&gt; widget;</variable>
+</variables>
+<slots>
+ <slot>apply()</slot>
+ <slot access="protected">pickIcon()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/examples/toplevel/options.ui.h b/examples/toplevel/options.ui.h
new file mode 100644
index 000000000..210c25150
--- /dev/null
+++ b/examples/toplevel/options.ui.h
@@ -0,0 +1,98 @@
+void OptionsDialog::apply()
+{
+ TQStringList flagList;
+ bool wstyle = false;
+ WFlags f = WDestructiveClose | WType_TopLevel | WStyle_Customize;
+
+ if ( bgBorder->isChecked() ) {
+ if ( rbBorderNormal->isChecked() ) {
+ f |= WStyle_NormalBorder;
+ flagList += "WStyle_NormalBorder";
+ wstyle = true;
+ }
+ else if ( rbBorderDialog->isChecked() ) {
+ f |= WStyle_DialogBorder;
+ flagList += "WStyle_DialogBorder";
+ wstyle = true;
+ }
+
+ if ( bgTitle->isChecked() ) {
+ f |= WStyle_Title;
+ flagList += "WStyle_Title";
+ wstyle = true;
+ if ( cbTitleSystem->isChecked() ) {
+ f |= WStyle_SysMenu;
+ flagList += "WStyle_SysMenu";
+ }
+ if ( cbTitleMinimize->isChecked() ) {
+ f |= WStyle_Minimize;
+ flagList += "WStyle_Minimize";
+ }
+ if ( cbTitleMaximize->isChecked() ) {
+ f |= WStyle_Maximize;
+ flagList += "WStyle_Maximize";
+ }
+ if ( cbTitleContext->isChecked() ) {
+ f |= WStyle_ContextHelp;
+ flagList += "WStyle_ContextHelp";
+ }
+ }
+ } else {
+ f |= WStyle_NoBorder;
+ flagList += "WStyle_NoBorder";
+ wstyle = true;
+ }
+
+ TQWidget *parent = this;
+ if ( cbBehaviorTaskbar->isChecked() ) {
+ parent = 0;
+ f |= WGroupLeader;
+ flagList += "WGroupLeader";
+ }
+ if ( cbBehaviorStays->isChecked() ) {
+ f |= WStyle_StaysOnTop /*| WX11BypassWM*/;
+ flagList += "WStyle_StaysOnTop";
+ wstyle = true;
+ }
+ if ( cbBehaviorPopup->isChecked() ) {
+ f |= WType_Popup;
+ flagList += "WType_Popup";
+ }
+ if ( cbBehaviorModal->isChecked() ) {
+ f |= WShowModal;
+ flagList += "WShowModal";
+ }
+ if ( cbBehaviorTool->isChecked() ) {
+ f |= WStyle_Tool;
+ flagList += "WStyle_Tool";
+ wstyle = true;
+ }
+
+ if (wstyle)
+ flagList.push_front("WStyle_Customize");
+
+ if ( !widget ) {
+ widget = new TQVBox( parent, 0, f );
+ widget->setMargin( 20 );
+ TQLabel *label = new TQLabel(flagList.join("&nbsp;| "), widget);
+ label->setTextFormat(RichText);
+ label->setAlignment(WordBreak);
+ TQPushButton *okButton = new TQPushButton( "Close", widget );
+ connect( okButton, SIGNAL(clicked()), widget, SLOT(close()) );
+ widget->move( pos() );
+ } else {
+ widget->reparent( parent, f, widget->geometry().topLeft(), FALSE);
+ }
+
+ widget->setCaption( leCaption->text() );
+ widget->setIcon( leIcon->text() );
+ widget->setWindowOpacity(double(slTransparency->maxValue() - slTransparency->value()) / 100);
+
+ widget->show();
+}
+
+void OptionsDialog::pickIcon()
+{
+ TQString filename = TQFileDialog::getOpenFileName( TQString::null, TQString::null, this );
+ leIcon->setText( filename );
+}
diff --git a/examples/toplevel/toplevel.doc b/examples/toplevel/toplevel.doc
new file mode 100644
index 000000000..0dd1a0d31
--- /dev/null
+++ b/examples/toplevel/toplevel.doc
@@ -0,0 +1,132 @@
+/*!
+ \page toplevel-example.html
+
+ \ingroup examples
+ \title Toplevel Widgets
+
+ This example demonstrates the use of Qt's widget flags to provide
+ toplevel widgets with customized window decorations.
+
+ It provides a graphical user interface for selecting different
+ options for widget decoration and behavior, and passes the
+ appropriate widget flags to the QWidget constructor.
+ QWidget::reparent() is used to change the widget flags at runtime.
+
+ \warning Note that the interpretation and functionality of the
+ widget flags depends on the window manager used when running the
+ application. Many window managers do not support every possible flag
+ combination.
+
+ The user interface providing the different options was created using
+ \link designer-manual.book Qt Designer\endlink. The different
+ options are explained in the user interface through the use of
+ tooltips and What's This help. Load the \c options.ui file into
+ \link designer-manual.book Qt Designer\endlink for more details.
+
+ \quotefile toplevel/main.cpp
+ \printuntil }
+
+ The main function creates and displays the dialog for the user
+ interface. Note that this dialog is modal.
+
+ The code relevant for this example is in the \c options.ui.h
+ file.
+
+ \quotefile toplevel/options.ui.h
+ \printuntil WFlags
+
+ The \c apply() slot declares the widget flag variable \c f
+ and initializes it with the values
+ \list
+ \i \c WDestructiveClose - the widget will be automatically
+ destroyed when it is closed,
+ \i \c WType_TopLevel - the widget will be top level even if it
+ has a parent widget, and
+ \i \c WStyle_Customize - the flags override the default values
+ \endlist
+ Other flags are used depending on the options selected in the user
+ interface.
+
+ \printto bgTitle->isChecked()
+ The window gets a normal or dialog border depending on the selected
+ option.
+
+ \printto else
+ A titlebar with controls is provided if the appropriate options
+ have been checked.
+
+ \printto QWidget *parent
+ If the window should not have a border it cannot have a titlebar.
+ Widgets that provide their own (e.g. themed) window decoration
+ should use this flag.
+
+ \printto cbBehaviorStays
+ If a toplevel widget has a parent it will not have a taskbar
+ entry, and on most window managers it will always stay on
+ top of the parent widget. This is the standard behavior for
+ dialog boxes, especially if they are modeless, and for other
+ secondary toplevel widgets.
+
+ To provide a taskbar entry the widget must have no parent,
+ in which case we need to use the \c WGroupLeader flag to
+ prevent blocking through the modal main dialog. Applications
+ that can have multiple toplevel windows open simultaneously
+ should use this combination.
+
+ \printto cbBehaviorPopup
+ A toplevel widget can stay on top of the whole desktop if the
+ window manager supports this functionality.
+ \footnote Unfortunately some X11 window managers also retquire the \c
+ WX11BypassWM flag to be set in addition; but some other X11 window
+ managers will have problems if this flag is set. \endfootnote
+
+ Widgets that display important or realtime information (i.e. IRC
+ clients) might benefit from using that flag.
+
+ \printto cbBehaviorModal
+ A popup widget is a short lived modal widget that closes
+ automatically. Popup menus are a typical example for such widgets.
+
+ \printto cbBehaviorTool
+ A modal widget blocks input to other toplevel widgets, unless
+ those are in a different modal group (see \c WGroupLeader).
+ Dialogs are often modal, and the QDialog class provides an easy API
+ to create and display them without the need to explicitly use this
+ flag.
+
+ \printto !widget
+ A tool window will never have a task bar entry (even if it
+ has no parent widget), and often has a smaller window
+ decoration. Tool windows are frequently used instead of
+ modeless dialogs.
+
+ \printto else
+ The widget is created if it has not been created yet, or if it was
+ closed (since we use the \c WDestructiveClose flag). Note that the
+ window is not visible yet.
+ \footnote The example uses QGuardedPtr to make sure that the
+ pointer is reset to zero when the widget object is destroyed
+ due to the \c WDestructiveClose flag. \endfootnote
+
+ \printto setCaption
+ If the widget has already been created the reparent() function is
+ used to modify the widget's flags. The widget's geometry is not
+ changed, and the window is not shown again.
+
+ \printuntil show()
+ Finally the higher level properties such as the window's caption and
+ icon are set. The window transparency is set according to the slider
+ value. Note that this will only have effect on systems that support
+ this attribute for toplevel window.
+
+ \printuntil }
+ Finally the window is shown with the new attributes.
+
+ To build the example go to the toplevel directory
+ (\c QTDIR/examples/toplevel)
+ \footnote
+ We use \c QTDIR to stand for the directory where Qt is installed.
+ \endfootnote
+ and run \c qmake to generate the makefile, then use the make tool to
+ build the library.
+*/
diff --git a/examples/toplevel/toplevel.pro b/examples/toplevel/toplevel.pro
new file mode 100644
index 000000000..aad16cada
--- /dev/null
+++ b/examples/toplevel/toplevel.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release
+unix {
+ UI_DIR = .ui
+ MOC_DIR = .moc
+ OBJECTS_DIR = .obj
+}
+
+REQUIRES = full-config
+
+SOURCES += main.cpp
+FORMS = options.ui
diff --git a/examples/tux/tux.cpp b/examples/tux/tux.cpp
new file mode 100644
index 000000000..e0d482b79
--- /dev/null
+++ b/examples/tux/tux.cpp
@@ -0,0 +1,71 @@
+#include <qapplication.h>
+#include <qwidget.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qbitmap.h>
+#include <qfile.h>
+
+#include <stdlib.h>
+
+class MoveMe : public TQWidget
+{
+public:
+ MoveMe( TQWidget *parent=0, const char *name=0, WFlags f = 0)
+ :TQWidget(parent,name, f) {}
+
+protected:
+ void mousePressEvent( TQMouseEvent *);
+ void mouseMoveEvent( TQMouseEvent *);
+private:
+ TQPoint clickPos;
+};
+
+void MoveMe::mousePressEvent( TQMouseEvent *e )
+{
+ clickPos = e->pos();
+}
+
+void MoveMe::mouseMoveEvent( TQMouseEvent *e )
+{
+ move( e->globalPos() - clickPos );
+}
+
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ TQString fn="tux.png";
+
+ if ( argc >= 2 )
+ fn = argv[1];
+
+ if ( ! TQFile::exists( fn ) )
+ exit( 1 );
+
+ TQImage img( fn );
+ TQPixmap p;
+ p.convertFromImage( img );
+ if ( !p.mask() )
+ if ( img.hasAlphaBuffer() ) {
+ TQBitmap bm;
+ bm = img.createAlphaMask();
+ p.setMask( bm );
+ } else {
+ TQBitmap bm;
+ bm = img.createHeuristicMask();
+ p.setMask( bm );
+ }
+ MoveMe w(0,0,TQt::WStyle_Customize|TQt::WStyle_NoBorder);
+ w.setBackgroundPixmap( p );
+ w.setFixedSize( p.size() );
+ if ( p.mask() )
+ w.setMask( *p.mask() );
+ w.show();
+ a.setMainWidget(&w);
+
+
+ return a.exec();
+
+}
diff --git a/examples/tux/tux.png b/examples/tux/tux.png
new file mode 100644
index 000000000..384f5bb3c
--- /dev/null
+++ b/examples/tux/tux.png
Binary files differ
diff --git a/examples/tux/tux.pro b/examples/tux/tux.pro
new file mode 100644
index 000000000..26842eb96
--- /dev/null
+++ b/examples/tux/tux.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = tux
+
+CONFIG += qt warn_on release
+
+REQUIRES = small-config
+
+HEADERS =
+SOURCES = tux.cpp
+INTERFACES =
diff --git a/examples/widgets/README b/examples/widgets/README
new file mode 100644
index 000000000..a6c031b4b
--- /dev/null
+++ b/examples/widgets/README
@@ -0,0 +1 @@
+Click the right mouse button + CTRL to identify a widget.
diff --git a/examples/widgets/main.cpp b/examples/widgets/main.cpp
new file mode 100644
index 000000000..a88dab434
--- /dev/null
+++ b/examples/widgets/main.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include <qstylefactory.h>
+#include "widgets.h"
+
+class MyWidgetView : public WidgetView
+{
+ int s;
+public:
+ MyWidgetView( TQWidget *parent=0, const char *name=0 )
+ :WidgetView(parent, name), s(0)
+ {
+ setToolBarsMovable( TRUE );
+ }
+
+ void button1Clicked()
+ {
+ TQStringList styles = TQStyleFactory::keys();
+
+ s = (++s)%styles.count();
+ qApp->setStyle( styles[ s] );
+ WidgetView::button1Clicked();
+ }
+};
+
+
+//
+// Create and display our WidgetView.
+//
+
+int main( int argc, char **argv )
+{
+ TQApplication::setColorSpec( TQApplication::CustomColor );
+ TQApplication a( argc, argv );
+
+ MyWidgetView* w = new MyWidgetView;
+ a.setMainWidget( w );
+
+ w->show();
+ int res = a.exec();
+ delete w;
+ return res;
+}
diff --git a/examples/widgets/qt.png b/examples/widgets/qt.png
new file mode 100644
index 000000000..b3c4fa8fc
--- /dev/null
+++ b/examples/widgets/qt.png
Binary files differ
diff --git a/examples/widgets/trolltech.gif b/examples/widgets/trolltech.gif
new file mode 100644
index 000000000..f674369ef
--- /dev/null
+++ b/examples/widgets/trolltech.gif
Binary files differ
diff --git a/examples/widgets/tt-logo.png b/examples/widgets/tt-logo.png
new file mode 100644
index 000000000..786b3e578
--- /dev/null
+++ b/examples/widgets/tt-logo.png
Binary files differ
diff --git a/examples/widgets/widgets.cpp b/examples/widgets/widgets.cpp
new file mode 100644
index 000000000..10ce7ece0
--- /dev/null
+++ b/examples/widgets/widgets.cpp
@@ -0,0 +1,751 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qmessagebox.h>
+#include <qpixmap.h>
+#include <qlayout.h>
+#include <qapplication.h>
+
+// Standard TQt widgets
+
+#include <qtoolbar.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlcdnumber.h>
+#include <qmultilineedit.h>
+#include <qlineedit.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qslider.h>
+#include <qtooltip.h>
+#include <qspinbox.h>
+#include <qstatusbar.h>
+#include <qwhatsthis.h>
+#include <qtoolbutton.h>
+#include <qvbox.h>
+#include <qtabbar.h>
+#include <qtabwidget.h>
+#include <qwidgetstack.h>
+#include <qprogressbar.h>
+#include <qsplitter.h>
+#include <qlistview.h>
+#include <qheader.h>
+#include <qtextbrowser.h>
+#include <qfiledialog.h>
+#include <qaccel.h>
+#include <qmetaobject.h>
+#include <qpainter.h>
+
+#include "widgets.h"
+
+
+// Some sample widgets
+
+#include "../aclock/aclock.h"
+#include "../dclock/dclock.h"
+
+
+#define MOVIEFILENAME "trolltech.gif"
+
+#include "../application/fileopen.xpm"
+#include "../application/filesave.xpm"
+#include "../application/fileprint.xpm"
+
+
+class MyWhatsThis : public TQWhatsThis
+{
+public:
+ MyWhatsThis( TQListBox* lb)
+ : TQWhatsThis( lb ) { listbox = lb; };
+ ~MyWhatsThis(){};
+
+
+ TQString text( const TQPoint & p) {
+ TQListBoxItem* i = listbox->itemAt( p );
+ if ( i && i->pixmap() ) {
+ return "Isn't that a <em>wonderful</em> pixmap? <br>" \
+ "Imagine, you could even decorate a" \
+ " <b>red</b> pushbutton with it! :-)";
+ }
+ return "This is a TQListBox.";
+ }
+
+private:
+ TQListBox* listbox;
+};
+
+
+class MyMenuItem : public TQCustomMenuItem
+{
+public:
+ MyMenuItem( const TQString& s, const TQFont& f )
+ : string( s ), font( f ){};
+ ~MyMenuItem(){}
+
+ void paint( TQPainter* p, const TQColorGroup& /*cg*/, bool /*act*/,
+ bool /*enabled*/, int x, int y, int w, int h )
+ {
+ p->setFont ( font );
+ p->drawText( x, y, w, h,
+ AlignAuto | AlignVCenter | ShowPrefix | DontClip,
+ string );
+ }
+
+ TQSize sizeHint()
+ {
+ return TQFontMetrics( font ).size( AlignAuto | AlignVCenter |
+ ShowPrefix | DontClip, string );
+ }
+private:
+ TQString string;
+ TQFont font;
+};
+
+//
+// Construct the WidgetView with children
+//
+
+WidgetView::WidgetView( TQWidget *parent, const char *name )
+ : TQMainWindow( parent, name )
+{
+ TQColor col;
+
+ // Set the window caption/title
+ setCaption( "TQt Example - Widgets Demo Application" );
+
+ // create a toolbar
+ TQToolBar *tools = new TQToolBar( this, "toolbar" );
+
+ // put something in it
+ TQPixmap openIcon( fileopen );
+ TQToolButton * toolb = new TQToolButton( openIcon, "toolbutton 1",
+ TQString::null, this, SLOT(open()),
+ tools, "open file" );
+ TQWhatsThis::add( toolb, "This is a <b>TQToolButton</b>. It lives in a "
+ "TQToolBar. This particular button doesn't do anything "
+ "useful." );
+
+ TQPixmap saveIcon( filesave );
+ toolb = new TQToolButton( saveIcon, "toolbutton 2", TQString::null,
+ this, SLOT(dummy()),
+ tools, "save file" );
+ TQWhatsThis::add( toolb, "This is also a <b>TQToolButton</b>." );
+
+ TQPixmap printIcon( fileprint );
+ toolb = new TQToolButton( printIcon, "toolbutton 3", TQString::null,
+ this, SLOT(dummy()),
+ tools, "print file" );
+ TQWhatsThis::add( toolb, "This is the third <b>TQToolButton</b>.");
+
+ toolb = TQWhatsThis::whatsThisButton( tools );
+ TQWhatsThis::add( toolb, "This is a <b>What's This</b> button "
+ "It enables the user to ask for help "
+ "about widgets on the screen.");
+
+ // Install an application-global event filter to catch control+leftbutton
+ qApp->installEventFilter( this );
+
+ //make a central widget to contain the other widgets
+ central = new TQWidget( this );
+ setCentralWidget( central );
+
+ // Create a layout to position the widgets
+ TQHBoxLayout *topLayout = new TQHBoxLayout( central, 10 );
+
+ // Create a grid layout to hold most of the widgets
+ TQGridLayout *grid = new TQGridLayout( 0, 3 ); //3 wide and autodetect number of rows
+ topLayout->addLayout( grid, 1 );
+
+ // Create an easter egg
+ TQToolTip::add( menuBar(), TQRect( 0, 0, 2, 2 ), "easter egg" );
+
+ TQPopupMenu* popup;
+ popup = new TQPopupMenu( this );
+ menuBar()->insertItem( "&File", popup );
+ int id;
+ id = popup->insertItem( "&New" );
+ popup->setItemEnabled( id, FALSE );
+ id = popup->insertItem( openIcon, "&Open...", this, SLOT( open() ) );
+
+ popup->insertSeparator();
+ popup->insertItem( "Quit", qApp, SLOT(tquit()), CTRL+Key_Q );
+
+ textStylePopup = popup = new TQPopupMenu( this );
+ menuBar()->insertItem( "&Edit", popup );
+
+ plainStyleID = id = popup->insertItem( "&Plain" );
+ popup->setAccel( CTRL+Key_T, id );
+
+ popup->insertSeparator();
+ TQFont f = font();
+ f.setBold( TRUE );
+ id = popup->insertItem( new MyMenuItem( "&Bold", f ) );
+ popup->setAccel( CTRL+Key_B, id );
+ f = font();
+ f.setItalic( TRUE );
+ id = popup->insertItem( new MyMenuItem( "&Italic", f ) );
+ popup->setItemChecked( id, TRUE );
+ popup->setAccel( CTRL+Key_I, id );
+ f = font();
+ f.setUnderline( TRUE );
+ id = popup->insertItem( new MyMenuItem( "&Underline", f ) );
+ popup->setAccel( CTRL+Key_U, id );
+ f = font();
+ f.setStrikeOut( TRUE );
+ id = popup->insertItem( new MyMenuItem( "&Strike", f ) );
+ connect( textStylePopup, SIGNAL(activated(int)),
+ this, SLOT(popupSelected(int)) );
+
+ // Create an analog and a digital clock
+ AnalogClock *aclock = new AnalogClock( central );
+ aclock->setAutoMask( TRUE );
+ DigitalClock *dclock = new DigitalClock( central );
+ dclock->setMaximumWidth(200);
+ grid->addWidget( aclock, 0, 2 );
+ grid->addWidget( dclock, 1, 2 );
+
+ // Give the dclock widget a blue palette
+ col.setRgb( 0xaa, 0xbe, 0xff );
+ dclock->setPalette( TQPalette( col ) );
+
+ // make tool tips for both of them
+ TQToolTip::add( aclock, "custom widget: analog clock" );
+ TQToolTip::add( dclock, "custom widget: digital clock" );
+
+ // Create a push button.
+ TQPushButton *pb;
+ pb = new TQPushButton( "&Push button 1", central, "button1" );
+ grid->addWidget( pb, 0, 0, AlignVCenter );
+ connect( pb, SIGNAL(clicked()), SLOT(button1Clicked()) );
+ TQToolTip::add( pb, "push button 1" );
+ TQWhatsThis::add( pb, "This is a <b>TQPushButton</b>.<br>"
+ "Click it and watch...<br>"
+ "The wonders of modern technology.");
+
+ TQPixmap pm;
+ bool pix = pm.load("qt.png");
+ if ( !pix ) {
+ TQMessageBox::information( 0, "TQt Widgets Example",
+ "Could not load the file \"qt.png\", which\n"
+ "contains an icon used...\n\n"
+ "The text \"line 42\" will be substituted.",
+ TQMessageBox::Ok + TQMessageBox::Default );
+ }
+
+ // Create a label containing a TQMovie
+ movie = TQMovie( MOVIEFILENAME );
+ movielabel = new TQLabel( central, "label0" );
+ movie.connectStatus(this, SLOT(movieStatus(int)));
+ movie.connectUpdate(this, SLOT(movieUpdate(const TQRect&)));
+ movielabel->setFrameStyle( TQFrame::Box | TQFrame::Plain );
+ movielabel->setMovie( movie );
+ movielabel->setFixedSize( 128+movielabel->frameWidth()*2,
+ 64+movielabel->frameWidth()*2 );
+ grid->addWidget( movielabel, 0, 1, AlignCenter );
+ TQToolTip::add( movielabel, "movie" );
+ TQWhatsThis::add( movielabel, "This is a <b>TQLabel</b> "
+ "that contains a TQMovie." );
+
+ // Create a group of check boxes
+ bg = new TQButtonGroup( central, "checkGroup" );
+ bg->setTitle( "Check Boxes" );
+ grid->addWidget( bg, 1, 0 );
+
+ // Create a layout for the check boxes
+ TQVBoxLayout *vbox = new TQVBoxLayout(bg, 10);
+
+ vbox->addSpacing( bg->fontMetrics().height() );
+
+ cb[0] = new TQCheckBox( bg );
+ cb[0]->setText( "&Read" );
+ vbox->addWidget( cb[0] );
+ cb[1] = new TQCheckBox( bg );
+ cb[1]->setText( "&Write" );
+ vbox->addWidget( cb[1] );
+ cb[2] = new TQCheckBox( bg );
+ cb[2]->setText( "&Execute" );
+ vbox->addWidget( cb[2] );
+
+ connect( bg, SIGNAL(clicked(int)), SLOT(checkBoxClicked(int)) );
+
+ TQToolTip::add( cb[0], "check box 1" );
+ TQToolTip::add( cb[1], "check box 2" );
+ TQToolTip::add( cb[2], "check box 3" );
+
+ // Create a group of radio buttons
+ TQRadioButton *rb;
+ bg = new TQButtonGroup( central, "radioGroup" );
+ bg->setTitle( "Radio buttons" );
+
+ grid->addWidget( bg, 1, 1 );
+
+ // Create a layout for the radio buttons
+ vbox = new TQVBoxLayout(bg, 10);
+
+ vbox->addSpacing( bg->fontMetrics().height() );
+ rb = new TQRadioButton( bg );
+ rb->setText( "&AM" );
+ rb->setChecked( TRUE );
+ vbox->addWidget(rb);
+ TQToolTip::add( rb, "radio button 1" );
+ rb = new TQRadioButton( bg );
+ rb->setText( "F&M" );
+ vbox->addWidget(rb);
+ TQToolTip::add( rb, "radio button 2" );
+ rb = new TQRadioButton( bg );
+ rb->setText( "&Short Wave" );
+ vbox->addWidget(rb);
+
+ connect( bg, SIGNAL(clicked(int)), SLOT(radioButtonClicked(int)) );
+ TQToolTip::add( rb, "radio button 3" );
+
+ // Create a list box
+ TQListBox *lb = new TQListBox( central, "listBox" );
+ for ( int i=0; i<100; i++ ) { // fill list box
+ TQString str;
+ str.sprintf( "line %d", i );
+ if ( i == 42 && pix )
+ lb->insertItem( pm );
+ else
+ lb->insertItem( str );
+ }
+ grid->addMultiCellWidget( lb, 2, 4, 0, 0 );
+ connect( lb, SIGNAL(selected(int)), SLOT(listBoxItemSelected(int)) );
+ TQToolTip::add( lb, "list box" );
+ (void)new MyWhatsThis( lb );
+
+ vbox = new TQVBoxLayout(8);
+ grid->addLayout( vbox, 2, 1 );
+
+ // Create a slider
+ TQSlider *sb = new TQSlider( 0, 300, 30, 100, TQSlider::Horizontal,
+ central, "Slider" );
+ sb->setTickmarks( TQSlider::Below );
+ sb->setTickInterval( 10 );
+ sb->setFocusPolicy( TQWidget::TabFocus );
+ vbox->addWidget( sb );
+
+ connect( sb, SIGNAL(valueChanged(int)), SLOT(sliderValueChanged(int)) );
+ TQToolTip::add( sb, "slider" );
+ TQWhatsThis::add( sb, "This is a <b>TQSlider</b>. "
+ "The tick marks are optional."
+ " This slider controls the speed of the movie." );
+ // Create a combo box
+ TQComboBox *combo = new TQComboBox( FALSE, central, "comboBox" );
+ combo->insertItem( "darkBlue" );
+ combo->insertItem( "darkRed" );
+ combo->insertItem( "darkGreen" );
+ combo->insertItem( "blue" );
+ combo->insertItem( "red" );
+ vbox->addWidget( combo );
+ connect( combo, SIGNAL(activated(int)),
+ this, SLOT(comboBoxItemActivated(int)) );
+ TQToolTip::add( combo, "read-only combo box" );
+
+ // Create an editable combo box
+ TQComboBox *edCombo = new TQComboBox( TRUE, central, "edComboBox" );
+ TQListBox *edComboLst = new TQListBox(this);
+ edCombo->setListBox(edComboLst);
+ edComboLst->insertItem( "Permutable" );
+ edComboLst->insertItem( "Malleable" );
+ edComboLst->insertItem( "Adaptable" );
+ edComboLst->insertItem( "Alterable" );
+ edComboLst->insertItem( "Inconstant" );
+ vbox->addWidget( edCombo );
+ connect( edCombo, SIGNAL(activated(const TQString&)),
+ this, SLOT(edComboBoxItemActivated(const TQString&)) );
+ TQToolTip::add( edCombo, "editable combo box" );
+
+ edCombo->setAutoCompletion( TRUE );
+
+ vbox = new TQVBoxLayout(8);
+ grid->addLayout( vbox, 2, 2 );
+
+ // Create a spin box
+ TQSpinBox *spin = new TQSpinBox( 0, 10, 1, central, "spin" );
+ spin->setSuffix(" mm");
+ spin->setSpecialValueText( "Auto" );
+ connect( spin, SIGNAL( valueChanged(const TQString&) ),
+ SLOT( spinBoxValueChanged(const TQString&) ) );
+ TQToolTip::add( spin, "spin box" );
+ TQWhatsThis::add( spin, "This is a <b>TQSpinBox</b>. "
+ "You can chose values in a given range "
+ "either by using the arrow buttons "
+ "or by typing them in." );
+ vbox->addWidget( spin );
+
+ vbox->addStretch( 1 );
+
+ // Create a tabwidget that switches between multi line edits
+ tabs = new TQTabWidget( central );
+ //tabs->setTabPosition( TQTabWidget::Bottom );
+ tabs->setMargin( 4 );
+ grid->addMultiCellWidget( tabs, 3, 3, 1, 2 );
+ TQMultiLineEdit *mle = new TQMultiLineEdit( tabs, "multiLineEdit" );
+ edit = mle;
+ mle->setWordWrap( TQMultiLineEdit::WidgetWidth );
+ mle->setText("This is a TQMultiLineEdit widget, "
+ "useful for small multi-line "
+ "input fields.");
+ TQToolTip::add( mle, "multi line editor" );
+
+ tabs->addTab( mle, "F&irst");
+
+ mle = new TQMultiLineEdit( tabs, "multiLineEdit" );
+ TQString mleText = "This is another TQMultiLineEdit widget.";
+#if 1
+ mleText += "\n";
+ mleText += "Japanese: ";
+ mleText += TQChar((ushort)0x6a38); // Kanji
+ mleText += "\n";
+ mleText += "Russian: ";
+ mleText += TQChar((ushort)0x042e); // Cyrillic
+ mleText += "\n";
+ mleText += "Norwegian: ";
+ mleText += TQChar((ushort)0x00d8); // Norwegian
+ mleText += "\n";
+ mleText += "Unicode (black square): ";
+ mleText += TQChar((ushort)0x25A0); // BLACK STQUARE
+ mleText += "\n";
+#endif
+ mle->setText( mleText );
+ TQToolTip::add( mle, "second multi line editor" );
+ tabs->addTab( mle, "Se&cond");
+
+
+ // Create a single line edit
+ TQLineEdit *le = new TQLineEdit( central, "lineEdit" );
+
+
+ grid->addMultiCellWidget( le, 4, 4, 1, 2 );
+ connect( le, SIGNAL(textChanged(const TQString&)),
+ SLOT(lineEditTextChanged(const TQString&)) );
+ TQToolTip::add( le, "single line editor" );
+ TQWhatsThis::add( le, "This is a <b>TQLineEdit</b>, you can enter a "
+ "single line of text in it. "
+ "It also it accepts text drops." );
+
+ grid->setRowStretch(0,0);
+ grid->setRowStretch(1,0);
+ grid->setRowStretch(2,0);
+ grid->setRowStretch(3,1);
+ grid->setRowStretch(4,0);
+
+ grid->setColStretch(0,1);
+ grid->setColStretch(1,1);
+ grid->setColStretch(2,1);
+
+
+ TQSplitter *split = new TQSplitter( Vertical, central, "splitter" );
+ split->setOpaqueResize( TRUE );
+ topLayout->addWidget( split, 1 );
+ TQListView *lv = new MyListView( split );
+ connect(lv, SIGNAL(selectionChanged() ),
+ this, SLOT( selectionChanged() ) );
+ connect(lv, SIGNAL(selectionChanged(TQListViewItem*) ),
+ this, SLOT( selectionChanged(TQListViewItem*) ) );
+ connect(lv, SIGNAL(clicked(TQListViewItem*) ),
+ this, SLOT( clicked(TQListViewItem*) ) );
+ connect(lv, SIGNAL(mySelectionChanged(TQListViewItem*) ),
+ this, SLOT( mySelectionChanged(TQListViewItem*) ) );
+ lv->addColumn( "One" );
+ lv->addColumn( "Two" );
+ lv->setAllColumnsShowFocus( TRUE );
+
+ TQListViewItem *lvi= new TQListViewItem( lv, "Text", "Text" );
+ lvi= new TQListViewItem( lv, "Text", "Other Text" );
+ lvi= new TQListViewItem( lv, "Text", "More Text" );
+ lvi= new TQListViewItem( lv, "Text", "Extra Text" );
+ lvi->setOpen(TRUE);
+ (void)new TQListViewItem( lvi, "SubText", "Additional Text" );
+ lvi= new TQListViewItem( lvi, "SubText", "Side Text" );
+ lvi= new TQListViewItem( lvi, "SubSubText", "Complimentary Text" );
+
+ TQToolTip::add( lv, "list view" );
+ TQWhatsThis::add( lv, "This is a <b>TQListView</b>, you can display lists "
+ "(or outline lists) of multiple-column data in it." );
+
+ lv = new TQListView( split );
+ lv->addColumn( "Choices" );
+ (void) new TQCheckListItem( lv, "Onion", TQCheckListItem::CheckBox );
+ (void) new TQCheckListItem( lv, "Artichoke", TQCheckListItem::CheckBox );
+ (void) new TQCheckListItem( lv, "Pepper", TQCheckListItem::CheckBox );
+ (void) new TQCheckListItem( lv, "Habaneros", TQCheckListItem::CheckBox );
+ (void) new TQCheckListItem( lv, "Pineapple", TQCheckListItem::CheckBox );
+ (void) new TQCheckListItem( lv, "Ham", TQCheckListItem::CheckBox );
+ (void) new TQCheckListItem( lv, "Pepperoni", TQCheckListItem::CheckBox );
+ (void) new TQCheckListItem( lv, "Garlic", TQCheckListItem::CheckBox );
+
+
+ TQCheckListItem *lit = new TQCheckListItem( lv, "Cheese" );
+ lit->setOpen( TRUE );
+ (void) new TQCheckListItem( lit, "Cheddar", TQCheckListItem::RadioButton );
+ (void) new TQCheckListItem( lit, "Mozarella", TQCheckListItem::RadioButton );
+ (void) new TQCheckListItem( lit, "Jarlsberg", TQCheckListItem::RadioButton );
+
+ TQToolTip::add( lv, "list view" );
+ TQWhatsThis::add( lv, "This is also a <b>TQListView</b>, with "
+ "interactive items." );
+
+ TQTextBrowser *browser = new TQTextBrowser( split );
+ browser->setText( "<h1>TQTextBrowser</h1>"
+ "<p>TQt supports formatted rich text, such "
+ "as the heading above, <em>emphasized</em> and "
+ "<b>bold</b> text, via an XML subset.</p> "
+ "<p><a href=\"nogo://some.where.com\">Hypertext navigation</a> and style sheets are supported.</p>", "" );
+ browser->setFont(TQFont("Charter",11));
+ browser->setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken );
+ connect( browser, SIGNAL(linkClicked(const TQString&)), browser, SLOT(setText(const TQString&)) );
+
+ // Create an label and a message in the status bar
+ // The message is updated when buttons are clicked etc.
+ msg = new TQLabel( statusBar(), "message" );
+ msg->setAlignment( AlignCenter );
+ TQFont boldfont; boldfont.setWeight(TQFont::Bold);
+ msg->setFont( boldfont );
+ statusBar()->addWidget( msg, 4 );
+ TQToolTip::add( msg, "Message area" );
+
+ TQAccel* a = new TQAccel( this );
+ a->connectItem( a->insertItem( Key_F9 ),
+ this, SLOT( showProperties() ) );
+
+ prog = new TQProgressBar( statusBar(), "progress" );
+ prog->setTotalSteps( 100 );
+ progress = 64;
+ prog->setProgress( progress );
+ statusBar()->addWidget( prog , 1 );
+ TQWhatsThis::add( prog, "This is a <b>TQProgressBar</b> "
+ "You can use it to show that a lengthy "
+ " process is progressing. "
+ "In this program, nothing much seems to happen." );
+ statusBar()->message( "Welcome to TQt", 2000 );
+}
+
+void WidgetView::setStatus(const TQString& text)
+{
+ msg->setText(text);
+}
+
+void WidgetView::button1Clicked()
+{
+ msg->setText( "The push button was clicked" );
+ prog->setProgress( ++progress );
+}
+
+
+void WidgetView::movieUpdate( const TQRect& )
+{
+ // Uncomment this to test animated icons on your window manager
+ //setIcon( movie.framePixmap() );
+}
+
+void WidgetView::movieStatus( int s )
+{
+ switch ( s ) {
+ case TQMovie::SourceEmpty:
+ case TQMovie::UnrecognizedFormat:
+ {
+ TQPixmap pm("tt-logo.png");
+ movielabel->setPixmap(pm);
+ movielabel->setFixedSize(pm.size());
+ }
+ break;
+ default:
+ if ( movielabel->movie() ) // for flicker-free animation:
+ movielabel->setBackgroundMode( NoBackground );
+ }
+}
+
+
+void WidgetView::popupSelected( int selectedId )
+{
+ if ( selectedId == plainStyleID ) {
+ for ( int i = 0; i < int(textStylePopup->count()); i++ ) {
+ int id = textStylePopup->idAt( i );
+ textStylePopup->setItemChecked( id, FALSE);
+ }
+ } else {
+ textStylePopup->setItemChecked( selectedId, TRUE );
+ }
+}
+
+void WidgetView::checkBoxClicked( int id )
+{
+ TQString str;
+ str = tr("Check box %1 clicked : ").arg(id);
+ TQString chk = "---";
+ if ( cb[0]->isChecked() )
+ chk[0] = 'r';
+ if ( cb[1]->isChecked() )
+ chk[1] = 'w';
+ if ( cb[2]->isChecked() )
+ chk[2] = 'x';
+ str += chk;
+ msg->setText( str );
+}
+
+
+void WidgetView::edComboBoxItemActivated( const TQString& text)
+{
+ TQString str = tr("Editable Combo Box set to ");
+ str += text;
+ msg->setText( str );
+}
+
+
+void WidgetView::radioButtonClicked( int id )
+{
+ msg->setText( tr("Radio button #%1 clicked").arg(id) );
+}
+
+
+void WidgetView::listBoxItemSelected( int index )
+{
+ msg->setText( tr("List box item %1 selected").arg(index) );
+}
+
+
+void WidgetView::sliderValueChanged( int value )
+{
+ msg->setText( tr("Movie set to %1% of normal speed").arg(value) );
+ movie.setSpeed( value );
+}
+
+
+void WidgetView::comboBoxItemActivated( int index )
+{
+ msg->setText( tr("Combo box item %1 activated").arg(index) );
+ switch ( index ) {
+ default:
+ case 0:
+ TQApplication::setWinStyleHighlightColor( darkBlue );
+ break;
+ case 1:
+ TQApplication::setWinStyleHighlightColor( darkRed );
+ break;
+ case 2:
+ TQApplication::setWinStyleHighlightColor( darkGreen );
+ break;
+ case 3:
+ TQApplication::setWinStyleHighlightColor( blue );
+ break;
+ case 4:
+ TQApplication::setWinStyleHighlightColor( red );
+ break;
+ }
+}
+
+
+
+void WidgetView::lineEditTextChanged( const TQString& newText )
+{
+ TQString str( "Line edit text: ");
+ str += newText;
+ if ( newText.length() == 1 ) {
+ TQString u;
+ u.sprintf(" (U%02x%02x)", newText[0].row(), newText[0].cell() );
+ str += u;
+ }
+ msg->setText( str );
+}
+
+
+void WidgetView::spinBoxValueChanged( const TQString& valueText )
+{
+ TQString str( "Spin box value: " );
+ str += valueText;
+ msg->setText( str );
+}
+
+//
+// All application events are passed through this event filter.
+// We're using it to display some information about a clicked
+// widget (right mouse button + CTRL).
+//
+
+bool WidgetView::eventFilter( TQObject *obj, TQEvent *event )
+{
+ static bool identify_now = TRUE;
+ if ( event->type() == TQEvent::MouseButtonPress && identify_now ) {
+ TQMouseEvent *e = (TQMouseEvent*)event;
+ if ( e->button() == TQMouseEvent::RightButton &&
+ (e->state() & TQMouseEvent::ControlButton) != 0 ){
+ TQString str = "The clicked widget is a\n";
+ str += obj->className();
+ str += "\nThe widget's name is\n";
+ if ( obj->name() )
+ str += obj->name();
+ else
+ str += "<no name>";
+ identify_now = FALSE; // don't do it in message box
+ TQMessageBox::information( (TQWidget*)obj, "Identify Widget", str );
+ identify_now = TRUE; // allow it again
+ }
+ }
+ return TQMainWindow::eventFilter( obj, event ); // don't eat event
+}
+
+
+void WidgetView::open()
+{
+ TQFileDialog::getOpenFileName( TQString::null, "Textfiles (*.txt)", this );
+}
+
+
+void WidgetView::dummy()
+{
+ TQMessageBox::information( this, "Sorry",
+ "This function is not implemented" );
+}
+
+void WidgetView::selectionChanged()
+{
+ //qDebug("selectionChanged");
+}
+void WidgetView::selectionChanged( TQListViewItem* /*item*/)
+{
+ //qDebug("selectionChanged %p", item );
+}
+
+void WidgetView::clicked( TQListViewItem* /*item*/ )
+{
+ //qDebug("clicked %p", item );
+}
+
+void WidgetView::mySelectionChanged( TQListViewItem* /*item*/ )
+{
+ //qDebug("mySelectionChanged %p", item );
+}
+
+void WidgetView::showProperties()
+{
+ if ( !qApp->focusWidget() )
+ return;
+ TQCString output;
+ output.sprintf( "Properties for class '%s'",
+ qApp->focusWidget()->className() );
+ int i = 0;
+ while( i < (int) qApp->focusWidget()->metaObject()->numProperties( TRUE ) ) {
+ const TQMetaProperty* p
+ = qApp->focusWidget()->metaObject()->property( i, TRUE );
+ TQCString tmp;
+ tmp.sprintf( "\n %2d: %s (read-%s, %s)", ++i, p->name(),
+ p->writable() ? "write" : "only", p->type() );
+ output += tmp;
+ }
+ qDebug( output );
+}
diff --git a/examples/widgets/widgets.doc b/examples/widgets/widgets.doc
new file mode 100644
index 000000000..8bdc6100b
--- /dev/null
+++ b/examples/widgets/widgets.doc
@@ -0,0 +1,15 @@
+/*! \page widgets-example.html
+
+ \ingroup examples
+ \title Widgets Example
+
+ This example shows most of Qt's widgets in action. It is similar
+ to the demo example in \c{$QTDIR/examples/demo}.
+
+ Run the program, then click the right mouse button + Ctrl to
+ identify a widget.
+
+ See \c{$QTDIR/examples/widgets} for the source code.
+
+*/
+
diff --git a/examples/widgets/widgets.h b/examples/widgets/widgets.h
new file mode 100644
index 000000000..628068f87
--- /dev/null
+++ b/examples/widgets/widgets.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Definition of something or other
+**
+** Created : 979899
+**
+** Copyright (C) 1997-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef WIDGETS_H
+#define WIDGETS_H
+
+#include <qmainwindow.h>
+#include <qmovie.h>
+#include <qlistview.h>
+class TQLabel;
+class TQCheckBox;
+class TQProgressBar;
+class TQTabWidget;
+class TQGroupBox;
+class TQMultiLineEdit;
+class TQPopupMenu;
+
+class MyListView : public TQListView
+{
+ Q_OBJECT
+public:
+ MyListView( TQWidget * parent = 0, const char *name = 0 )
+ : TQListView( parent, name ), selected(0)
+ {}
+ ~MyListView()
+ {}
+protected:
+
+ void contentsMousePressEvent( TQMouseEvent * e )
+ {
+ selected = selectedItem();
+ TQListView::contentsMousePressEvent( e );
+ }
+ void contentsMouseReleaseEvent( TQMouseEvent * e )
+ {
+ TQListView::contentsMouseReleaseEvent( e );
+ if ( selectedItem() != selected ) {
+ emit mySelectionChanged( selectedItem() );
+ emit mySelectionChanged();
+ }
+ }
+
+signals:
+ void mySelectionChanged();
+ void mySelectionChanged( TQListViewItem* );
+
+private:
+ TQListViewItem* selected;
+
+};
+//
+// WidgetView contains lots of TQt widgets.
+//
+
+class WidgetView : public TQMainWindow
+{
+ Q_OBJECT
+public:
+ WidgetView( TQWidget *parent=0, const char *name=0 );
+
+public slots:
+ void setStatus(const TQString&);
+ void selectionChanged();
+ void selectionChanged( TQListViewItem* );
+ void clicked( TQListViewItem* );
+ void mySelectionChanged( TQListViewItem* );
+
+protected slots:
+ virtual void button1Clicked();
+private slots:
+ void checkBoxClicked( int );
+ void radioButtonClicked( int );
+ void sliderValueChanged( int );
+ void listBoxItemSelected( int );
+ void comboBoxItemActivated( int );
+ void edComboBoxItemActivated( const TQString& );
+ void lineEditTextChanged( const TQString& );
+ void movieStatus( int );
+ void movieUpdate( const TQRect& );
+ void spinBoxValueChanged( const TQString& );
+ void popupSelected( int );
+
+ void open();
+ void dummy();
+ void showProperties();
+
+private:
+ bool eventFilter( TQObject *, TQEvent * );
+ TQLabel *msg;
+ TQCheckBox *cb[3];
+ TQGroupBox* bg;
+ TQLabel *movielabel;
+ TQMovie movie;
+ TQWidget *central;
+ TQProgressBar *prog;
+ int progress;
+ TQTabWidget* tabs;
+ TQMultiLineEdit* edit;
+ TQPopupMenu *textStylePopup;
+ int plainStyleID;
+ TQWidget* bla;
+};
+
+#endif
diff --git a/examples/widgets/widgets.pro b/examples/widgets/widgets.pro
new file mode 100644
index 000000000..3fde67503
--- /dev/null
+++ b/examples/widgets/widgets.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = widgets
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+INCLUDEPATH += ../aclock ../dclock
+
+REQUIRES = full-config
+
+HEADERS = widgets.h ../aclock/aclock.h ../dclock/dclock.h
+SOURCES = main.cpp widgets.cpp ../aclock/aclock.cpp ../dclock/dclock.cpp
diff --git a/examples/wizard/main.cpp b/examples/wizard/main.cpp
new file mode 100644
index 000000000..b7e4406dc
--- /dev/null
+++ b/examples/wizard/main.cpp
@@ -0,0 +1,20 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "wizard.h"
+#include <qapplication.h>
+
+int main(int argc,char **argv)
+{
+ TQApplication a(argc,argv);
+
+ Wizard wizard;
+ wizard.setCaption("TQt Example - Wizard");
+ return wizard.exec();
+}
diff --git a/examples/wizard/wizard.cpp b/examples/wizard/wizard.cpp
new file mode 100644
index 000000000..9440ab718
--- /dev/null
+++ b/examples/wizard/wizard.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "wizard.h"
+
+#include <qwidget.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qvalidator.h>
+#include <qapplication.h>
+
+Wizard::Wizard( TQWidget *parent, const char *name )
+ : TQWizard( parent, name, TRUE )
+{
+ setupPage1();
+ setupPage2();
+ setupPage3();
+
+ key->setFocus();
+}
+
+void Wizard::setupPage1()
+{
+ page1 = new TQHBox( this );
+ page1->setSpacing(8);
+
+ TQLabel *info = new TQLabel( page1 );
+ info->setMargin( 11 );
+ info->setPalette( yellow );
+ info->setText( "Enter your personal\n"
+ "key here.\n\n"
+ "Your personal key\n"
+ "consists of 4 digits" );
+ info->setMaximumWidth( info->sizeHint().width() );
+
+ TQVBox *page = new TQVBox( page1 );
+
+ TQHBox *row1 = new TQHBox( page );
+
+ (void)new TQLabel( "Key:", row1 );
+
+ key = new TQLineEdit( row1 );
+ key->setMaxLength( 4 );
+ key->setValidator( new TQIntValidator( 1000, 9999, key ) );
+
+ connect( key, SIGNAL( textChanged( const TQString & ) ),
+ this, SLOT( keyChanged( const TQString & ) ) );
+
+ addPage( page1, "Personal Key" );
+
+ setNextEnabled( page1, FALSE );
+ setHelpEnabled( page1, FALSE );
+}
+
+void Wizard::setupPage2()
+{
+ page2 = new TQHBox( this );
+ page2->setSpacing(8);
+
+ TQLabel *info = new TQLabel( page2 );
+ info->setMargin( 11 );
+ info->setPalette( yellow );
+ info->setText( "\n"
+ "Enter your personal\n"
+ "data here.\n\n"
+ "The retquired fields are\n"
+ "First Name, Last Name \n"
+ "and E-Mail.\n" );
+ info->setMaximumWidth( info->sizeHint().width() );
+
+ TQVBox *page = new TQVBox( page2 );
+
+ TQHBox *row1 = new TQHBox( page );
+ TQHBox *row2 = new TQHBox( page );
+ TQHBox *row3 = new TQHBox( page );
+ TQHBox *row4 = new TQHBox( page );
+ TQHBox *row5 = new TQHBox( page );
+
+ TQLabel *label1 = new TQLabel( " First Name: ", row1 );
+ label1->setAlignment( TQt::AlignVCenter );
+ TQLabel *label2 = new TQLabel( " Last Name: ", row2 );
+ label2->setAlignment( TQt::AlignVCenter );
+ TQLabel *label3 = new TQLabel( " Address: ", row3 );
+ label3->setAlignment( TQt::AlignVCenter );
+ TQLabel *label4 = new TQLabel( " Phone Number: ", row4 );
+ label4->setAlignment( TQt::AlignVCenter );
+ TQLabel *label5 = new TQLabel( " E-Mail: ", row5 );
+ label5->setAlignment( TQt::AlignVCenter );
+
+ label1->setMinimumWidth( label4->sizeHint().width() );
+ label2->setMinimumWidth( label4->sizeHint().width() );
+ label3->setMinimumWidth( label4->sizeHint().width() );
+ label4->setMinimumWidth( label4->sizeHint().width() );
+ label5->setMinimumWidth( label4->sizeHint().width() );
+
+ firstName = new TQLineEdit( row1 );
+ lastName = new TQLineEdit( row2 );
+ address = new TQLineEdit( row3 );
+ phone = new TQLineEdit( row4 );
+ email = new TQLineEdit( row5 );
+
+ connect( firstName, SIGNAL( textChanged( const TQString & ) ),
+ this, SLOT( dataChanged( const TQString & ) ) );
+ connect( lastName, SIGNAL( textChanged( const TQString & ) ),
+ this, SLOT( dataChanged( const TQString & ) ) );
+ connect( email, SIGNAL( textChanged( const TQString & ) ),
+ this, SLOT( dataChanged( const TQString & ) ) );
+
+ addPage( page2, "Personal Data" );
+
+ setHelpEnabled( page2, FALSE );
+}
+
+void Wizard::setupPage3()
+{
+ page3 = new TQHBox( this );
+ page3->setSpacing(8);
+
+ TQLabel *info = new TQLabel( page3 );
+ info->setPalette( yellow );
+ info->setText( "\n"
+ "Look here to see of\n"
+ "the data you entered\n"
+ "is correct. To confirm,\n"
+ "press the [Finish] button\n"
+ "else go back to correct\n"
+ "mistakes." );
+ info->setMargin( 11 );
+ info->setAlignment( AlignTop|AlignLeft );
+ info->setMaximumWidth( info->sizeHint().width() );
+
+ TQVBox *page = new TQVBox( page3 );
+
+ TQHBox *row1 = new TQHBox( page );
+ TQHBox *row2 = new TQHBox( page );
+ TQHBox *row3 = new TQHBox( page );
+ TQHBox *row4 = new TQHBox( page );
+ TQHBox *row5 = new TQHBox( page );
+ TQHBox *row6 = new TQHBox( page );
+
+ TQLabel *label1 = new TQLabel( " Personal Key: ", row1 );
+ label1->setAlignment( TQt::AlignVCenter );
+ TQLabel *label2 = new TQLabel( " First Name: ", row2 );
+ label2->setAlignment( TQt::AlignVCenter );
+ TQLabel *label3 = new TQLabel( " Last Name: ", row3 );
+ label3->setAlignment( TQt::AlignVCenter );
+ TQLabel *label4 = new TQLabel( " Address: ", row4 );
+ label4->setAlignment( TQt::AlignVCenter );
+ TQLabel *label5 = new TQLabel( " Phone Number: ", row5 );
+ label5->setAlignment( TQt::AlignVCenter );
+ TQLabel *label6 = new TQLabel( " E-Mail: ", row6 );
+ label6->setAlignment( TQt::AlignVCenter );
+
+ label1->setMinimumWidth( label1->sizeHint().width() );
+ label2->setMinimumWidth( label1->sizeHint().width() );
+ label3->setMinimumWidth( label1->sizeHint().width() );
+ label4->setMinimumWidth( label1->sizeHint().width() );
+ label5->setMinimumWidth( label1->sizeHint().width() );
+ label6->setMinimumWidth( label1->sizeHint().width() );
+
+ lKey = new TQLabel( row1 );
+ lFirstName = new TQLabel( row2 );
+ lLastName = new TQLabel( row3 );
+ lAddress = new TQLabel( row4 );
+ lPhone = new TQLabel( row5 );
+ lEmail = new TQLabel( row6 );
+
+ addPage( page3, "Finish" );
+
+ setFinishEnabled( page3, TRUE );
+ setHelpEnabled( page3, FALSE );
+}
+
+void Wizard::showPage( TQWidget* page )
+{
+ if ( page == page1 ) {
+ } else if ( page == page2 ) {
+ } else if ( page == page3 ) {
+ lKey->setText( key->text() );
+ lFirstName->setText( firstName->text() );
+ lLastName->setText( lastName->text() );
+ lAddress->setText( address->text() );
+ lPhone->setText( phone->text() );
+ lEmail->setText( email->text() );
+ }
+
+ TQWizard::showPage(page);
+
+ if ( page == page1 ) {
+ keyChanged( key->text() );
+ key->setFocus();
+ } else if ( page == page2 ) {
+ dataChanged( firstName->text() );
+ firstName->setFocus();
+ } else if ( page == page3 ) {
+ finishButton()->setEnabled( TRUE );
+ finishButton()->setFocus();
+ }
+}
+
+void Wizard::keyChanged( const TQString &text )
+{
+ TQString t = text;
+ int p = 0;
+ bool on = ( key->validator()->validate(t, p) == TQValidator::Acceptable );
+ nextButton()->setEnabled( on );
+}
+
+void Wizard::dataChanged( const TQString & )
+{
+ if ( !firstName->text().isEmpty() &&
+ !lastName->text().isEmpty() &&
+ !email->text().isEmpty() )
+ nextButton()->setEnabled( TRUE );
+ else
+ nextButton()->setEnabled( FALSE );
+}
diff --git a/examples/wizard/wizard.doc b/examples/wizard/wizard.doc
new file mode 100644
index 000000000..581e1b73a
--- /dev/null
+++ b/examples/wizard/wizard.doc
@@ -0,0 +1,29 @@
+/*
+*/
+/*! \page wizard-example.html
+
+ \ingroup examples
+ \title Wizard
+
+ This example shows the usage of Qt's wizard class. A wizard
+ should be used to help a user with complicated actions.
+
+ <hr>
+
+ Header file:
+
+ \include wizard/wizard.h
+
+ <hr>
+
+ Implementation:
+
+ \include wizard/wizard.cpp
+
+ <hr>
+
+ Main:
+
+ \include wizard/main.cpp
+*/
+
diff --git a/examples/wizard/wizard.h b/examples/wizard/wizard.h
new file mode 100644
index 000000000..f97a01fdf
--- /dev/null
+++ b/examples/wizard/wizard.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef WIZARD_H
+#define WIZARD_H
+
+#include <qwizard.h>
+
+class TQWidget;
+class TQHBox;
+class TQLineEdit;
+class TQLabel;
+
+class Wizard : public TQWizard
+{
+ Q_OBJECT
+
+public:
+ Wizard( TQWidget *parent = 0, const char *name = 0 );
+
+ void showPage(TQWidget* page);
+
+protected:
+ void setupPage1();
+ void setupPage2();
+ void setupPage3();
+
+ TQHBox *page1, *page2, *page3;
+ TQLineEdit *key, *firstName, *lastName, *address, *phone, *email;
+ TQLabel *lKey, *lFirstName, *lLastName, *lAddress, *lPhone, *lEmail;
+
+protected slots:
+ void keyChanged( const TQString & );
+ void dataChanged( const TQString & );
+
+};
+
+#endif
diff --git a/examples/wizard/wizard.pro b/examples/wizard/wizard.pro
new file mode 100644
index 000000000..0a85036a1
--- /dev/null
+++ b/examples/wizard/wizard.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = wizard
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS = wizard.h
+SOURCES = main.cpp \
+ wizard.cpp
diff --git a/examples/xform/README b/examples/xform/README
new file mode 100644
index 000000000..6b2f48d4d
--- /dev/null
+++ b/examples/xform/README
@@ -0,0 +1 @@
+The xform program demonstrates rotation/shearing of text and pixmaps.
diff --git a/examples/xform/aticatac.cpp b/examples/xform/aticatac.cpp
new file mode 100644
index 000000000..515127743
--- /dev/null
+++ b/examples/xform/aticatac.cpp
Binary files differ
diff --git a/examples/xform/image.any b/examples/xform/image.any
new file mode 100644
index 000000000..2f47f4cb2
--- /dev/null
+++ b/examples/xform/image.any
Binary files differ
diff --git a/examples/xform/picture.any b/examples/xform/picture.any
new file mode 100644
index 000000000..d9cf7f22a
--- /dev/null
+++ b/examples/xform/picture.any
Binary files differ
diff --git a/examples/xform/xform.cpp b/examples/xform/xform.cpp
new file mode 100644
index 000000000..dfe351946
--- /dev/null
+++ b/examples/xform/xform.cpp
@@ -0,0 +1,507 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+
+#include <qdialog.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qlcdnumber.h>
+#include <qslider.h>
+#include <qmenubar.h>
+#include <qfontdialog.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qwidgetstack.h>
+
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpicture.h>
+
+#include <stdlib.h>
+
+
+class ModeNames {
+public:
+ enum Mode { Text, Image, Picture };
+};
+
+
+class XFormControl : public TQVBox, public ModeNames
+{
+ Q_OBJECT
+public:
+ XFormControl( const TQFont &initialFont, TQWidget *parent=0, const char *name=0 );
+ ~XFormControl() {}
+
+ TQWMatrix matrix();
+
+signals:
+ void newMatrix( TQWMatrix );
+ void newText( const TQString& );
+ void newFont( const TQFont & );
+ void newMode( int );
+private slots:
+ void newMtx();
+ void newTxt(const TQString&);
+ void selectFont();
+ void fontSelected( const TQFont & );
+ void changeMode(int);
+ void timerEvent(TQTimerEvent*);
+private:
+ Mode mode;
+ TQSlider *rotS; // Rotation angle scroll bar
+ TQSlider *shearS; // Shear value scroll bar
+ TQSlider *magS; // Magnification value scroll bar
+ TQLCDNumber *rotLCD; // Rotation angle LCD display
+ TQLCDNumber *shearLCD; // Shear value LCD display
+ TQLCDNumber *magLCD; // Magnification value LCD display
+ TQCheckBox *mirror; // Checkbox for mirror image on/of
+ TQWidgetStack* optionals;
+ TQLineEdit *textEd; // Inp[ut field for xForm text
+ TQPushButton *fpb; // Select font push button
+ TQRadioButton *rb_txt; // Radio button for text
+ TQRadioButton *rb_img; // Radio button for image
+ TQRadioButton *rb_pic; // Radio button for picture
+ TQFont currentFont;
+};
+
+/*
+ ShowXForm displays a text or a pixmap (TQPixmap) using a coordinate
+ transformation matrix (TQWMatrix)
+*/
+
+class ShowXForm : public TQWidget, public ModeNames
+{
+ Q_OBJECT
+public:
+ ShowXForm( const TQFont &f, TQWidget *parent=0, const char *name=0 );
+ ~ShowXForm() {}
+ void showIt(); // (Re)displays text or pixmap
+
+ Mode mode() const { return m; }
+public slots:
+ void setText( const TQString& );
+ void setMatrix( TQWMatrix );
+ void setFont( const TQFont &f );
+ void setPixmap( TQPixmap );
+ void setPicture( const TQPicture& );
+ void setMode( int );
+private:
+ TQSizePolicy sizePolicy() const;
+ TQSize sizeHint() const;
+ void paintEvent( TQPaintEvent * );
+ void resizeEvent( TQResizeEvent * );
+ TQWMatrix mtx; // coordinate transform matrix
+ TQString text; // text to be displayed
+ TQPixmap pix; // pixmap to be displayed
+ TQPicture picture; // text to be displayed
+ TQRect eraseRect; // covers last displayed text/pixmap
+ Mode m;
+};
+
+XFormControl::XFormControl( const TQFont &initialFont,
+ TQWidget *parent, const char *name )
+ : TQVBox( parent, name )
+{
+ setSpacing(6);
+ setMargin(6);
+ currentFont = initialFont;
+ mode = Image;
+
+ rotLCD = new TQLCDNumber( 4, this, "rotateLCD" );
+ rotS = new TQSlider( TQSlider::Horizontal, this,
+ "rotateSlider" );
+ shearLCD = new TQLCDNumber( 5,this, "shearLCD" );
+ shearS = new TQSlider( TQSlider::Horizontal, this,
+ "shearSlider" );
+ mirror = new TQCheckBox( this, "mirrorCheckBox" );
+ rb_txt = new TQRadioButton( this, "text" );
+ rb_img = new TQRadioButton( this, "image" );
+ rb_pic = new TQRadioButton( this, "picture" );
+ optionals = new TQWidgetStack(this);
+ TQVBox* optionals_text = new TQVBox(optionals);
+ optionals_text->setSpacing(6);
+ TQVBox* optionals_other = new TQVBox(optionals);
+ optionals_other->setSpacing(6);
+ optionals->addWidget(optionals_text,0);
+ optionals->addWidget(optionals_other,1);
+ fpb = new TQPushButton( optionals_text, "text" );
+ textEd = new TQLineEdit( optionals_text, "text" );
+ textEd->setFocus();
+
+ rotLCD->display( " 0'" );
+
+ rotS->setRange( -180, 180 );
+ rotS->setValue( 0 );
+ connect( rotS, SIGNAL(valueChanged(int)), SLOT(newMtx()) );
+
+ shearLCD->display( "0.00" );
+
+ shearS->setRange( -25, 25 );
+ shearS->setValue( 0 );
+ connect( shearS, SIGNAL(valueChanged(int)), SLOT(newMtx()) );
+
+ mirror->setText( tr("Mirror") );
+ connect( mirror, SIGNAL(clicked()), SLOT(newMtx()) );
+
+ TQButtonGroup *bg = new TQButtonGroup(this);
+ bg->hide();
+ bg->insert(rb_txt,0);
+ bg->insert(rb_img,1);
+ bg->insert(rb_pic,2);
+ rb_txt->setText( tr("Text") );
+ rb_img->setText( tr("Image") );
+ rb_img->setChecked(TRUE);
+ rb_pic->setText( tr("Picture") );
+ connect( bg, SIGNAL(clicked(int)), SLOT(changeMode(int)) );
+
+ fpb->setText( tr("Select font...") );
+ connect( fpb, SIGNAL(clicked()), SLOT(selectFont()) );
+
+ textEd->setText( "Troll" );
+ connect( textEd, SIGNAL(textChanged(const TQString&)),
+ SLOT(newTxt(const TQString&)) );
+
+ magLCD = new TQLCDNumber( 4,optionals_other, "magLCD" );
+ magLCD->display( "100" );
+ magS = new TQSlider( TQSlider::Horizontal, optionals_other,
+ "magnifySlider" );
+ magS->setRange( 0, 800 );
+ connect( magS, SIGNAL(valueChanged(int)), SLOT(newMtx()) );
+ magS->setValue( 0 );
+ connect( magS, SIGNAL(valueChanged(int)), magLCD, SLOT(display(int)));
+
+ optionals_text->adjustSize();
+ optionals_other->adjustSize();
+ changeMode(Image);
+
+ startTimer(20); // start an initial animation
+}
+
+void XFormControl::timerEvent(TQTimerEvent*)
+{
+ int v = magS->value();
+ v = (v+2)+v/10;
+ if ( v >= 200 ) {
+ v = 200;
+ killTimers();
+ }
+ magS->setValue(v);
+}
+
+
+
+/*
+ Called whenever the user has changed one of the matrix parameters
+ (i.e. rotate, shear or magnification)
+*/
+void XFormControl::newMtx()
+{
+ emit newMatrix( matrix() );
+}
+
+void XFormControl::newTxt(const TQString& s)
+{
+ emit newText(s);
+ changeMode(Text);
+}
+
+/*
+ Calculates the matrix appropriate for the current controls,
+ and updates the displays.
+*/
+TQWMatrix XFormControl::matrix()
+{
+ TQWMatrix m;
+ if (mode != Text) {
+ double magVal = 1.0*magS->value()/100;
+ m.scale( magVal, magVal );
+ }
+ double shearVal = 1.0*shearS->value()/25;
+ m.shear( shearVal, shearVal );
+ m.rotate( rotS->value() );
+ if ( mirror->isChecked() ) {
+ m.scale( 1, -1 );
+ m.rotate( 180 );
+ }
+
+ TQString tmp;
+ tmp.sprintf( "%1.2f", shearVal );
+ if ( shearVal >= 0 )
+ tmp.insert( 0, " " );
+ shearLCD->display( tmp );
+
+ int rot = rotS->value();
+ if ( rot < 0 )
+ rot = rot + 360;
+ tmp.sprintf( "%3i'", rot );
+ rotLCD->display( tmp );
+ return m;
+}
+
+
+void XFormControl::selectFont()
+{
+ bool ok;
+ TQFont f = TQFontDialog::getFont( &ok, currentFont );
+ if ( ok ) {
+ currentFont = f;
+ fontSelected( f );
+ }
+}
+
+void XFormControl::fontSelected( const TQFont &font )
+{
+ emit newFont( font );
+ changeMode(Text);
+}
+
+/*
+ Sets the mode - Text, Image, or Picture.
+*/
+
+void XFormControl::changeMode(int m)
+{
+ mode = (Mode)m;
+
+ emit newMode( m );
+ newMtx();
+ if ( mode == Text ) {
+ optionals->raiseWidget(0);
+ rb_txt->setChecked(TRUE);
+ } else {
+ optionals->raiseWidget(1);
+ if ( mode == Image )
+ rb_img->setChecked(TRUE);
+ else
+ rb_pic->setChecked(TRUE);
+ }
+ qApp->flushX();
+}
+
+ShowXForm::ShowXForm( const TQFont &initialFont,
+ TQWidget *parent, const char *name )
+ : TQWidget( parent, name, WResizeNoErase )
+{
+ setFont( initialFont );
+ setBackgroundColor( white );
+ m = Text;
+ eraseRect = TQRect( 0, 0, 0, 0 );
+}
+
+TQSizePolicy ShowXForm::sizePolicy() const
+{
+ return TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Expanding );
+}
+
+TQSize ShowXForm::sizeHint() const
+{
+ return TQSize(400,400);
+}
+
+void ShowXForm::paintEvent( TQPaintEvent * )
+{
+ showIt();
+}
+
+void ShowXForm::resizeEvent( TQResizeEvent * )
+{
+ eraseRect = TQRect( width()/2, height()/2, 0, 0 );
+ repaint(rect());
+}
+
+void ShowXForm::setText( const TQString& s )
+{
+ text = s;
+ showIt();
+}
+
+void ShowXForm::setMatrix( TQWMatrix w )
+{
+ mtx = w;
+ showIt();
+}
+
+void ShowXForm::setFont( const TQFont &f )
+{
+ m = Text;
+ TQWidget::setFont( f );
+}
+
+void ShowXForm::setPixmap( TQPixmap pm )
+{
+ pix = pm;
+ m = Image;
+ showIt();
+}
+
+void ShowXForm::setPicture( const TQPicture& p )
+{
+ picture = p;
+ m = Picture;
+ showIt();
+}
+
+void ShowXForm::setMode( int mode )
+{
+ m = (Mode)mode;
+}
+
+void ShowXForm::showIt()
+{
+ TQPainter p;
+ TQRect r; // rectangle covering new text/pixmap in virtual coordinates
+ TQWMatrix um; // copy user specified transform
+ int textYPos = 0; // distance from boundingRect y pos to baseline
+ int textXPos = 0; // distance from boundingRect x pos to text start
+ TQRect br;
+ TQFontMetrics fm( fontMetrics() ); // get widget font metrics
+ switch ( mode() ) {
+ case Text:
+ br = fm.boundingRect( text ); // rectangle covering text
+ r = br;
+ textYPos = -r.y();
+ textXPos = -r.x();
+ br.moveTopLeft( TQPoint( -br.width()/2, -br.height()/2 ) );
+ break;
+ case Image:
+ r = TQRect(0, 0, pix.width()+1, pix.height()+1);
+ break;
+ case Picture:
+ // ### need TQPicture::boundingRect()
+ r = TQRect(0,0,1000,1000);
+ break;
+ }
+ r.moveTopLeft( TQPoint(-r.width()/2, -r.height()/2) );
+ r.moveBy( -1, -1 ); // add border for matrix round off
+ r.setSize( TQSize( r.width() + 2,r.height() + 2 ) );
+ // compute union of new and old rect
+ // the resulting rectangle will cover what is already displayed
+ // and have room for the new text/pixmap
+ eraseRect = eraseRect.unite( mtx.mapRect(r) );
+ int pw = TQMIN(eraseRect.width(),width());
+ int ph = TQMIN(eraseRect.height(),height());
+ TQPixmap pm( pw, ph ); // off-screen drawing pixmap
+ pm.fill( backgroundColor() );
+
+ p.begin( &pm );
+ um.translate( pw/2, ph/2 ); // 0,0 is center
+ um = mtx * um;
+ p.setWorldMatrix( um );
+ switch ( mode() ) {
+ case Text:
+ p.setFont( font() ); // use widget font
+ p.drawText( r.left() + textXPos, r.top() + textYPos, text );
+#if 0
+ p.setPen( red );
+ p.drawRect( br );
+#endif
+ break;
+ case Image:
+ p.drawPixmap( -pix.width()/2, -pix.height()/2, pix );
+ break;
+ case Picture:
+ // ### need TQPicture::boundingRect()
+ p.scale(0.25,0.25);
+ p.translate(-230,-180);
+ p.drawPicture( picture );
+ }
+ p.end();
+
+ int xpos = width()/2 - pw/2;
+ int ypos = height()/2 - ph/2;
+ bitBlt( this, xpos, ypos, // copy pixmap to widget
+ &pm, 0, 0, -1, -1 );
+ eraseRect = mtx.map( r );
+}
+
+
+/*
+ Grand unifying widget, putting ShowXForm and XFormControl
+ together.
+*/
+
+class XFormCenter : public TQHBox, public ModeNames
+{
+ Q_OBJECT
+public:
+ XFormCenter( TQWidget *parent=0, const char *name=0 );
+public slots:
+ void setFont( const TQFont &f ) { sx->setFont( f ); }
+ void newMode( int );
+private:
+ ShowXForm *sx;
+ XFormControl *xc;
+};
+
+void XFormCenter::newMode( int m )
+{
+ static bool first_i = TRUE;
+ static bool first_p = TRUE;
+
+ if ( sx->mode() == m )
+ return;
+ if ( m == Image && first_i ) {
+ first_i = FALSE;
+ TQPixmap pm;
+ if ( pm.load( "image.any" ) )
+ sx->setPixmap( pm );
+ return;
+ }
+ if ( m == Picture && first_p ) {
+ first_p = FALSE;
+ TQPicture p;
+ if (p.load( "picture.any" ))
+ sx->setPicture( p );
+ return;
+ }
+ sx->setMode(m);
+}
+
+XFormCenter::XFormCenter( TQWidget *parent, const char *name )
+ : TQHBox( parent, name )
+{
+ TQFont f( "Charter", 36, TQFont::Bold );
+
+ xc = new XFormControl( f, this );
+ sx = new ShowXForm( f, this );
+ setStretchFactor(sx,1);
+ xc->setFrameStyle( TQFrame::Panel | TQFrame::Raised );
+ xc->setLineWidth( 2 );
+ connect( xc, SIGNAL(newText(const TQString&)), sx,
+ SLOT(setText(const TQString&)) );
+ connect( xc, SIGNAL(newMatrix(TQWMatrix)),
+ sx, SLOT(setMatrix(TQWMatrix)) );
+ connect( xc, SIGNAL(newFont(const TQFont&)), sx,
+ SLOT(setFont(const TQFont&)) );
+ connect( xc, SIGNAL(newMode(int)), SLOT(newMode(int)) );
+ sx->setText( "Troll" );
+ newMode( Image );
+ sx->setMatrix(xc->matrix());
+}
+
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ XFormCenter *xfc = new XFormCenter;
+
+ a.setMainWidget( xfc );
+ xfc->setCaption("TQt Example - XForm");
+ xfc->show();
+ return a.exec();
+}
+
+#include "xform.moc" // include metadata generated by the moc
diff --git a/examples/xform/xform.doc b/examples/xform/xform.doc
new file mode 100644
index 000000000..4bca655da
--- /dev/null
+++ b/examples/xform/xform.doc
@@ -0,0 +1,17 @@
+/*
+*/
+/*! \page xform-example.html
+
+ \ingroup examples
+ \title Transformed Graphics Demo
+
+ This example lets the user rotate, shear and scale text and graphics
+ arbitrarily.
+
+ <hr>
+
+ Implementation:
+
+ \include xform/xform.cpp
+*/
+
diff --git a/examples/xform/xform.pro b/examples/xform/xform.pro
new file mode 100644
index 000000000..a9c98784e
--- /dev/null
+++ b/examples/xform/xform.pro
@@ -0,0 +1,10 @@
+TEMPLATE = app
+TARGET = xform
+
+CONFIG += qt warn_on release
+DEPENDPATH = ../../include
+
+REQUIRES = full-config
+
+HEADERS =
+SOURCES = xform.cpp
diff --git a/examples/xml/outliner/main.cpp b/examples/xml/outliner/main.cpp
new file mode 100644
index 000000000..c4b1491e3
--- /dev/null
+++ b/examples/xml/outliner/main.cpp
@@ -0,0 +1,22 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include <qapplication.h>
+#include "outlinetree.h"
+
+int main( int argc, char **argv )
+{
+ TQApplication a( argc, argv );
+
+ OutlineTree outline( "todos.opml" );
+ a.setMainWidget( &outline );
+ outline.show();
+
+ return a.exec();
+}
diff --git a/examples/xml/outliner/outliner.doc b/examples/xml/outliner/outliner.doc
new file mode 100644
index 000000000..c21043dd6
--- /dev/null
+++ b/examples/xml/outliner/outliner.doc
@@ -0,0 +1,40 @@
+/*
+*/
+
+/*! \page outliner-example.html
+
+ \ingroup xml-examples
+
+ \title Outliner to show use of DOM
+
+ This example presents a small outliner program to show the basic usage of
+ the \link xml.html#dom DOM classes \endlink. The format of the outlines
+ is the OPML format as described in http://www.opml.org/spec.
+
+ This example shows how to load a DOM tree from an XML file and how to
+ traverse it.
+
+ <hr>
+
+ Sample XML file (todos.opml):
+
+ \include xml/outliner/todos.opml
+
+ <hr>
+
+ Header file (outlinetree.h):
+
+ \include xml/outliner/outlinetree.h
+
+ <hr>
+
+ Implementation (outlinetree.cpp):
+
+ \include xml/outliner/outlinetree.cpp
+
+ <hr>
+
+ Main (main.cpp):
+
+ \include xml/outliner/main.cpp
+*/
diff --git a/examples/xml/outliner/outliner.pro b/examples/xml/outliner/outliner.pro
new file mode 100644
index 000000000..1dcdc44bd
--- /dev/null
+++ b/examples/xml/outliner/outliner.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = outliner
+
+CONFIG += qt warn_on release
+
+REQUIRES = xml large-config
+
+HEADERS = outlinetree.h
+SOURCES = main.cpp \
+ outlinetree.cpp
+INTERFACES =
diff --git a/examples/xml/outliner/outlinetree.cpp b/examples/xml/outliner/outlinetree.cpp
new file mode 100644
index 000000000..69b92358b
--- /dev/null
+++ b/examples/xml/outliner/outlinetree.cpp
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "outlinetree.h"
+#include <qfile.h>
+#include <qmessagebox.h>
+
+OutlineTree::OutlineTree( const TQString fileName, TQWidget *parent, const char *name )
+ : TQListView( parent, name )
+{
+ // div. configuration of the list view
+ addColumn( "Outlines" );
+ setSorting( -1 );
+ setRootIsDecorated( TRUE );
+
+ // read the XML file and create DOM tree
+ TQFile opmlFile( fileName );
+ if ( !opmlFile.open( IO_ReadOnly ) ) {
+ TQMessageBox::critical( 0,
+ tr( "Critical Error" ),
+ tr( "Cannot open file %1" ).arg( fileName ) );
+ return;
+ }
+ if ( !domTree.setContent( &opmlFile ) ) {
+ TQMessageBox::critical( 0,
+ tr( "Critical Error" ),
+ tr( "Parsing error for file %1" ).arg( fileName ) );
+ opmlFile.close();
+ return;
+ }
+ opmlFile.close();
+
+ // get the header information from the DOM
+ TQDomElement root = domTree.documentElement();
+ TQDomNode node;
+ node = root.firstChild();
+ while ( !node.isNull() ) {
+ if ( node.isElement() && node.nodeName() == "head" ) {
+ TQDomElement header = node.toElement();
+ getHeaderInformation( header );
+ break;
+ }
+ node = node.nextSibling();
+ }
+ // create the tree view out of the DOM
+ node = root.firstChild();
+ while ( !node.isNull() ) {
+ if ( node.isElement() && node.nodeName() == "body" ) {
+ TQDomElement body = node.toElement();
+ buildTree( 0, body );
+ break;
+ }
+ node = node.nextSibling();
+ }
+}
+
+OutlineTree::~OutlineTree()
+{
+}
+
+void OutlineTree::getHeaderInformation( const TQDomElement &header )
+{
+ // visit all children of the header element and look if you can make
+ // something with it
+ TQDomNode node = header.firstChild();
+ while ( !node.isNull() ) {
+ if ( node.isElement() ) {
+ // case for the different header entries
+ if ( node.nodeName() == "title" ) {
+ TQDomText textChild = node.firstChild().toText();
+ if ( !textChild.isNull() ) {
+ setColumnText( 0, textChild.nodeValue() );
+ }
+ }
+ }
+ node = node.nextSibling();
+ }
+}
+
+void OutlineTree::buildTree( TQListViewItem *parentItem, const TQDomElement &parentElement )
+{
+ TQListViewItem *thisItem = 0;
+ TQDomNode node = parentElement.firstChild();
+ while ( !node.isNull() ) {
+ if ( node.isElement() && node.nodeName() == "outline" ) {
+ // add a new list view item for the outline
+ if ( parentItem == 0 )
+ thisItem = new TQListViewItem( this, thisItem );
+ else
+ thisItem = new TQListViewItem( parentItem, thisItem );
+ thisItem->setText( 0, node.toElement().attribute( "text" ) );
+ // recursive build of the tree
+ buildTree( thisItem, node.toElement() );
+ }
+ node = node.nextSibling();
+ }
+}
diff --git a/examples/xml/outliner/outlinetree.h b/examples/xml/outliner/outlinetree.h
new file mode 100644
index 000000000..c6a22ad9d
--- /dev/null
+++ b/examples/xml/outliner/outlinetree.h
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef OUTLINETREE_H
+#define OUTLINETREE_H
+
+#include <qlistview.h>
+#include <qdom.h>
+
+class OutlineTree : public TQListView
+{
+ Q_OBJECT
+
+public:
+ OutlineTree( const TQString fileName, TQWidget *parent = 0, const char *name = 0 );
+ ~OutlineTree();
+
+private:
+ TQDomDocument domTree;
+ void getHeaderInformation( const TQDomElement &header );
+ void buildTree( TQListViewItem *parentItem, const TQDomElement &parentElement );
+};
+
+#endif // OUTLINETREE_H
diff --git a/examples/xml/outliner/todos.opml b/examples/xml/outliner/todos.opml
new file mode 100644
index 000000000..62793900a
--- /dev/null
+++ b/examples/xml/outliner/todos.opml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<opml version="1.0">
+ <head>
+ <title>Todo List</title>
+ <dateCreated>Tue, 31 Oct 2000 17:00:17 CET</dateCreated>
+ <dateModified>Tue, 31 Oct 2000 17:00:17 CET</dateModified>
+ <ownerName>Arthur Dent</ownerName>
+ <ownerEmail>info@trolltech.com</ownerEmail>
+ </head>
+ <body>
+ <outline text="Background">
+ <outline text="This is an example todo list."/>
+ </outline>
+ <outline text="Books to read">
+ <outline text="Science Fiction">
+ <outline text="Philip K. Dick">
+ <outline text="Do Androids Dream of Electical Sheep?"/>
+ <outline text="The Three Stigmata of Palmer Eldritch"/>
+ </outline>
+ <outline text="Robert A. Heinlein">
+ <outline text="Stranger in a Strange Land"/>
+ </outline>
+ <outline text="Isaac Asimov">
+ <outline text="Foundation and Empire"/>
+ </outline>
+ </outline>
+ <outline text="Qt Books (in English)">
+ <outline text="Blanchette &amp; Summerfield: C++ GUI Programming with Qt 3"/>
+ <outline text="Dalheimer: Programming with Qt"/>
+ <outline text="Griffith: KDE 2/Qt Programming Bible"/>
+ <outline text="Hughes: Linux Rapid Application Development"/>
+ <outline text="Solin: Qt Programming in 24 hours"/>
+ <outline text="Ward: Qt 2 Programming for Linux and Windows 2000"/>
+ </outline>
+ </outline>
+ <outline text="Shopping list">
+ <outline text="General">
+ <outline text="Towel"/>
+ <outline text="Hair dryer"/>
+ <outline text="Underpants"/>
+ </outline>
+ <outline text="For Sunday">
+ <outline text="Beef"/>
+ <outline text="Rice"/>
+ <outline text="Carrots"/>
+ <outline text="Beans"/>
+ <outline text="Beer"/>
+ <outline text="Wine"/>
+ <outline text="Orange juice"/>
+ </outline>
+ </outline>
+ <outline text="Write a letter to Ford">
+ </outline>
+ </body>
+</opml>
diff --git a/examples/xml/tagreader-with-features/fnord.xml b/examples/xml/tagreader-with-features/fnord.xml
new file mode 100644
index 000000000..4d1303dd1
--- /dev/null
+++ b/examples/xml/tagreader-with-features/fnord.xml
@@ -0,0 +1,13 @@
+<document xmlns:book = 'http://trolltech.com/fnord/book/'
+ xmlns = 'http://trolltech.com/fnord/' >
+<book>
+ <book:title>Practical XML</book:title>
+ <book:author xmlns:fnord = 'http://trolltech.com/fnord/'
+ title="Ms"
+ fnord:title="Goddess"
+ name="Eris Kallisti"/>
+ <chapter>
+ <title>A Namespace Called fnord</title>
+ </chapter>
+</book>
+</document>
diff --git a/examples/xml/tagreader-with-features/structureparser.cpp b/examples/xml/tagreader-with-features/structureparser.cpp
new file mode 100644
index 000000000..3bbd2a9c9
--- /dev/null
+++ b/examples/xml/tagreader-with-features/structureparser.cpp
@@ -0,0 +1,56 @@
+/*
+*/
+
+#include "structureparser.h"
+
+#include <qstring.h>
+#include <qlistview.h>
+
+StructureParser::StructureParser( TQListView * t )
+ : TQXmlDefaultHandler()
+{
+ setListView( t );
+}
+
+void StructureParser::setListView( TQListView * t )
+{
+ table = t;
+ table->setSorting( -1 );
+ table->addColumn( "Qualified name" );
+ table->addColumn( "Namespace" );
+}
+
+bool StructureParser::startElement( const TQString& namespaceURI,
+ const TQString& ,
+ const TQString& qName,
+ const TQXmlAttributes& attributes)
+{
+ TQListViewItem * element;
+
+ if ( ! stack.isEmpty() ){
+ TQListViewItem *lastChild = stack.top()->firstChild();
+ if ( lastChild ) {
+ while ( lastChild->nextSibling() )
+ lastChild = lastChild->nextSibling();
+ }
+ element = new TQListViewItem( stack.top(), lastChild, qName, namespaceURI );
+ } else {
+ element = new TQListViewItem( table, qName, namespaceURI );
+ }
+ stack.push( element );
+ element->setOpen( TRUE );
+
+ if ( attributes.length() > 0 ) {
+ for ( int i = 0 ; i < attributes.length(); i++ ) {
+ new TQListViewItem( element, attributes.qName(i), attributes.uri(i) );
+ }
+ }
+ return TRUE;
+}
+
+bool StructureParser::endElement( const TQString&, const TQString&,
+ const TQString& )
+{
+ stack.pop();
+ return TRUE;
+}
diff --git a/examples/xml/tagreader-with-features/structureparser.h b/examples/xml/tagreader-with-features/structureparser.h
new file mode 100644
index 000000000..9ab8ec2af
--- /dev/null
+++ b/examples/xml/tagreader-with-features/structureparser.h
@@ -0,0 +1,29 @@
+/*
+*/
+
+#ifndef STRUCTUREPARSER_H
+#define STRUCTUREPARSER_H
+
+#include <qxml.h>
+#include <qptrstack.h>
+
+class TQListView;
+class TQListViewItem;
+class TQString;
+
+class StructureParser: public TQXmlDefaultHandler
+{
+public:
+ StructureParser( TQListView * );
+ bool startElement( const TQString&, const TQString&, const TQString& ,
+ const TQXmlAttributes& );
+ bool endElement( const TQString&, const TQString&, const TQString& );
+
+ void setListView( TQListView * );
+
+private:
+ TQPtrStack<TQListViewItem> stack;
+ TQListView * table;
+};
+
+#endif
diff --git a/examples/xml/tagreader-with-features/tagreader-with-features.pro b/examples/xml/tagreader-with-features/tagreader-with-features.pro
new file mode 100644
index 000000000..ffe7648d7
--- /dev/null
+++ b/examples/xml/tagreader-with-features/tagreader-with-features.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = tagreader-with-features
+
+CONFIG += qt warn_on release
+
+REQUIRES = xml large-config
+
+HEADERS = structureparser.h
+SOURCES = tagreader.cpp \
+ structureparser.cpp
+INTERFACES =
diff --git a/examples/xml/tagreader-with-features/tagreader.cpp b/examples/xml/tagreader-with-features/tagreader.cpp
new file mode 100644
index 000000000..866879a4f
--- /dev/null
+++ b/examples/xml/tagreader-with-features/tagreader.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "structureparser.h"
+#include <qapplication.h>
+#include <qfile.h>
+#include <qxml.h>
+#include <qlistview.h>
+#include <qgrid.h>
+#include <qmainwindow.h>
+#include <qlabel.h>
+
+int main( int argc, char **argv )
+{
+ TQApplication app( argc, argv );
+
+ TQFile xmlFile( argc == 2 ? argv[1] : "fnord.xml" );
+ TQXmlInputSource source( &xmlFile );
+
+ TQXmlSimpleReader reader;
+
+ TQGrid * container = new TQGrid( 3 );
+
+ TQListView * nameSpace = new TQListView( container, "table_namespace" );
+ StructureParser * handler = new StructureParser( nameSpace );
+ reader.setContentHandler( handler );
+ reader.parse( source );
+
+ TQListView * namespacePrefix = new TQListView( container,
+ "table_namespace_prefix" );
+ handler->setListView( namespacePrefix );
+ reader.setFeature( "http://xml.org/sax/features/namespace-prefixes",
+ TRUE );
+ source.reset();
+ reader.parse( source );
+
+ TQListView * prefix = new TQListView( container, "table_prefix");
+ handler->setListView( prefix );
+ reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE );
+ source.reset();
+ reader.parse( source );
+
+ // namespace label
+ (void) new TQLabel(
+ "Default:\n"
+ "http://xml.org/sax/features/namespaces: TRUE\n"
+ "http://xml.org/sax/features/namespace-prefixes: FALSE\n",
+ container );
+
+ // namespace prefix label
+ (void) new TQLabel(
+ "\n"
+ "http://xml.org/sax/features/namespaces: TRUE\n"
+ "http://xml.org/sax/features/namespace-prefixes: TRUE\n",
+ container );
+
+ // prefix label
+ (void) new TQLabel(
+ "\n"
+ "http://xml.org/sax/features/namespaces: FALSE\n"
+ "http://xml.org/sax/features/namespace-prefixes: TRUE\n",
+ container );
+
+
+ app.setMainWidget( container );
+ container->show();
+ return app.exec();
+}
diff --git a/examples/xml/tagreader-with-features/tagreader.doc b/examples/xml/tagreader-with-features/tagreader.doc
new file mode 100644
index 000000000..1d11dc260
--- /dev/null
+++ b/examples/xml/tagreader-with-features/tagreader.doc
@@ -0,0 +1,40 @@
+/*
+*/
+
+/*! \page tagreader-with-features-example.html
+
+ \ingroup xml-examples
+
+ \title Demonstration of SAX2 features
+
+ This example presents a small \link xml.html#sax2 SAX2 \endlink
+ reader that outputs the qualified names and the
+ respective namespace URIs of all elements and attributes in an
+ XML file. Additionally the tree structure of the document is displayed.
+
+ In three listviews the program shows the different output of the reader
+ depending on how the SAX2 \link xml.html#sax2Namespaces features \endlink
+ \e http://xml.org/sax/features/namespaces and
+ \e http://xml.org/sax/features/namespace-prefixes are set.
+
+ This example is thoroughly explained in a
+ \link xml-sax-features-walkthrough.html walkthrough. \endlink
+
+ <hr>
+
+ Header file:
+
+ \include xml/tagreader-with-features/structureparser.h
+
+ <hr>
+
+ Implementation:
+
+ \include xml/tagreader-with-features/structureparser.cpp
+
+ <hr>
+
+ Main:
+
+ \include xml/tagreader-with-features/tagreader.cpp
+*/
diff --git a/examples/xml/tagreader/animals.xml b/examples/xml/tagreader/animals.xml
new file mode 100644
index 000000000..e1284901d
--- /dev/null
+++ b/examples/xml/tagreader/animals.xml
@@ -0,0 +1,7 @@
+<animals>
+<mammals>
+ <monkeys> <gorilla/> <orangutan/> </monkeys>
+</mammals>
+<birds> <pigeon/> <penguin/> </birds>
+</animals>
+
diff --git a/examples/xml/tagreader/structureparser.cpp b/examples/xml/tagreader/structureparser.cpp
new file mode 100644
index 000000000..9c13f4568
--- /dev/null
+++ b/examples/xml/tagreader/structureparser.cpp
@@ -0,0 +1,34 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "structureparser.h"
+
+#include <stdio.h>
+#include <qstring.h>
+
+bool StructureParser::startDocument()
+{
+ indent = "";
+ return TRUE;
+}
+
+bool StructureParser::startElement( const TQString&, const TQString&,
+ const TQString& qName,
+ const TQXmlAttributes& )
+{
+ printf( "%s%s\n", (const char*)indent, (const char*)qName );
+ indent += " ";
+ return TRUE;
+}
+
+bool StructureParser::endElement( const TQString&, const TQString&, const TQString& )
+{
+ indent.remove( (uint)0, 4 );
+ return TRUE;
+}
diff --git a/examples/xml/tagreader/structureparser.h b/examples/xml/tagreader/structureparser.h
new file mode 100644
index 000000000..c860f21a5
--- /dev/null
+++ b/examples/xml/tagreader/structureparser.h
@@ -0,0 +1,29 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef STRUCTUREPARSER_H
+#define STRUCTUREPARSER_H
+
+#include <qxml.h>
+
+class TQString;
+
+class StructureParser : public TQXmlDefaultHandler
+{
+public:
+ bool startDocument();
+ bool startElement( const TQString&, const TQString&, const TQString& ,
+ const TQXmlAttributes& );
+ bool endElement( const TQString&, const TQString&, const TQString& );
+
+private:
+ TQString indent;
+};
+
+#endif
diff --git a/examples/xml/tagreader/tagreader.cpp b/examples/xml/tagreader/tagreader.cpp
new file mode 100644
index 000000000..93dd4cc59
--- /dev/null
+++ b/examples/xml/tagreader/tagreader.cpp
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for TQt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "structureparser.h"
+#include <qfile.h>
+#include <qxml.h>
+#include <qwindowdefs.h>
+
+int main( int argc, char **argv )
+{
+ if ( argc < 2 ) {
+ fprintf( stderr, "Usage: %s <xmlfile> [<xmlfile> ...]\n", argv[0] );
+ return 1;
+ }
+ StructureParser handler;
+ TQXmlSimpleReader reader;
+ reader.setContentHandler( &handler );
+ for ( int i=1; i < argc; i++ ) {
+ TQFile xmlFile( argv[i] );
+ TQXmlInputSource source( &xmlFile );
+ reader.parse( source );
+ }
+ return 0;
+}
diff --git a/examples/xml/tagreader/tagreader.doc b/examples/xml/tagreader/tagreader.doc
new file mode 100644
index 000000000..9a0bad01d
--- /dev/null
+++ b/examples/xml/tagreader/tagreader.doc
@@ -0,0 +1,35 @@
+/*
+*/
+
+/*! \page tagreader-example.html
+
+ \ingroup xml-examples
+
+ \title A tiny SAX2 parser
+
+ This example presents a small \link xml.html#sax2 SAX2 \endlink
+ reader that outputs the names of all elements in an
+ XML document on the command line. The element names are
+ indented corresponding to their nesting
+
+ This example is thoroughly explained in a
+ \link xml-sax-walkthrough.html walkthrough. \endlink
+
+ <hr>
+
+ Header file:
+
+ \include xml/tagreader/structureparser.h
+
+ <hr>
+
+ Implementation:
+
+ \include xml/tagreader/structureparser.cpp
+
+ <hr>
+
+ Main:
+
+ \include xml/tagreader/tagreader.cpp
+*/
diff --git a/examples/xml/tagreader/tagreader.pro b/examples/xml/tagreader/tagreader.pro
new file mode 100644
index 000000000..b6ebf8b97
--- /dev/null
+++ b/examples/xml/tagreader/tagreader.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+TARGET = tagreader
+
+CONFIG += qt console warn_on release
+
+REQUIRES = xml large-config
+
+HEADERS = structureparser.h
+SOURCES = tagreader.cpp \
+ structureparser.cpp
+INTERFACES =