wmglobe: Add version 0.5 to repository.
From http://web.cs.mun.ca/~gstarkes/wmaker/dockapps/files/wmglobe-0.5.tar.gz
This commit is contained in:
parent
b1491b9d02
commit
3b8506cfaa
45
wmglobe/CHANGES
Normal file
45
wmglobe/CHANGES
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
VMGlobe
|
||||||
|
0.5 released 6/02/99
|
||||||
|
- floating point exception bug solved
|
||||||
|
- many minor bugs solved (earth displaying, mouse, time management)
|
||||||
|
- compile time options in header
|
||||||
|
- night map option available in parameter screen
|
||||||
|
- option -time only available in command line
|
||||||
|
- new default map
|
||||||
|
|
||||||
|
0.5.pre1 released 20/01/99
|
||||||
|
- option selection through parameters screens (right button)
|
||||||
|
- approximation of date & time of view point
|
||||||
|
- new default map (bigger, better)
|
||||||
|
- display of time uses setlocale()
|
||||||
|
- option -dawn value : enhance dawn borderline
|
||||||
|
- option -time : change date displayed
|
||||||
|
- option -nonimap
|
||||||
|
- reorganize sources, little CPU gain, better earth displaying
|
||||||
|
- rename -austral to -oz
|
||||||
|
- modify comportment of -rand option when zooming
|
||||||
|
- change left button comportment : only change longitude
|
||||||
|
- shift+left button : change longitude & latitude
|
||||||
|
- man page
|
||||||
|
|
||||||
|
0.3.1 released 5/02/99
|
||||||
|
- option -austral
|
||||||
|
- solved bug about colors 24 and 32 bit per pixel
|
||||||
|
|
||||||
|
0.3 released 3/02/99
|
||||||
|
- right button : screen of digital modification of latitude/long.
|
||||||
|
|
||||||
|
0.2.1 released 3/02/99
|
||||||
|
- change & enhance mouse operations (longitude/latitude/zoom)
|
||||||
|
- minor bugs, CPU optimization
|
||||||
|
|
||||||
|
0.2 released 1/01/99
|
||||||
|
- bug about ipc & shared memory solved.
|
||||||
|
- new functionnality :
|
||||||
|
left click = change longitude
|
||||||
|
middle click = zoom in / zoom out
|
||||||
|
right click = change latitude
|
||||||
|
- a few hints for compile on *BSD
|
||||||
|
|
||||||
|
0.1 released 31/12/98
|
||||||
|
|
339
wmglobe/COPYING
Normal file
339
wmglobe/COPYING
Normal file
|
@ -0,0 +1,339 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
675 Mass Ave, Cambridge, MA 02139, USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
22
wmglobe/Makefile
Normal file
22
wmglobe/Makefile
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
INC = -I/usr/X11R6/include
|
||||||
|
LIBS = -lXext -lX11 -lm -L/usr/X11R6/lib \
|
||||||
|
-ltiff -lXpm -lpng -lz -ljpeg -lungif -lwraster
|
||||||
|
OBJS = src/wmglobe.o src/rend.o src/wmgutil.o \
|
||||||
|
src/sunpos.o src/myconvert.o src/mycontext.o
|
||||||
|
|
||||||
|
|
||||||
|
.c.o :
|
||||||
|
gcc -c -O2 -Wall $(INC) $< -o $*.o
|
||||||
|
|
||||||
|
all: wmglobe
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f src/*.o wmglobe
|
||||||
|
|
||||||
|
wmglobe : $(OBJS)
|
||||||
|
gcc -O2 -Wall $(OBJS) -o wmglobe $(LIBS)
|
||||||
|
strip wmglobe
|
||||||
|
|
||||||
|
install :
|
||||||
|
install wmglobe /usr/local/bin
|
||||||
|
install wmglobe.1 /usr/local/man/man1
|
349
wmglobe/README
Normal file
349
wmglobe/README
Normal file
|
@ -0,0 +1,349 @@
|
||||||
|
WMGlobe 0.5 - The Whole Earth spinning on you desktop... as a dockable app
|
||||||
|
Copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
This program is licensed under the terms of the GNU GPL, see below.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
----------------------------------------
|
||||||
|
WMGlobe is a WindowMaker dock.app that displays the earth on an icon. It's
|
||||||
|
an adaptation of XGlobe to WMaker environnement. WMGlobe uses a map which is
|
||||||
|
rendered on a sphere by raytracing. Yes, for a 64x64 pixel result :-)
|
||||||
|
|
||||||
|
It's still a beta version...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
----------------------------------------
|
||||||
|
You need WindowMaker to build WMGlobe. WMGlobe needs libwraster to compile,
|
||||||
|
this lib is built by WindowMaker. No more need at run time if statically
|
||||||
|
linked, but then, you need WindowMaker to get the full magic :-)
|
||||||
|
|
||||||
|
|
||||||
|
tar -xvzf wmglobe-0.5.tar.gz
|
||||||
|
cd wmglobe-0.5
|
||||||
|
make
|
||||||
|
|
||||||
|
then move wmglobe in /usr/local/bin and man page somewhere or do
|
||||||
|
(as root) :
|
||||||
|
make install
|
||||||
|
|
||||||
|
|
||||||
|
If it doesn't work, look for the graphic libraries.
|
||||||
|
|
||||||
|
The Makefile is quite crude...
|
||||||
|
|
||||||
|
WMGlobe is developped on Linux (WMaker 0.51.0 and linux 2.0.36/ix86).
|
||||||
|
If you are successful on other platforms, please tell me so.
|
||||||
|
|
||||||
|
|
||||||
|
platforms with successfull built reported :
|
||||||
|
|
||||||
|
NetBSD 1.3.2 / SPARC (wmaker 0.20.3) , with Makefile adaptations for libs
|
||||||
|
Linux 2.0.36 / RedHat 5.1
|
||||||
|
Linux 2.0.36 / SuSE 5.3 (wmaker 0.20.3) , -lungif -> -lgif
|
||||||
|
Linux 2.2.0-pre4 / Debian :-)
|
||||||
|
FreeBSD-3.0 with -ltiff -> -ltiff34 and -lungif -> -lgif
|
||||||
|
Solaris 2.6 / Sun Sparc (wmaker 0.20.3) , with Makefile adaptations for libs
|
||||||
|
AIX 4.2.1 / IBM RS/6000-250 (wmaker 0.50.2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RPM & DEBIAN linux packages coming soon. Or you can directly use the binary.
|
||||||
|
|
||||||
|
compile time problems :
|
||||||
|
|
||||||
|
Xlib.h, Xpm.h ... :
|
||||||
|
If you compile wmglobe on a computer installed with packages (.rpm), you may
|
||||||
|
lack of these header files. Just install the "xxx-dev.rpm" packages for XFree86
|
||||||
|
and graphics libs, or install a rpm version of wmglobe.
|
||||||
|
|
||||||
|
libwraster :
|
||||||
|
WindowMaker 0.20.3 uses a libwraster.a , so if you use it, you can execute
|
||||||
|
the binary on a computer without WindowMaker on it, and displaying on a
|
||||||
|
remote computer (this one using WindowMaker). WM 0.51.0 creates a dynamic
|
||||||
|
libwraster.so, so it's necessary to have it on the computer running wmglobe
|
||||||
|
if you buit WMGlobe with this one. Both versions of WMGlobe run on WM 0.20.3
|
||||||
|
and 0.51.0
|
||||||
|
|
||||||
|
graphic libs :
|
||||||
|
you can use libgif or libungif. If your version of WindowMaker is built
|
||||||
|
without support for some graphic type, you don't need it (just remove it
|
||||||
|
from the makefile).
|
||||||
|
This problem may happen with RedHat 5.2, if you get this kind of message,
|
||||||
|
just add a libtiff to your system :
|
||||||
|
/usr/local/lib/libwraster.so: undefined reference to `TIFFReadDirectory'
|
||||||
|
...
|
||||||
|
make: *** [wmglobe] Error 1
|
||||||
|
|
||||||
|
|
||||||
|
compile time options :
|
||||||
|
You can modify the file wmgoption.h where many options are set up in defines :
|
||||||
|
|
||||||
|
To disable the builtin default map, just comment out the line in wmgoptions.h :
|
||||||
|
#define DEFMAPOK
|
||||||
|
to supprim the shift+left/left method of rotate earth, uncomment the lines
|
||||||
|
#define MOUSE_LAT_FULL
|
||||||
|
|
||||||
|
you can also suppress some options screen in wmgoption.h
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Maps
|
||||||
|
----------------------------------------
|
||||||
|
Like XGlobe, WMGlobe needs a longitude/latitude map to work. By default,
|
||||||
|
it uses a low quality built-in map of earth. But you will probably want
|
||||||
|
to use better ones.
|
||||||
|
|
||||||
|
You can get maps usable with WMGlobe on the net. See the LINKS chapter.
|
||||||
|
|
||||||
|
using custom maps :
|
||||||
|
- For the image to be mapped correctly, position 0°North 0°West must be in
|
||||||
|
the center of the image and the latitude must be linear from 90°N to 90°S.
|
||||||
|
- When using a night map, make sure that day and night map have the same
|
||||||
|
dimensions.
|
||||||
|
|
||||||
|
By the way, you can use maps of Mars, Luna ... and text.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Configuration options
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
Configuration is done through command line options.
|
||||||
|
|
||||||
|
-v version
|
||||||
|
-h short help
|
||||||
|
|
||||||
|
-zoom zoom_value Value > 1 to magnify the view, value < 1 to lower.
|
||||||
|
Default : 1.0
|
||||||
|
|
||||||
|
-pos latitude long. Initial viewing fixed at this position, don't follow
|
||||||
|
the sun rotation. Accepted values in the form
|
||||||
|
45°12'36 or 45.21 or 45:12:36
|
||||||
|
Default : the initial position is "under" the sun, and
|
||||||
|
the point of view follows the sun
|
||||||
|
|
||||||
|
-rand New random position at every refresh of screen
|
||||||
|
|
||||||
|
-map map_file Map used for the rendering. Can be JPEG, GIG, XPM
|
||||||
|
PNM, TIFF but none BMP
|
||||||
|
Default : use internal map of earth.
|
||||||
|
|
||||||
|
-nimap night_file Map used for the dark side of the earth. Must be of
|
||||||
|
the same width x height as the day side map.
|
||||||
|
Default : if the default internal day map is used, use
|
||||||
|
a default internal night file (see -nonimap option).
|
||||||
|
If a custom day map is provided, and no night map, the
|
||||||
|
dark side is computed via the -light option.
|
||||||
|
|
||||||
|
-nonimap Don't use the default night map.
|
||||||
|
|
||||||
|
-delay seconds Time in seconds between each calculation of a new
|
||||||
|
position. Limited to 0.04 at compile time (25 frames
|
||||||
|
per second should be enough). The sun position move
|
||||||
|
only once per minute, so if you use wmglobe without
|
||||||
|
-dlong or -accel option, the CPU cost of WMGlobe is
|
||||||
|
*very* low. The use of very low value for -delay plus
|
||||||
|
-dlong and -accel can be CPU costly (but very nice...)
|
||||||
|
Default : 1.0 sec.
|
||||||
|
|
||||||
|
-dlat delta_latitude Move the point of view by delta_lat degrees per second,
|
||||||
|
with a value of 6 the earth make a full rotation in
|
||||||
|
one minute. The value can be formated as -pos option.
|
||||||
|
Default : 0°0'0
|
||||||
|
|
||||||
|
-dlong delta_long Move the point of view by delta_long degrees per
|
||||||
|
second. With a value of -0°0'15" the earth make a full
|
||||||
|
rotation in 24 hours toward the west. By default,
|
||||||
|
-dlong and -dlat are null. If they are used, the view
|
||||||
|
follow their values. Going back to "follow sun" mode
|
||||||
|
in parameters screen put -dlat and -dlong to zero.
|
||||||
|
|
||||||
|
-light light_value Level of light of the dark side when there is no
|
||||||
|
night map, from 0 to 1.
|
||||||
|
Default : 0.25
|
||||||
|
|
||||||
|
-dawn dawn_value Level of continuity for dawn limit, from 0 to 1. With
|
||||||
|
a value of 1, the border line between night and day is
|
||||||
|
at maximum contrast.
|
||||||
|
Default : 0.2
|
||||||
|
|
||||||
|
-bord border_num 0 1 or 2. There are 3 different borders for the icon.
|
||||||
|
Default : 0
|
||||||
|
|
||||||
|
-accel time_multi Time warp factor. With -accel 24, the sun make a full
|
||||||
|
rotation in one hour (or the earth, I'm not sure).
|
||||||
|
Default : 1.0
|
||||||
|
|
||||||
|
-time seconds Time to display in seconds since 01-01-1970 (see the
|
||||||
|
date command). Necessary if you need to be sure that
|
||||||
|
WMGlobe is Y2K compliant without changing system time.
|
||||||
|
Negative values for dates before 1970 accepted.
|
||||||
|
Default : not set, use current time.
|
||||||
|
|
||||||
|
-fun dx dy Move the earth image by dx dy pixels in the icon. See
|
||||||
|
puzzle.sh to understand why.
|
||||||
|
|
||||||
|
-oz Start in "austral" mode (for "down under" people)
|
||||||
|
|
||||||
|
-d display Select another display
|
||||||
|
|
||||||
|
-w -shape Useless, since it is set by default (WMaker dockable
|
||||||
|
application)
|
||||||
|
|
||||||
|
mouse :
|
||||||
|
left button Change longitude while pressed, change longitude &
|
||||||
|
latitude if shift+left button.
|
||||||
|
|
||||||
|
middle button Zoom in, shift + middle button : zoom out
|
||||||
|
|
||||||
|
right button Displays 7 screens of parameters. On every screen, just
|
||||||
|
clic with left or right button on the figures to change
|
||||||
|
their value. The TIME screen shows an approximation
|
||||||
|
of date and time of the earth zone currently displayed,
|
||||||
|
using GMT time + longitude offset, it's close to the
|
||||||
|
real local time by one or two hours. Others options
|
||||||
|
don't need more help. Intuitive they said...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Links : Some sites dealing with WindowMaker
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
Official Window Maker Website :
|
||||||
|
http://www.windowmaker.org/
|
||||||
|
|
||||||
|
The Dock App Warehouse :
|
||||||
|
http://www.bensinclair.com/dockapp/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Links : Where to find maps and similar softs
|
||||||
|
--------------------------------------------
|
||||||
|
where to find the sources of wmglobe :
|
||||||
|
http://www.capway.com/dumonte1/wm/wmglobe-0.5.tar.gz
|
||||||
|
|
||||||
|
the web page of WMGlobe (made by Sylvestre Taburet) :
|
||||||
|
http://www.capway.com/dumonte1/wm/wmg.html
|
||||||
|
|
||||||
|
|
||||||
|
where to find maps and similar softs :
|
||||||
|
|
||||||
|
Earth image by a cgi :
|
||||||
|
http://www.fourmilab.ch/cgi-bin/uncgi/Earth
|
||||||
|
|
||||||
|
two softs running under X :
|
||||||
|
XGlobe Homepage: http://www.uni-karlsruhe.de/~uddn/xglobe
|
||||||
|
(the recent 0.2 version brings a very nice map of earth)
|
||||||
|
|
||||||
|
Xearth Homepage: http://www.cs.colorado.edu/~tuna/xearth/
|
||||||
|
|
||||||
|
|
||||||
|
For the maps XGlobe doc says :
|
||||||
|
|
||||||
|
« WHERE TO GET MAPS:
|
||||||
|
|
||||||
|
1. LivingEarth Inc.
|
||||||
|
|
||||||
|
http://livingearth.com/LE/LivEarthImg.html
|
||||||
|
http://livingearth.com/LE/BrillEarthImg.html
|
||||||
|
|
||||||
|
Livingearth Inc. has some nice (day and night) images on their web pages.
|
||||||
|
With these you can test the -nightmap option of XEarth. Unfortunately
|
||||||
|
they are pretty low-res (400x200).
|
||||||
|
You can find a higher-resolution (but heavily compressed) version of this
|
||||||
|
day map at the "Earth View" page:
|
||||||
|
|
||||||
|
http://www.fourmilab.ch/cgi-bin/uncgi/Earth
|
||||||
|
|
||||||
|
Check "No night" and set display to "map", then save the image.
|
||||||
|
|
||||||
|
|
||||||
|
2. NOAA NGDC Marine Geology & Geophysics
|
||||||
|
|
||||||
|
http://www.ngdc.noaa.gov:80/mgg/image/mggd.gif
|
||||||
|
|
||||||
|
This image is definitely not "photo-realistic" but nonetheless pretty
|
||||||
|
interesting. It also has a rather high resolution. »
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Todo
|
||||||
|
----------------------------------------
|
||||||
|
- test on different platforms, better makefile
|
||||||
|
- changing map "on the fly", map generator, clouds generator...
|
||||||
|
- must work on every current WindowMaker platform
|
||||||
|
- see how to minimize CPU load
|
||||||
|
- feature : load a local detailed map of some part of the globe when zooming
|
||||||
|
(country maps, city maps)
|
||||||
|
- maybe port to other window manager
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Bugs
|
||||||
|
----------------------------------------
|
||||||
|
- The Makefile
|
||||||
|
- if you use the --enable-single-icon compile time option of WindowMaker,
|
||||||
|
you can not display more than one WMGlobe.
|
||||||
|
- WMGlobe hopes that an overflow of a long integer dont generate an error
|
||||||
|
and that LONG_MAX +1 = LONG_MIN . This happens with high values of -accel
|
||||||
|
when the date go over year 2038. The expected result is wmglobe
|
||||||
|
continuing smoothly from 1901.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
----------------------------------------
|
||||||
|
WMGlobe is Copyright (C) 1998,99 by Jerome Dumonteil and licensed through
|
||||||
|
the GNU General Public License.
|
||||||
|
Read the COPYING file for the complete GNU license.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Credits
|
||||||
|
----------------------------------------
|
||||||
|
Original idea, tests, logos : Sylvestre Taburet <staburet@consort.fr>
|
||||||
|
|
||||||
|
The code in 'sunpos.cpp' is taken from Xearth by Kirk Lauritz Johnson.
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sunpos.c
|
||||||
|
* kirk johnson
|
||||||
|
* july 1993
|
||||||
|
*
|
||||||
|
* code for calculating the position on the earth's surface for which
|
||||||
|
* the sun is directly overhead (adapted from _practical astronomy
|
||||||
|
* with your calculator, third edition_, peter duffett-smith,
|
||||||
|
* cambridge university press, 1988.)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright (C) 1989, 1990, 1993, 1994, 1995 Kirk Lauritz Johnson
|
||||||
|
*
|
||||||
|
* Parts of the source code (as marked) are:
|
||||||
|
* Copyright (C) 1989, 1990, 1991 by Jim Frost
|
||||||
|
* Copyright (C) 1992 by Jamie Zawinski <jwz@lucid.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify and freely distribute xearth for
|
||||||
|
* non-commercial and not-for-profit purposes is hereby granted
|
||||||
|
* without fee, provided that both the above copyright notice and this
|
||||||
|
* permission notice appear in all copies and in supporting
|
||||||
|
* documentation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
The rendering engine is taken from XGlobe by Thorsten Scheuermann
|
||||||
|
XGlobe Homepage: http://www.uni-karlsruhe.de/~uddn/xglobe
|
||||||
|
|
||||||
|
Raster graphics library by Alfredo K. Kojima, & stuff of Window Maker
|
||||||
|
<http://windowmaker.org> by A. K. Kojima, Dan Pascu, Matthew Hawkins & team
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Feedback
|
||||||
|
----------------------------------------
|
||||||
|
For your questions, bugs, remarks, please contact our representative on
|
||||||
|
planet Earth : jerome dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
|
||||||
|
|
||||||
|
|
17
wmglobe/puzzle.sh
Executable file
17
wmglobe/puzzle.sh
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#just for the fun, solve the puzzle and put it on the clip :)
|
||||||
|
|
||||||
|
if [ -x ./wmglobe ]
|
||||||
|
then
|
||||||
|
WMG="nice ./wmglobe"
|
||||||
|
else
|
||||||
|
WMG="nice wmglobe"
|
||||||
|
fi
|
||||||
|
|
||||||
|
HOP=" -delay 0.1 -pos -25 10 -dlat 0.5 -dlong -5 -zoom 1.8 -accel 240"
|
||||||
|
|
||||||
|
$WMG $HOP -fun 32 32 &
|
||||||
|
$WMG $HOP -fun -32 32 &
|
||||||
|
$WMG $HOP -fun 32 -32 &
|
||||||
|
$WMG $HOP -fun -32 -32 &
|
||||||
|
$WMG -map ./wmgmap.gif -delay 0.05 -dlong 25 -pos 0 0 -accel 10000&
|
38
wmglobe/src/cadre0.xbm
Normal file
38
wmglobe/src/cadre0.xbm
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#define rond_width 64
|
||||||
|
#define rond_height 64
|
||||||
|
static char cadre0_bits[] = {
|
||||||
|
0x00,0xe0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x0f,
|
||||||
|
0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
|
||||||
|
0x3f,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x0f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0x3f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0x3f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xf0,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
|
||||||
|
0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x1f,
|
||||||
|
0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
|
||||||
|
0x07,0x00};
|
38
wmglobe/src/cadre1.xbm
Normal file
38
wmglobe/src/cadre1.xbm
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#define rond_width 64
|
||||||
|
#define rond_height 64
|
||||||
|
static char cadre1_bits[] = {
|
||||||
|
0x00,0x00,0xc0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x1f,0x00,
|
||||||
|
0x00,0x00,0x00,0xfe,0xff,0xff,0x7f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
|
||||||
|
0x01,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xf0,0xff,0xff,0xff,
|
||||||
|
0xff,0x0f,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0xfc,0xff,0xff,
|
||||||
|
0xff,0xff,0x3f,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xc0,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0x03,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xe0,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
|
||||||
|
0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0x1f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfe,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
|
||||||
|
0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0x3f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xf8,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0x1f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xe0,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0x07,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xc0,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0x03,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xfc,
|
||||||
|
0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
|
||||||
|
0xf0,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x03,0x00,
|
||||||
|
0x00,0x80,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xfe,0xff,0xff,0x7f,0x00,
|
||||||
|
0x00,0x00,0x00,0xf8,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x03,
|
||||||
|
0x00,0x00};
|
38
wmglobe/src/cadre2.xbm
Normal file
38
wmglobe/src/cadre2.xbm
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#define cadre2_width 64
|
||||||
|
#define cadre2_height 64
|
||||||
|
static char cadre2_bits[] = {
|
||||||
|
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,0x00,0x00,
|
||||||
|
0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
|
||||||
|
0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
|
||||||
|
0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
|
||||||
|
0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
|
||||||
|
0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
|
||||||
|
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,0x00,0x00,
|
||||||
|
0x00,0x00};
|
247
wmglobe/src/defmap.xpm
Normal file
247
wmglobe/src/defmap.xpm
Normal file
|
@ -0,0 +1,247 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * defmap_xpm[] = {
|
||||||
|
"360 180 64 1",
|
||||||
|
" c None",
|
||||||
|
". c #B5FCF9",
|
||||||
|
"+ c #F5FDF8",
|
||||||
|
"@ c #7BF8F9",
|
||||||
|
"# c #84D8CD",
|
||||||
|
"$ c #82A7C9",
|
||||||
|
"% c #68BECA",
|
||||||
|
"& c #48BEDC",
|
||||||
|
"* c #48A4D2",
|
||||||
|
"= c #67A4C6",
|
||||||
|
"- c #6BD7DB",
|
||||||
|
"; c #4BF6FA",
|
||||||
|
"> c #438BC6",
|
||||||
|
", c #4CDCE6",
|
||||||
|
"' c #BBDAD0",
|
||||||
|
") c #82C0C6",
|
||||||
|
"! c #3053D6",
|
||||||
|
"~ c #3A3AFF",
|
||||||
|
"{ c #306FC2",
|
||||||
|
"] c #A1D8CC",
|
||||||
|
"^ c #648DC4",
|
||||||
|
"/ c #4570C8",
|
||||||
|
"( c #425CCD",
|
||||||
|
"_ c #A4C1CB",
|
||||||
|
": c #D7E0BC",
|
||||||
|
"< c #5A76C2",
|
||||||
|
"[ c #99ACC7",
|
||||||
|
"} c #81BF40",
|
||||||
|
"| c #8895D0",
|
||||||
|
"1 c #69A742",
|
||||||
|
"2 c #6D8F55",
|
||||||
|
"3 c #3A8E3D",
|
||||||
|
"4 c #BCD65E",
|
||||||
|
"5 c #5B7670",
|
||||||
|
"6 c #9FC04F",
|
||||||
|
"7 c #B9C155",
|
||||||
|
"8 c #9ED55E",
|
||||||
|
"9 c #DFC33E",
|
||||||
|
"0 c #9DA947",
|
||||||
|
"a c #82A745",
|
||||||
|
"b c #D7D955",
|
||||||
|
"c c #69BF3C",
|
||||||
|
"d c #69D947",
|
||||||
|
"e c #84D650",
|
||||||
|
"f c #B7AB41",
|
||||||
|
"g c #8E9243",
|
||||||
|
"h c #74ED42",
|
||||||
|
"i c #4EEC36",
|
||||||
|
"j c #445C91",
|
||||||
|
"k c #AAEE5E",
|
||||||
|
"l c #4EDC3C",
|
||||||
|
"m c #37D833",
|
||||||
|
"n c #3EC039",
|
||||||
|
"o c #46A63E",
|
||||||
|
"p c #34A439",
|
||||||
|
"q c #DCED65",
|
||||||
|
"r c #31734A",
|
||||||
|
"s c #45736A",
|
||||||
|
"t c #315594",
|
||||||
|
"u c #FAF755",
|
||||||
|
"v c #737A6D",
|
||||||
|
"w c #D58E2E",
|
||||||
|
"x c #F0DD45",
|
||||||
|
"y c #E2A935",
|
||||||
|
".+.+.+.++.++.+.+.+.+.+.+.+.+.+......+..+..+...+.........+.+.+.+....+..+...+.....................+..+..+..+...+...+...+..+..+..+...+...+...+.+..+.+.+.+.+.+.+.+..+.+.+.+.+..+.+.+..+..+..+...+..+..+..+..+..+..+..+..+..+..+..+..+.+..+..+.+..+..+..+.+.+..+.+.+..+..+..+..+..+.+..+..+..+..+..+..............+....+...........+......+...+...+..+...+.............+....+",
|
||||||
|
".+.++++++++++++++++++++.+.+.++++++++++.++.+++.+.+.+.+...+++++.++.+..+..++..+.+.+.+.+.+.+.++.+.+.+..+.+.+..+.+.++..++..+..+..+.+.+.+.+..+.+..++.+.+.+.+.+.+.+.+.+.+.+.++.+++.++.+.+.+.+.+.++.+.+.+.+.+.+.+.+.+.++.++.++.++.+.+.+.+.+.+.+.+.+.+.+..+.+.+.+.+.+.+.+.+.+.+.++.++.+.++.+.+.+.+.+....+.................................+......................................",
|
||||||
|
".+.+++++++++++.++++++++++++++++++++++++++++.++.+.++.++....+.+++++..+.+.+.+.+.......+...+...+..+.+.+.+.+.++.+.+..+...+.+.+.+.+.+.+..+.+.+.+.+.+.+.++.++.++++.++.+++++++++.++++++++.++.+.+.+.+.+.+.+.+.+.+.++.+.+.+.++.++.++.++.++.+.++.+.++.++.+++.+.+.++.+++.++.++.++.++.+.+.++.+.+.+.+.+..+.+..............................+...............+.......................@...",
|
||||||
|
".+.+.+...+.+++.+.+++++++++++++++++++++++++.+.++.+.+.+++.+..+..++++..+.+...+.+.+.+..+++.+++.++.+.+++.++.+..+.+.+.+.+.+...+..+..+.+.+..+...+.+.+.+..+.+.+..+.+.++.+.+.+.++.+.+.+.+++.+.+++.+.+.+.+.+.+.+.+.+.++.+.++.+.++.++.++.+.++.++.++.++.+.+.+.+++.++.+.++.++.+.++.++++.++.+++.++.++.++.+................................+.+...+................@.@..@.@.@.@.@.@.....",
|
||||||
|
"..+.....+..++++++++++++++++++++++++++++++++++++++++++.+.+.+.+.+.+.+...+.+...++.+.++.+++++++.++.+.+.+.+.+....@.@.@.@.............@.@..@..@...@@.@....@.@.@.@@......+.+.+++++++++.+.++.+.++.++.+.+.+.+.+.+.+.+.+.+.++++.++.++.++.++.++.++.++.+++.+++.+.++.+++.++.+++.+.++.+++.++..+..+.......................@.@.@...@................................@.@.@...............",
|
||||||
|
".+.+++.+.+.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+..++..+.+..+++++.++++++++.++.+..#$%&*&&*&**&=&--.@@@@@;;;;;;;;;;;&&*%*>>>**=********&,,,#-@@..@......+.+++.+++.+.++.+++.+.+++.+.+.+..+..+.+..++.++.++.++.++.+.+.+.++.+.+.+.+++.++.+.+.++.+.+++.++.+.+.++.......................@.@.@@@;;;;@.@@.@...........................@..............+......",
|
||||||
|
"..+.+.++.+++++++++++++++++++++++++++++++++++++++++++++++++++.+++.++.++++.++++++++++++++++++.+...')$%%>!~~!!~~~~~~~~~~~!!{>*>>**&&>*>*>{!!~~~!~~!!{{!!!{!!~~!>{{{!>&%&%-@@@@@@...++.++++.+.+..+.+......+....+......++..+..+..+.....+.+..+...+.+..+.+..+.+.++.+.+.+.+..+.+.++.+.+.+.@@@@..+.+...++.+..@@....@@@;@;@@@@.@..@....++.+.+.+................@....@.............",
|
||||||
|
"....+.+.+.+.+.+++++++++++++++++++++++++++++++++++++++++++++++.+++++++.+++.++.+.+.....+.+.]$^/(/(!{^$_]_].+.+...])$&=*!~~~~!~!!!!~~~!!>&*^>)$=$:.]..@@;;;,,{!~~~~~~~~~~!>****,;@@.+.+..+.']#_)%)=^^^^<=$%$^=>=-]..].'':.+.+...+..'.].':..:''.+:.:..+.+..+...+.............+.++.+......+............@@@.@....@@;@@.@@........+...+.+.+.+.+................................",
|
||||||
|
".+...+.+.+.++.+.+++++++++++++++++++++++++++++++++++++++++.+.+.+.+...+.+.+..+.']._)[)^>({(/)'''.+.:+..+++++++++:+.]%/!~~^$)'.+:#.]=]+:+..++++++++++++++..,,,&&&{~!!{~~~~~~~~~!{{>>%)%)$^!~~~~~~~~~~~~~~~~~~~~~~~!~~~~~!!~!!(</!!~~!~~~!~!~~~({{>!!((><<^/-@,,-&&*%=>>>>>^$)]])$-)=>%#%=^&-&&%)#@..@@@.......@......+.+.+++++.+++...+.++++++.........+++.+.+..+......+.+..",
|
||||||
|
".++..+.+.+.+.++++.+++++++++++++++++++++++++++++.+.+++++.++++++.+.+.....])^/{~~~~~~~~<%''=>*)_=_'_]+']]'+.+:++.]^!!)''.++++++++++++++++++++++++++++++++++++..@;;;;@=>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!~!!~~~~~~~~~~~~~~~~~~~~{>**=(~~!{%%&/=%~>^!~~!*&&{~~~~~~~~~~~~~~~~~~!/#..#{~~~~~~>#..+..++++++++++++++++++++..++++++++........+.+.+.......+++.+.+.+++++.+.+.+",
|
||||||
|
"++.++.++.++.+.+.++++++++++++++++++++..........+..+...+.+..+..'_]]-%$<(!~~~~!~~~~!~~~^)].:.:'%<*#$})'.+++++'$^!~~~!(:++++++++++++++++++++++++++++++++++++++++.@@,,>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=^=|>][))_)]]])<~~~~~~~~~~~~~~~~~~~~!~~~~~~~~!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!>>#.]##>~~~~~~/).++++++++++++++++++.+........+.+++++++++.+.+.+.+.++++.+++++++++.++++++++",
|
||||||
|
"+++++++++++++++++++++++++++++.++++++++..+.++.+++.+.]#$=^//!!~~!~~~~~~!~~~~~/>>>(~~{!!~<)'.'$1232#:.++++''>~!^|_':+++++++++++++++++++++++++++++++++++++++++++.@@!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!>)'__4::_=/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!(/>((>~~~~~~(]+++++++++++.+....@@@@;,,,,,@@.....+.++++.+.+.+++++++++++++++++++++++++",
|
||||||
|
"+++++++++++++++++++++++++++.+.+.++++.++..+..+....@@%>!~~~~~~~!!!~~~//{~~~~~~~~~~~~~!!~!~!>~!>=%#].:++'=<!~~!|['.+++++++++++++++++++++++++++++++++++++++++++..->!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~!<(!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{>>~!~~~!>_+.+.+.+.......@@@,-,,;,&&&&&-@@.....+...++.++++++++++++++++++++++++",
|
||||||
|
"+++++++++++++++++++++++++++++++++++++.++.+.+.......+.]>~~~{==>=>{(!~~~/!~~~!/~!!//~!^*<<^==^))'_]'#+.$!~~~~~~/=:.+++::++++++++++++++++++++++++++++++++++++++.-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!{>%#>~~~~~~~~~~~~~~~~~~~~~~~~~!!(!!!(=]]-%*>><^/!(-...@@@@----]@..@...+..++++++++.+++.+.......++++++++++++++++++++++",
|
||||||
|
"+++++++.++++.++++++++++++++++++++++++++.+..+.+...+..]!~~~!!!!!~>-%%*//>%*=!~{({*)-!~/*!/_})5>/>$___$<~~~~~~~~~~!!~~~!~~(<[++++++++++++++++++++++++++++++++++..*!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!*))#)=^/(~~~~~~~~~~~~~~~~~~~~!!(<^|$6_6_62]474].]#]]4__/**{!~~!~~!~~~{!{,;;@@;,#8]'].':++:+++++++++++.++++++++++++++++++++",
|
||||||
|
"+++++++++.+++++++++++++++++++++++++++++.+...+.+..])>!~~~!!!!~~~~!!^*>>!!!~~~~~~~!!~!/={~^^[^$[______(~~~~~~~~~~~~~~~~~~~~~/'+++++++++++++++++++++++++++++++++.%{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!%]#^(~~~~~~~~~~~~~~~~~~~~~~~~~^__474747794702a00a676776a$!~~~~~~~~~~~~~~~~>,;;;;;,,--]...+.:''++++++++++++++++++++++++++++++",
|
||||||
|
"++++.++.+++.++.+++++++++++++++.++.::+'.+....)^/(!~~~~~~(-###%-)>!~~~~~~~~{>!~~!(>>{~/)%=*!~{>={!(=^^$$^!~~~~~~~~~~~~~~~~~~~!]++++++++++++++++++++++++++++++]_=!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*-->!~~~~~~~~~~~/!~~~~~~~~!<<^^$17497b777777777[76777$a2[aa<<<^<(~~~~/>/{!~~{&,;;;;;,&&--%==|<^$[''_____':+:++++++++++++++++++",
|
||||||
|
"[___.+....+.@@)><>^_'++.)//{!!!!!!~~!~!!!(!~~~~~~~~~~~!%##]#)>%-#)*={{>!)%%~~!>>%%=!{)^/!~/%c>/%)_]>=$:'<~~~~~~~~~~~~~~~~~~~{#+++++++++++++++++++++++++++:#$)>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!%-=!~~~~~~~~~~~!=_)^~!<~/(!(]4947977477979777777770a0a06607774bb476)$^)6)*=*!~~~!!{>*{>22a=/{!!!~~~~~~~~~~~>(><$''___[|[__|^|[|",
|
||||||
|
"!!~~/{{/{//<{!~~~~~~~!^<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!<)#)>!>#########-cd#{~~~!>$>!>c{~~~=c)1=}6e6%}%]+.]/<!~~~~~~~~~~~~~~~>&*'+++++++++++++++++++++++++']']/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!%--=!~~~~~~~~~~([47:2^)=a$]_6a[699797f774777979fffa0ga0aa6007f7f77b7b:40776a%(~!>{{{{(>=48_6))_'_=!!~~~~~~~~~~~~~~~~~~~~~~~~~~~!",
|
||||||
|
"/!~~~~~~~~~~~~~~~~!!/>=*^>>/!!(~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~!>%c)c#hhhhihh%{(~~~~~>hii>~~!>*c))e)e-)c)7:+:']$^~~~~~~~~~~~~~~!*&#+++++++++++++++++++++++++$>)=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!/<=^^$$$<~~~~~~~~~~~~~~~~~~~~~~!^>>~~!~~~~~~!_4b44)j_7776774$a777777776}}}00a00aa222121a0a00f7ff6g0g0:+0g6:_g|7b[0_67777647766_4_[||$___>/~~~~~~~~~~~~~~~~~~~!",
|
||||||
|
"~~~~~~~~~~~~~~~~!%)##eekk]8#88]c-#%%=*!(!~~~!!!{{**=->!>!>>(~~!%--lllhlmlnllm*(~~{>>opmn3!~~~!{c%1/{/!/))]]8)4'#>~~~~~~~~~~~~).%{.++++++++++++++++++++++++._<!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!(2[1}4_8]]]8_)$$!!~~~~~~~~~~~~~!(~~~~~~~~!{=$$^(!!$7777[<8667779b7777f7aaa}a}aaa0ag0gagg221211a}a07f77:::q0ga7+++bf:+f0066f0f7777767677666676[%>(<^<//<>~/==^^^^/!!",
|
||||||
|
"(!~~~~~~~~~~~!^=)8ddddde8e8k4kk8kkkkk8##-%==%n%dkhkh#h#hhhhhld*=c>>&*>*>npp>>!!~!>d&!{nmmp&*!~^)}%{~~~~/*})]876]{!~~~~~~~~~~~~!~!_+++++++++++++++++++++'[|/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(=^66a}}88648)8b'4:]']_|(~~~~~/(~~/>!/^=!^^^$^[49977[2a4947/$66a777777f7000a}a000}aa0aaa112ga1111aag00f0b497707:+q+:f:970ff007f00006000000677746a6))___])))==))6)a))[)",
|
||||||
|
"6)=<!~~~~~~~~~!^#8dddldehkkk]e:ke]deeeeddddkhdhhhhkhhhhhhhhihhhihp>r*p>rmiin&p>*oclcplmmimic{>#}))/~~~~)%((=8'8:+')>~~~~~~~~~~!>=+++++++++++++++++:|(!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sf6}ccc164666}6444_8'''':_$~~!]=(!^[]'77'4'b'4bbb7977777b7_ja7967f7779f707600}000aaa1aggag211a1}1a06440}6a00g2::+:+q::9ffgff00f70ag0g0000ff77777067667774_8_7744777447",
|
||||||
|
"6668){^=>~~~~~!/tr33pcdddddddldhhlihlhhhhhhhhehhhihihiiiild>&dihiiilhiinnhilmmlihldhliimimilc%*==>!~~~~~!~<)628]_':.#*!~~~~~~~(=)'+++++++++++++++_!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!|68acc}6446686}86688)}_]]'])!(()_$_'b9b4b7949b749776f77ff022[7977676f6776}aaa}0aa6aa}}aa2g2ag111111}aaa1111111120+++::f7u90gfffff00f0g0gg000ff7ff704:7776_74:77706067f0",
|
||||||
|
"^v)[8)8))^~~(%#8)-ccmnclnnlhhdlddlllihhhhhkkhhhhiiiiiiii,>{{pnliiilmmmiiiiiimmllllllmlmiimmd%>>{!~~~~~!~~{##}668=!/)_>~~~~~~~~!*''++++++++++:_=/~~~~~~~~~~~~/%^{^=))#^~~~~~~~~~~~~~~~~~~~~~~~~~~g7acc1}7b7|^2866666688$!~(!/$#']44:4bb4774477477770f67777767649766a}66a60606}}a}}a}a}ac}a111111111c1aa21a1121o111g:b+++7::gf00ffffw0fggff0g0f7ff60007:47:+b9777600770[6_",
|
||||||
|
"!~~~!^)^~~~~~/^=1=3dcnlllndnmcdkkchidihhhhhkkkhiiiiiiiiimnmlililiiiimmmnmmnmmmmmnlmlmmmmimi%>()#%>!~~~=-^*$]%}]8]=<~!~~~~~~~~~~~{)+++++++++]~~~~~~~~~~~~~~~~~/e]6.++.=!~~~~~~~~~~~~~~~~~~~~~~~t|71cc164942~!=666676776}//)$2)4b4b447468666477666600606f7666766666}}c}}66}06a}}}1}1}ccc11a11112111o11a0a1111112o11aa7::++++:b+4776000ff0gf0f000gag0_:v:++::::970776706a5j",
|
||||||
|
"~~~~~~!~~!~~~~~~~!rnnnldedo]k+.:+.keddhdlhehkhhiiihiiiiiiiiiiimiiiiimmlmmmmnmmpnnnmlmlmmm*!!~{=%({>!~~!~~~~{$]]})6)/~~~~~~~~~~~~(#+++++++++<~~~~~~~~~~~~~~~~~!/*=]^<~~~~~~~~~~~~~~~~~~~~~~~~jv[0acdc}9b[v!56746676774868864q4747b948}cd}c}e}}}8}}aa}6af7}}676}6}}}}}c1}}}}ac}}cc11}1cc}1111121211112a0aag112o11o1212a0777:+:+++++b7fggggfggwggg70:::::9:f77ffff677777[a~",
|
||||||
|
"~~~~~~~~~~!~~~!p%ddcncdeddo1+:e6}4':+qeccdeddkhihiiiiiiiiiiiimiilllmmnlmmmmnnn{pmmnmmli*{!~~~~~~((~~!~//!!(~~/=)%>/!~~~~~~~~~~~~~*:++++++]!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!v06}}1ccc677j!~_76}11aa6646688bbb744b748ee}dcc}}ccc}111a}}}6676}}666}}}c}c}}}}a}}1}}}}}1}1ac11a22221212112222a12111111o1o132522v2fb:+++++:47000000070++++7fgg5v20ggg7+++:_'_]<",
|
||||||
|
"~~~~~~~~~~~~~~*cnncpnnncdhe+eoddk'}]::+:88k}kdhdiiiimiiiiiiiiiii&t{nmmmmmmmnnnnmmmmmml{~~~~~~~~~~~~~/~#8_4])!~~~!!~~~~~~~~~~~~~~~~<:+++++)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0fa1ccc1}a74v~~~a701c1}a7f686}14bb486466e}dcccdcdcdcdc11a6}}}66}}}}}c}ccc}}}}c}a}}ac1c111c1aaaaaaag1221222522g11aa211111o111o231226:x::+++++++::7+++:++_vj5g_2s0:++:++:05<!~~~~",
|
||||||
|
"~~~~~~~~~~~~~!t>1nnldnlnce]%odd-><]8].'++'_:8dldhiimimmiiiiiiiimp&lmimmmmmmnmnnmnmmnm*~~~~~~~~~~~~~~~~=664648)/~~~~~~~~~~~~~~~~~~~~!||_+:!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!071oc1cc}}67[(~![886_}$64as288}4848}eee}ddceccdcccccc}11a}c}}67}1cccccccc1c1}c}}a}}}}cccc1}c}aaagga2g222222a11111a2121o1111112121a4q:ff+:b::+++++++++:v!~~!5t^'+_72g_[5t~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~(~!({clcponnc*t*)<!~~~!!jj^16:'q#dplilmmliiiiiiiiimiiimmmmmmmmmmmmnnmmmi{~~~~~~~~~~~~~~~~a4486744<~~~!=~~~~~~~~~~~~~~~~~~!^(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~271cc1a}g667f[~~!/2a252a04676e6e}6}e}c}edc}dcdcdccccc11}6}}e}66}}cccccc1c1ca}1}}0}aa}}1}1c1caa0ag22a2g222212a4a21a04a1212o1112216407f0++4a2[022gv|07[5~~~~~/_:vjt!~~~!~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~>s>s3nd#{!~~~~~~~~~~~~~t$)}8kcdlclmmmiiiiiiiiiiiimmmimimmmnmmmmmnmmn*~~~~~~~~~~~~~~()4844448c<!<)]=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/(~~~~~~~~(6}1j!10af675t~~~=$676}}8}}}}}eee68}dcce}d}eecece}dcc11a0}ccc}6}c1ccc}1}1c}}}}0}a}}}a}c1a}}ca0aaaagg2g1g121107f067:+7a212221a264+72g7:+7/!~~~~~~~~!t!~~~~!5::vt!~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~!$)>5&/~~~~~~~~~~~~~~~s#11.8]8]dcnhmiiiiiilhiiimiimimmmmnnmmnnmmii>!~~~~~~~~~~~~~!6886484ee#8848=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{1c3/~~~~~~~~!!!!/(7676$!|!~/as6471}e}}}}ee}888}ec}cecdcddcc}cccc11}66d}c}}}}c}cccc1}1}a}}}}}aa}11cc}1a1aaag0g121212a1aa0660:7++:+7440::q4+::+a6++$!~~~~~~~~~~~~~~~~52:+72~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~^%^!~!!~~~~~~~~~~~~~~~~~{=odnce''#1cdliiiiikhhimiimniiimmnmmnnnnpmmnhd&>~~~~~~~~~~~^}e86}48166k6k8!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!=cc3~~~~~~~~~~=c=!26}8|~!~!_776766}}cccceecd}ec}}e}e}dd}}}d}dcdcc}6688e}}66}6}a6}ac1cc}a0}}}aa11111a1aaaaga222a2111}1a07:7++q++4q:+q:7'::+:70++_/~~~~~~~~~~~~~~~~!22:::2v!~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~(/^/~~~~~~~~~~~~~~~~~~~~~~~~~2noldk}'kdnomiimiililliiimnmmmmnmnmmnpnmnnlldd%*(!!~~~~~/84}}}a676}86a88=(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!scc1!~~~~~~~~~^c12a_^!~~~~t677666}c}cd}ccdeced}d}}eedce}e}6}e}cc}}}664777777977f606a}}766f}6aag1gaaaaa0gaga222g2aa6a6ga094:b:+b7:++:+++++:x::b|t~~~~~~~~~~~~~~~~~/2::072!~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~!t!onlnooddcdndiilllmmmimmmmmnnnmmmnpnnnpnmlnddn%c-=~~!=88a}ccnn188cdek88})>!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{1c>/2}a!~~~~~~~~/1132s!t>2^/60660}}}c}}ceec}eeed}ee}}8}e}8444488}}}66679xxx9xxx9497976779b99977aa1a}66b07g622g221g2a'2670074f++::++x:4f77fb:4002s/!~~~~~~~~~~~~~~~~(0:7gv<~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=~{ndlnocdoc8keddlnniiimimmmmmpn3p{3mmmmmmnncoceeed~~!eenoonnmnnndlnnldeco}$/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^}4)~~{}86!~~~~!jsocc1a81611a}6}6666}a}6e6e}ece}dc}ce}}88446bxxb7478fb9bb9xxxuxuux9b9bb9bb94999x90aa0a467+qu0g002221083070004b:++:x:b4:+:0aa0a00aa121a5(^!~~~~~~~~~~~!_:62!~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!~tcdmllnnncek+kddldhiiimmmmmmnpp>!mmmmnmmn3oodeed3!~cnnmnnnnnmmlmlmlllce66)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>161!(c}}61(~~!3ccccc}a6}1}}}ac}}e}8}}66686e}}}eeee}e}88}44xqxxb994769xxxxuuxuuuuuuxxx9bbbbbqxuq977f704:+b74q:bf00a112_4404:+q::::9++::9qf0060a0}1a0a2128(~~~~~~~~~~~~$4<~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tdekddlllnd]q.dlllilimmmmmmnnpnnpmmmmmnppppnopll{{nnnnppnnnnmmmllndde}6$=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!>>t~~>1cee}!~jocc1ccc11}1}}666}c}cc}cc}}8}6}888}e846848484bxxbxxxb97b9xxxuuuuuuuuuuuuuxxuxxuuuuuxbx9774:7:b4:b'b47aa6407:+:+:xb9fff7+ub77fffyff7610a66a50/~~~~~~~~~~~~/5!~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!od1dklmlmnnck'hdlmlimmmmmmmmmnmmmmnnnnppnmmmpnpmnnppnppnnnnmlndee)e)^!/%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/*/5/j{1c}c}ccc}c1111}aa}}c}c}}11}66}664bb4e}844bbb74xqxquxxxb9xxxuuuuuuuuxuuuuuuuuuuuuuuuuuxbbx:7b+::77f0:::470f79q+:x:9yfyf79+:9yfwyy9yf:4600:_v!62~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!1ennlmmmmnoc:enllilmmmmmmmnmmmmmpnnmnn3nmnmmnnnnnpnnpnnpnmncr!!{!!~~~[a!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{j*1ccccccc}ccc111}1111}}1c11}}66}}664446}8464bbbxqxuuxxxxx9xuuuuuuxuuuuuuuuxxxuuuuuuuuxxuq+:xf4xb9::b777ff077:+++x9x9xfff:++x9f9fyfyf0ff0a6:as~a=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{}pomlllmno%kdnmlilmimmnmnnnmmmnnnmmn{{pmmnnpnnmnnnpnnpmmpon}/~~~~~^6}[=!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(^>a6}ccccccc1}ac}111}}1}111}}}0}6646}6}64bb4bx49bxuuxuxuuuuuuuuuuuxuuuxuuuuuuuuuuuuuuuxxbbx:x+q+bf7:+9+:bb77gb:q++xx9x999y9x::9yyy9yy9f0aaaa0q:2!!a!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2dcdldmicdooppocllliimmnnmnmnmnmmm3!!~~{mmnnnnnnpppnpnnmmm}c!~~~~!<^^1=<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t>168cccccc1ncc}1caaa}}6}}ca1c}a}679bb97b77b99bxbqxuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqxxxb:u+ubb9bbf:qbbf7bb99xuxxxx99xxx9q9yy9999fgf2aag047g(~!^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~thhhhdlmnncccoponniiiiimmmmmnmmnmnp*p>{{pnnnnnpppppnpponmlee{~~~!~~~~~~/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!a4}ccccc1c}:8a}c1aa}}}6}e}}}}67b7g77b6vr7qxxxxuuuxx4|s5buuuuuuuuuuuuuuuuuuuuquuuuuuxuubxuxbx9xu++47fb:x:x9xxxxxuxxxxxx9xxb9y99999wgga2gg007as~~t=!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!8keedncd#.:]'eopnnnmiiimmnmmmmmmmmmnn>>&!{{3nnnpnppppoolndco*>{!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j}ecccncc8:+}a2a6}}0}6}76}846860t~s645s5bxxxxxxuub5!~<0uuuuuuk#quuuuuuuuuuuubuuuuuuquxuuuuuuuuxxxu+:bbx9x9xxxxxxxxxx9xx99:9999799fgggg1ggg0^~~~!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tkhkhhln}k'+48]:ok3pnmmnmmnmmmmmmmmmm>!di&~{3nnmmnmppooon>t>c*/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s}cnccncc1:1165t566006a676}4b70j~~~^ajt^4bxxxuxuqg~~^q+uuuuuk,dquuuxuuuuuuuuuuuuuqxxxuuuuuuuxuuuxxxuu999x9xxxuxuuxxxxx9x:ff979fyyf22g21g0gs~~~~s$j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{hdhkhhickkk'8:ee'}onnpnmmmmmmmmmmmmm{{lll>olmp33nnnpnot~~~>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/=</({!3}dcn11}1stt1}62t5666}a74667bba~~~~~~~~~t2499xxxq7~~t'uuuuuuukquuuuxxuxuxxxxxuuxxxuqqqxxxxxuuuxuuuuuuuuuxuxuxuxuxxx9x997ff0f707fgggag12aa/~~~~!267)/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sdihkhhhdhk8e]:'#k]enmmmmmmmmmmmnmnmn{!llmn*>pppppp3ppt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!64611111::cct~~!~!<j}6fs~t5f80697777bj~~~!~!~~~~~t7bxxuuqv~~t_uuuuuquuuuuuuuuxxxxbuxxx9qu+uxxux9x99xuuuuuuuuuxuuuuuxuxuuxxxx997gagaa1g0gga02jjj!~~~~!=2[2j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tiddhkkhkkqu}'8]8+:.onliiiiimmmmmnmnnpppnnprpnppp3rpp*!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~a7f66ff6a:1r!~~~~j5~!=77fj~tg7794999x2jj504705t!ttgxxxxuq:|~~^2quuuuuxuuuuuxuxxxxbxqu:q:xxxqxxxxx9uxuuuuxuuuuuuuxxuuxxuxxxxxy04aaa01agagga2!~~~~~~~~~>!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(llhhkkqh8qu7:+]o'q+oolilihiiiimmmnnnnnnpnpnnp3333p3t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~a7f9799775!~~~~~~|0~~~t|b7|t[b9972vff0bbxxxxqxb979xxxuxuxx:!~!'buuuuuuuuuuuuuxbxxq:+++xuxuuuuuuuxuuxxxuuuuuuxuuuuuxxxxxxxx9x7f0ga1s11aggga/~~~~~~~~~!2^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tcilehkkkquu4:86]8.:onnhdhhhhiimmnmmmmmnpnnnnp33rp3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(bb979qxx7~~!!~~~~0g~~~~~v7t!j7b75~jf9xxuuxuuxxxxxx9xuuquqq7~~~_uuuuuuuuuuxuxxuqu+++uquuuuuuuuuuuuuuxuxxuuuuuuuuuuuxxx9999x9900a1s!52s5aagt~~~~~~~~~~(6[!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>diekkkqkqq4:1o1]q'1oldiiihhkilmmmmnmmpnnnnnpr33pt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(bxbbxxuu7~~~~~~~~!!~~~!!jf~~~5790/!g9xxuuuxxxxx9xuuuuuxuxqv~~~tuuxuuuuuuxuuxuux:u:+:uuuuuuuuuuuuuxxxuuxuxuxxxxxuuuuxuxxxyffffa2j~~!~~!a66(~~~~~~~~~~sa<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!3hd'kkqqqqqkoc.+:.enldihddhhhhlnmmnnmnnnn333rp3!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7bbxuuu_(~~~~~~~~~j~~<':5!~~~!|bg(!5y9xxxxuxx9xxxuuuuuqquu7<~~tuuxuuxuuxuuuuxbx::++u:uuuuuuuuxxbxqxxxuxuxx99999xuxxuxxxyffw00aa}j>s!~~/2g_!~~~~~~~!sa1!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!ohcqquuqu4kcn}e.:8nlhhhiidhhkmmnnnmmnmnp3rrrpp!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!g70v5!~tvg0g07f9x7!~!<!~~~~~!|j~~~vg9fgfbfg9uuuuuuuuuuuuqu_$_qxqxxxxuxuuuuuxquxq:++xquuuuuuq99q:xubxxxxxx99yyxxxux999ff0f00a}}a}/!~~~2a2/~~~~~~/1112~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{dkquuuquukkcdc'.}3nlhhddhdhdllmmmmnnnn3rr3pnp~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!v5jjvf9xuuuuuuuu:j~~~~~~~~~~~(^<!(~!~~jvj5xuuuuuuuuuuuuuuuuuuuuxxxxxxuxuxu:q::++:+++++qqq++u+ux:ub9q9f9997f9f9999fff00000a}ec=!~~~~~511/~~!/s>11}=/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>c8quuxuxq8k]38]ppcehkhlhllmmmmmmnnnnprrronp{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~vuxuuuuuuuuuuuuuu9j~~~~~~~~~~~~!(~~~~~~!=!jquuuuuuuuuqxuuuuuuuuuuxxxxxxuquqx9b09+++:u:uxxxx+x+qxxb+q:xbff9f0ff00gfggf0a0}}}}cc2!~~~~~^5(~!<}12o={!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tj6uuuuux8]eoc8cndqqbkddhllnllnmnlncp3r33{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tgxxxuuuuuuuuuuuuuu45~~~~~~~~~~~~~~~~~~~~~~!auuuuuuuuuuuxuuuuuxuuxuxxxuxxquxqqq7bbb:++++xqxxxxu+xxx:x::++b7fff6fffgffff000}cce}}a^~~~~~!~~(2o1^s/!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jb4uuuuqcer311ocbkqqeldddllmlmmnonnp33!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!9xu9uuuuuuuuuuuuuuuuu97gj~~~~^:_5!~~~~~~~~~(kxuuuuuuuuuuuuxuuuuquuxx9xxuxxxxbb9qqxb7:++++:x9bxxx:xxx++:+++:b000f0wg0f0f00}ac}c}e}_!~~~~~~~($2(!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~a46buuu8co33on}bqqkkddeehdilnnnnmnno!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0uxxuuuuuuuuuuuuuuuuuuuuu7j!~juuuu:[|/!!/(!jauuuuuuuuuuuuuuuxuuuuquxxxbxuuuxb999bu4747q++++:+b9xxb9:++:++:++:b77gfgfggff}}6c}}}cc}6$~~~~~~~~=/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!65tuuuq8eonnd84bxk4eekqhlinn33nnmm3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~fbxxxuuuuuuuuuuuuuuuuuuuuuu:|vuuuuuuuu::48quuuuuuuuuuuuuuuuquxuuuxqxxxxuuuuuuxxqxb46797y7:+:+:::b::u+u:q+++++++:fggg0ag0a}}}a8}}ce6=!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<$tguqu4}8}oc87xb8ekk}21o*t~~!t{rno~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jbxuxuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu0jaquxuuuuqxxxxuxuuuuuxbbbxb9bbf7b+++:u++:bf_:+++++:+bgggfgg0a1a1c66}8}c})!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s%j0uuq8qb}o148behc{~~~~~~~~~~~~3n!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/~(<!v:quuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqquuuuuuuuuuuuu0~~'xquuuxuqqxxquxxuxxquuuux9bbxb7f9+++:+++++++++++b72gggggga111}}}}}ecdc*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^]/tgub}}4kcc18}e}!~~~~~~~~~~~~~rn>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!/!5:uxuuuuuuuuuuuuuuuuuuuuuuuuuuubuuuuuuuuuuuuuuuq^0qxuuuuuuuuuuu5~j6qxquququxxxuxbqxquuuuux79bbxbb70f7+++:++f77g4bag2ggg0g0a111}}}}6e})=!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<%/~aq06b44}ecndo~~~~~~~~~~~~~~tpn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(:uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu9uuuuuuuuuuuuuuuq{!4buuuuuuuuuuuu5~~<[a54bbqbquqxxxxuuuuxxx7677bqbb777f7fgf0ggfg00ggaggggggaa1aae}e}cc&~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/]~j6807bqec3od>~~~~~~~~~~~~~~~{{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7uuuuuuuuuuuuuuuuuuuuuqxuuuuuuuuuuuuuuuuuuuuuuuuq$~<447xuuuuuuuuu4_~~t$2<)74q44477xxxuxxxx977779bbxb9bb766aggggg0000gggggggaaa1a}cccdc/~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!_>~t}4b64edppk{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~juuuuuuuuuuuuuuuuuuuuuuuquuuuuuuuuuuuuuuuuuuuuuuuuq/!_77xuuuuuuuuuu7jj[+a~!~~t!!~!t4buuxx97f9997xxqbbxbb460a0ggga000ggggagaagggaaa}ccc>~{^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^/~!6661o1npc{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~juuuuuuuuuuuuuuuuuuuuuuxuuuuuuuuuuuuuuuuuuuuuuuuuuuu0~t674xuuuuuuuuuuuuuuk_^!~~~~~~~j6quxx9979997xxxbxbb4466}00gaga00gggg2g0aaa2g1ccc%(~!2^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tck}p33nn!~~~~~~~~~~~~~!t{{!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuxuuuuuuuuuuuuuuuq^~j74uuuuuuuuuuuuuuuuqb|~~~~~~~~!0997b79b97fbbxbxxb468#caa000ag00aa1gg0a}aa}12^/!~~~|t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s}cc333nr~~~~~~~~t!~~~~~!!ttt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~juuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuxxxuuuuuuuuuuuuuuuxb!t:buquuuuuuuuuuuuuuuu2~~~~~~~~~577g7799979xxbbbbba^>!(}a0a0aa0ga1122a25115/~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sonpppppp~~~~~~!rpp~~~~~~~~~{rt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!7uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu99uuuuuuuuuuuuuuuquq5~[bbuuuuuuuuuuuuuuuu_!~~~~~~~~~~5js79477x9bxbxbb'!~~~~2a0}a01aa}}1a25!~jr!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!ndnp33ppt~~~~~t33{~~~~~~~~~~!!~~!t!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuxuuuuuuuuuuuuuuuuub2~!2quuuuuuuuuuuuuuu4~~~~~~~~~~~~~~s79967x99xbbb$(~~~~~!566ggga0}}cc1!~!1^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3nn33p3r!~~~tr33!~~~~~~~~~~~~~~{p3!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~vuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu4t~!7quuuuuuuuuuuuu:v~~~~~~~~~~~~~~t797f99x9bbbg~~~~~~~~t006ag00}1}11~~(a{~~~~~~~~~!(!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!r3pcp3r33rrr33~~~~~~~~~~{~~~~~t~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5uuuuuuuuuuuuuuuuuuuuuuuxxuuuuuuuuuuuuuuuuuuuuuuuuuuuux:~~j:uuuuuuuuuuuu0(~~~~~~~~~~~~~~~!f9977bbxx4v~~~~~~~~~~v076aaa0a}11s!~~~~~~~~~~~~^1(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{s3pp3rr3rpp~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu5~!$uuuuuuuuu:0<!~~~~~~~~~~~~~~~~~09yyx99b7<~~~~~~~~~~~26aga0}}a}c}32~~~~~~~~~~~~2a/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t{~ttpp3p3r33{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux6(~5uuuuuuuu:/~~~~~~~~~~~~~~~~~~~~5b999xbg!~~~~~~~~~~~~!jtsg0a6a}1a115~~~~~~~~~~(a2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~rppr33nnp3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~juuuuuuxxuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuxxxq4j(quuuuu_<!~~~~~~~~~~~~~~~~~~~~~~f9999bj~~~~~~~~~~~~~~~~t0006a}6a111!~~~~~~~~~~22j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!ttrrpp3{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!9uuux999xxuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuxxxxu8s'u:'[j~~~~~~~~~~~~~~~~~~~~~~~~~v9x9xb5~~~~~~~~~~~~~~~~~26a760}}a12t~~~~~~~~~~52>^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!3pp{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[9xx99yyy9xxxxuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuxxxx9xxb4a$j~~~~~~~~~~~~~~~~~~~~~~~~~~~~j9xx99<~~~~~~~~~~~!!~~~~5}jv600}a}at~~~~~~~~~~(5t5(!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!ppt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j06000fgfy999x9xxuuuuuuuuuuuuuuuuxxxx9xxxuuuuuxxuxxx9xb9xbb4v~~!tj|_(~~~~~~~~~~~~~~~~~~~~~~~gbxx9~~~~~~~~~~~~~~~~~~sa!~j6666aa!~~~~~~~~~!~t2ts/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{n{~~~~~~~~~t>3tj~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!acc}0aa6f999999xuxxuuuuuuuuuuuxx99bb9xxxxxx999xxx9xx9bbxbqqg07uu++<~~~~~~~~~~~~~~~~~~~~~~~t4xx7~~~~~~~~~~~~~~~~~~5^~~~2a0}2!~~~~~~~~~~{~!23sj~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~r3!~~~~~~!3ppop33s{~~s!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!o}}}}}}}}}}}a7bb46xxb76bxxxxux9977799yyyy99999xxxxb9xxxxuuuuuuuu:~~~~~~~~~~~~~~~~~~~~~~~~~fxbs^~~~~~~~~~~~~~~~~!22~~~!s)=~~~~~~~~~~~/~~~<>ss~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!3pr!tt~{ppp33r3oooopn*!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{c8}}}ccccoc}}06}a67a1a667b4977}}6}a7f99yyy9999x9x9bxxxxxxuuuuuu|~~~~~~~~~~~~~~~~~~~~~~~~~54js45~~~~~~~~~~~~~~~~a4j~~~(s~~~~~~~~~~~!!~~~tss1j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{{~tpr33rr3r3nooooonn=!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!)88}cccncc}}}1a}a}}}cc1}}6}aca11cc166f6f99999xbb9x9xxxxuxxxxuu:!~~~~~~~~~~~~~~~~~~~~~~~~~~!~57[~~~~~~~~~~~~~~~~t6g!~~~~~~~~~~~~~~~~~~~!s>a25~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t3rrrrr3ooon313ooabj~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!>686ee}e}446}}}a0}c1cc1}ccccc1ccccc}}}66f7999xxbxxxxxxuuxxuuuv~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t4a~~~~~~~~~~~!~!~~~j6gt~~~~~~~~~~~~~s5~~~~!!15!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t3rrsr33oono3o3o31a)(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t}846888846>t~!t1}}cce}cdnclcnccclc}c}67999b9xxxxxxxxxuuxuu:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~~~~~~~~~~~~5jt~!a70!~~~~~~~~~~~s}6$!~~~~t!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t3rrr3333po333ooo3o1)a|0|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!^)^(!!(j!~~~~~<$12ccccccccnccncndcc6694x9x9xxqxxxxuxuxuuuj~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~546j!57bg~~~~~~~~~!2a67g~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!rr3333o3333o333o3331264q7/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!sc}ccnccncncccc}67799b9x99xuxxuxxx99xuv~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!540sj67g~~~~!~~~!s1aa2!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t2r333333pooo3333o3poo1}a}a~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tac}cccc1nccc}}8679bbb9x9xxqxxuq9x9xqv~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t568s247!~~~~~~^a11a6a~~~~~~~~~~(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(31r3oppp33popp3o3o3pooooooo!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tc}}1ccoccc}67677799b99b9bxxxqqxx99f(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j387620/~~~!0a}111}07<~~!~~(!~^s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>3r333o333333opp33oo3opoopno{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/}}}}}}acc67b77677994b9xbbbbxxqqb9[~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!t66b61j~~~(bb4a11a60j!5>22^~~^v~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%srrro3p3333333333p33p3opooooo!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2}}c686}}6877777y99949b5sbbbxxxx9a~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!j}4b}s~~~!9bb6aaa70~sttsj~~~^t!/j|j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t1rr33333333333oo33p33o3o333pnno{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2686646}666449979999b94j^xbxx9xb0!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(j26442s~~~vxx6a077t~0f7a5(t~/~!/076/((t!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$1rr3333p3333333333o3333pp3onnnonost~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j476666676979999999999464b9bxbx0!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!r76b67^!~t7qf6f9v~t797t~jj!~tjjt215~311>j!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^13r3p33333r333p33r3333o3oooo3nooopoo/!~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~587476674999x9xx9x9b99bb9b9999t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!569b4j!!~jvgg7bj~!6v72~~~$j$22!<6}2ooco112(~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~to33333333p333r3o333o3oo3o33oooopo3cd647x9<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5646776f9b9999x9x999xxxbbxxx0~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~v446t~~~~~~~jj~~~2220t~~t~~~!~~t!=1coooooo^(~~~~~((~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!'13p333333pp33333o3p3p33p33pooonooon1}4f9x9j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~a74477799999x9x9b6b9xxx9bxbj~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j66t~~~~~~~~~~~~//t^t~~~~~~~~~!!~!{cooo3oo1!!({!<!~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:13333r333r33333333333p3opnpopononoco}607xx71>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<64477b999999999xf49xxbb9bb<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ts60vtjj!!~~~~~~!~~~~~~~~~~~~!^~~~>ooo3ooo}<~!!~~~~!~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$}33333r3333p333333333p3p3ooopopoooccc007qxb66!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!6444799999999x9xb7b9xxbbbq2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5[777462t~~~~~!~~!~!(~~~!/~~~~~~>11ooo>3}s~~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>1r13333333pppoop3333pp3popooopooc}e60f747744/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~g4444b9x999xx9bbb7bb9bb9bqv~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!jgg$2<^^^j^^/ss52!~~~!~~~~~!{sa6a/~t51(~~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=31333333pop3p3p3333oop3popopooo160006}cce77j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~644b49x9999xb946444q9bb9bx0~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~!!t2st~sa2t~~~~~~~~~~~~~!//!~~!>1/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{or33333333p33op3333op33poonoooc146a6}ccdc40!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<b4q4bx9xxx9xb4bqq4q44b9bqb<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!/~!5j~~~~~~~~~~~~~~~~~~~~~~!t<(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)1333333333333o33o3ppo3pponooo167a}}c1ccc1!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j44kqqxx99xxxq444kbbk6bxbbbg~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~~~~(s{!~~~~~~~~>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/[333333p3r333333p3oo33ooocooca7}}cc}0}})~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$qb4qbqqxx9xxxq44q4qkebbbbq|~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s2a6a%^~~~~(c!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)a3r3333333p333p33ooo3onnoco167a0}0}}66/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<q4qquqbuxxxxxxbqbk4b48kbbbb|~~~~~~~|4~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~!297761s~~~~/c3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~()133p33333o3o331o31o3o1ocoe0797446}}4s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~_b4qquuuuuxxxxbbbkbkk48k4q4qa~~~~~~<k:5~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j21tsf79701>~~~~^7a^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~]c28r2rr33o}11211111oponc169999b7}e88!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!qubqqqquxuuuxb7bbqbk4kk4kkk'^~~~~!<84:^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<a0f009f97f05!~~~g7}6s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!))86}3a321}664b76}ao3o1o}bbb97q7868}!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<uqqququuuuuuxqbqbqkk4k4k#@@=~~~~<88:q'!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!s6f9fffyyfy9ff0j~!67}}>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^'':181o}}4bxuuq4}1oooc84qq8686668}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<uuxuquxuquuuuuubbqbqbkkk#)/~~~~~)44qq[~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$7ffwfyfyyyyyywwwv5707}o!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=]}18c}6bxquuub8o1o}}ek48cc868}}c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!:uxxquuxuuxquuqquqqbkbkk%~~~~~~~644:q<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tfyyyyyyyyyyyyyywwfg206g2(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<]}8k}quxuuuuukc1}e44qqq868e}e}=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<uuxxuuuuuuuxuuxqxqqbk4=!~~~~~~~$44::!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jw999yyyyyyy9999yywwf6fa}a2j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(q4'#4bxuuuuux488444kbq4}6e}eee{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!7uququuuuxuu4xuuuqxqq6~~~~~~~~!64qq_~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jvgy9y9999wyyy9y99y9yy9y9ff6600a^~~~~~~~~~~~~~~~!~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!::qu67xxuuuuuqbqq88}ec}e}}}e}e~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<uxxuuuuuuuqxquxqxxbb4t~~~~~~~<44bqv~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t[ffwwwwyy9yyyy9y9y9yyy9x9y9gfff0a0j~~~~~~~~~~~~~~!(~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~q77b64xuuuuuqb4q4ecccoo}8c}68s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7uuuuuuuuuuuxuuquqqbq/~~~~~~~[b6b:!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<:uuywwwwyyywyyyyy9yyy9y999yy00fff6a1/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!u4b4667xuuuub4bbkdcddoo1c}e}$~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$uuuuuuuuuuuuxquqxqbq^~~~~~~~^4647~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<uuuq9ywwyyywyyyyyyyy9yyyxx99ffyff00aa!~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<q6u4}bxxuuxqkebq4ccdnncn12/!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|uuuuuuuuuuxuqxuuqqbq<~~~~~~~/:4q^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[xuxx9yyyyyywyyyyy999999xxxx9yffyf0a002!~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^:7q40bxxub66}e488ooconn{!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~juuuuuuuuuuxuxuquuq[(~~~~~~~~~^[<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<xxyy9xyyy9ywwyyyyyy999uuuxx9xyfff0000a2~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^qbq74buuuf7q}}6kkconoo!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~juuuuuuuuuuququuqu:!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<yyy9yyyyyy9ywwwyyy999xuuuu9999f00fff06at~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[:uq67xuuuub6}}646doon3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~_uuuuuuuuuuuxxuux:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!9yyyyyyfyyyyyywyyyyy9xxuuxux9yyf0ffyf00j~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!bb:b0abquqxb}c164qecno>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j:uuuuuuuuuuuuuuu|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~gyywwwyyyy9ywyywy99y99xuuuuxx99yffgfw005~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!:9q46}}buxx4}48kqxecnc{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5uuuuuuuuuuuuuu[~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t9yywywy9yyywywyyy9y99xuuuuuuu9yywff067<~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<q06086kqquq7xb6684ecn/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~4uuuuuuuuuuuu_!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~f9yyywww9yy99yyy9y999xuuxxuuuxxx99ff66!~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<7abbxqxuqu41q4}ec}oo!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/uuuuuuuuuuu:j~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~v999yyyyyyyy999yy999xxx99yxuuuuuxxbfa_~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<7_6xxxxubbc}4}conco{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!buuuuuuuuu:!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~57y9yyyyfygv<!~!~jgyxxxyyyy9uuuuux9y4v~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<0:a9xuxux611}ocnon*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:uuuuuuuu[!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~27997779fj~~~~~~~~~vxxf9yyyy9uuuuxb9g~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^a4fxuuxuu4cocnpce3!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<::_v^^(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^776<t~!!~~~~~~~~~~~[v09yyyyxuuuuxx7!~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[66xxuxuxuq6oo3*c_(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(j~~~~~~~~~~~~~~~~~~~^|7yyxuxxux9xv~~~~~~~~~~~~~~~~~~~~~~!~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jb'7uxxuuuuuxb6>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(~5f99xxx9994!~~~~~~~~~~~~~~~~~~~~~~~/~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~g6abxxxuxuxxuuuq<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~![7y9y99770~~~~~~~~~~~~~~~~~~~~~~~~jvt~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jf84quxuxxuxuxuuq<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!/2[5a_5!~~~~~~~~~~~~~~~~~~~~~~~~~j2v2!~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~50:4uuuuuuuxuuxbv~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!v3vt~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j94qxuxuuxubv(!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!~!(~~~~~~~~~~~~~~~~~~~~~~~~~t5j~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~v:0xuuuuuxu:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!a=}(~~~~~~~~~~~~~~~~~~~~~~!53(s~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~f:4uquxxu5v<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=}1!~~~~~~~~~~~~~~~~~~~~~~[a^~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2[9xuuuuu2<~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!=(~~~~~~~~~~~~~~~~~~~~~([15~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t56bxuqxq_/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~![g1j!~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!^6buuuu4$~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!a5a=~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j54bxqx:^!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/2/!~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~![_4bxuq6~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5q84xxu4*!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t):8bbuq4>!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(6:_xbxu|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!$:8xxq[!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2:49q:j~~~~~~~~!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~t[:xq9<~~~~~~~~(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5:6fb:!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<$0bx7^!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(|[|(!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/^((~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(/<'_[)!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!]:${~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/~(~~~~~~~~~!//!~~~~~~~~~~~~~~~~~~|_~~~~~~~!(!(!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~![:']&/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|_+++:|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~|<~~~((<|(!<:::'_[|<(([::.'#=!~(/!<<||[(~(|[[['+[[<<<!~~~~~~~!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~$[::$**&{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!(|<':+++++++:_||^<<<(!!~~~~~~~~~~~~!([_''+++++:++++++++++++++++++++++++++++++++++++:++++++++++++++:_|</~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!<++^**&>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(!~~~~~!|:+++++++++++++++++++++++++++!~~~!~~~[:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:_|<(<~~~~~~~~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(_'(<_+++.,*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~([++[<^~|+++++++++++++++++++++++++++++:!!~~(<[:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:'''[<!~~~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<!~!'+:_++++++%!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!~~~~~~~!~~~!~!((<[[|(!|[[__'_[|<<(<|[_:++++++++++++++++++++++++++++++++++++++++]&&$++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:_[[[|/~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!/$$)'++:_++++++=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~':+|(|+_|['<(_+:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#-.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:|<~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<$':::[~~~~~~~~~~~~~~~~~!~~([_#++:[$++++++#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!<_+:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<|(!~!!~~~~~~~~~~!|(~~~~~~$::++++:'_':::::_||((~~|__/<')'$__]'+++++++]!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~![++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++::$~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!~!(/[_''+++:+++:'_:_'___:++:':::':+++++++++++++++++++++++++++++++++++++++++'!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(||[+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:|(~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!(/<|[_'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:|/!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(<'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:/!~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~~~~~~~~~~(||[+:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:']|^/!~~~~~~~~~~~~~~~~~~~~~~<||+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'~~~~~~~~~~~~~~~~~",
|
||||||
|
"~~~~~~~~~~~~~~~~~~(||[[|<^_]:_++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..'$(!~~~~~~~~~~~~~(|['++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|~~<^<~~~~~~~~~~~",
|
||||||
|
"~~~~~!(|['_____::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++::__'_':+++::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:::$^<((!~~~~~~~",
|
||||||
|
"(<|_:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++:_|(!!",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||||
|
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
215
wmglobe/src/defnimap.xpm
Normal file
215
wmglobe/src/defnimap.xpm
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * defnimap_xpm[] = {
|
||||||
|
"360 180 32 1",
|
||||||
|
" c None",
|
||||||
|
". c #020204",
|
||||||
|
"+ c #3A4347",
|
||||||
|
"@ c #461F11",
|
||||||
|
"# c #0D2939",
|
||||||
|
"$ c #5C5C59",
|
||||||
|
"% c #653E21",
|
||||||
|
"& c #2F251C",
|
||||||
|
"* c #422F11",
|
||||||
|
"= c #151414",
|
||||||
|
"- c #662F14",
|
||||||
|
"; c #474F54",
|
||||||
|
"> c #26393C",
|
||||||
|
", c #29120C",
|
||||||
|
"' c #464543",
|
||||||
|
") c #6E6E70",
|
||||||
|
"! c #1A353C",
|
||||||
|
"~ c #574A49",
|
||||||
|
"{ c #765A34",
|
||||||
|
"] c #764A24",
|
||||||
|
"^ c #562E1C",
|
||||||
|
"/ c #0C0E14",
|
||||||
|
"( c #6E3917",
|
||||||
|
"_ c #302E28",
|
||||||
|
": c #291C17",
|
||||||
|
"< c #423A1B",
|
||||||
|
"[ c #373836",
|
||||||
|
"} c #161D14",
|
||||||
|
"| c #1A2427",
|
||||||
|
"1 c #5A3A24",
|
||||||
|
"2 c #65625C",
|
||||||
|
"3 c #5A524C",
|
||||||
|
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
|
||||||
|
"!!!!>>>>>>>>>>>>>>!>>>>!!!!!!!>!!!!>!>!!!!!!!!!!!!!!!!!!!>>>>>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>!!!!!!!!>!>!>!>!>!>!>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!",
|
||||||
|
"!!!>>>>>>>>>>!!!>>>>>>>>>>>>>>[+>>>+>>>>>>!!>>!!!!!!!!!!!!!!!>>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>!>!!>!>!!!!>!>!!!!!!!!!>!!!!!>!!!>!!>!!!>!!!!!!!!!!!!!!!!!!!!!!!!!!>!>!>!>!>!!>!!>!!!!>!!>!>!!!!!!>!!!>!!>!>!>!>!!!!>!!>!>!>!>!>!!>!!!!!!!!!!!!!!!!#!#!#!##!##!#!##!##!###!##!!#!#!!#!!#!!#!!!!!#!!#!###!########!##!#!##!",
|
||||||
|
"!!!!!!!!!!!!>!>!!>>+>+[[>+[>+>>[>+>[>+>[+>!!!!!!!!!!>!!!!!!!!!!>>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>!>!!!!!!>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>!!!!!!>>!>>!>!>!>!>!>!>!>!!!!!!!!!!!!!!!!!!>!!>!>!!!>!!>!!!!!!!!!!!>!!!!!>!>!!>!!!!>!>>!!!!!>!!!!!!>!!!>!>!!!!>!!>!!!!>!!!!!>!!>!!!!!!!#!!#!!!!#!!!!!!!!!!!#!#!!!!!!!!!!!#!!!#!#!!##!#!!#!#!!#!#!!!!!!#!#!#!#!!!!",
|
||||||
|
"#!!!!!#!!!!!>!>!>[>[[>+>+>[[[+++[[>>>>>>!>>>>+>>+>>>!!!!!!!!!>!!!!!!!!!!!!!!!!!!!!!!>!>!>!>!!!!>!!>!!>!!!!!#!!#!###!#!#!!!!!!!!!!!!!!#!#!!!!#!##!!!!!#!!#!!#!!!!!!!!!!!>!!!>!!!>!>!!>!>!>!!>!!!>!!!!!!!!!!>!!!!!>!>!>!>!>!>!>!>!!!!>!!!>>!!!!!!>!>!!>!>!>!>!>!!!>!!>!!>!!!>!!>!!!!!!!!!!!!!!#!!#!!#!#!!#!##!#####!##!####!##!!!!!#!!#!!#!!!!!#!!#!#!!!####!#!!!!!!!!#!!!",
|
||||||
|
"!!!!!!>!!!!>[[>>[>++++++[>>>>+'[+>+>>>>>>!>>>+>+>++++++>>!>>!>>>>>!!!!!!!!!!!!!!!!!>!>>!>>>>!>!!!!!!!!####}}}/}}}}}}}###################}}/}}////}/=///==/=/#}#}####!#!!!!!!>!!!!!>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>!!!!!>!!>!!!!>!>!>!!!!!>!>!!!!!!!>!>!!!!>!!!!>!!!!!!!!!#!#!!!!!#!!#!!#!!#!##!#!#######!!!#!!!!#!!##!#!!#>!!!!!#!#!!#!!#!!#!!!!!#!!#!#!#!!!#!!",
|
||||||
|
"!!!!!!!!!>!!>>>[>++++[';++>+>++++>+'';+[[>>>![>[>+[+>>+>+>!>!!>!!>!>!!!!!!>!!!>>!!>>>>!>!>>!>!!!|#}#==..../...../........//=//=}//}/=//............././/........./=}}}}######!!!!!!!>!!!#!_!#!!!!!!!#!#|!#!!!#!#!!!!!!!!!!!!!!!#!!!#!!!!#!!!!!!!!!!!!!>!!!!!!!!!!!!!!>!!!!!!!!!#!!######!!!!#!!!!!!!#!!!!!#!########!###!##!!!!!!!!!#!#!!!!#!!#!!!!#!##!!#!#!#!#!#!#!##!",
|
||||||
|
"#|#>#!!!!!!!!!!!>>>+[++>+[>>>>>[>>[[++>+>'++'>+>>>+>+[!>!>>!!>!>!!>!>>>>!!!>>!!!!!!!!!>!!!}=/.//.///}#=}|#|!#|##/}///................/}=}/|}#}_!#||###/}}}//............//==}=}#|#_!#>#_#}}}}}=//////}}/}/./=##||#||||#|!#!##|#!##||##|!#|#!#!|!#!!!!!!!!!!!!!#!!!!!#!!!!!!!!>!|#|#!!!#!####!!!!!!!#!!##!!######!##!#!!!#>!!!!>#!!!!!!!!!#!!!!!#!!!#!!#!#!!!!!!!!!#!!!!!",
|
||||||
|
">!!!!!!!!!!!!!>!!!!>!>>>>+>>>>>>>>>>>>>+>>>>[>>>>>>>>>>>>!!!!!!>>!!!!!!!!!>!!!#!##}}=/../=|}|||_||_||>##>>__>_|||}=//..=}|#!>>|#|}|>>|!|!!>[[>>+>+!!!>##}#/}}//.../........./..//}}}==/....................................//...............///..../////}}#|}===///=///=/}||==}}=}/=}}/}}}/}####!###!!!!!#!##!##!!!!!!!>!!!!!!!!!!!!!>!!!!!!#!#!#!!!!!!!!!!!!!!!!!!!!!!!",
|
||||||
|
"!!!!!#!_#!!!!!!!!>!>>>>[>![>>>>>>>>>_>!!!>!>!>!!!!!!!>>!>>>>!>!!!!!!!!###}/........./|>>|//=}}}|}|#|=:|&_|>#>||=./:|!|>>[>>>>[>+>>>[>>[+[+[>+[+[+[[[>[+>>!!#######//..............................................................//==|..../}|#/||./=/../////.................../}!#|......./##!!!!>>>>>>>>>>!+!+>>>>>!!>>>>>!!>##!!!!!!!!!!!!!!!#!!!>>!!!!!!!!!!!!!#!#!",
|
||||||
|
"!!#!>>!>!>!!!>!>!>>>>>>+>>>>+>>>>>>!!!!#!!!!!!!!!!!!!!!!!!>!|##|#}}}................=|_[>++_}==}/}=}|_>!>_|==...../_[+>+>'[++[>+[+>++>[+[>++>>>+>+++[>+++++!#}#/=/.............................=}=}/_::|__|>!&/...................../...........................................//}|}==/.......##!!+>++>+>+>+>+>>>!>!!#!#!!!>>!>!>>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>!>>>>_",
|
||||||
|
">[>>!!>>>>_>>!>>>!!>>>>>>>!>!>>!>>!>!!!>!!!!!>!>!!!##}}///.........../.....}=///..//../:>>>|}=/==}|!!_||}=.//=:|!>!>>+>+++>+>+++++++>++[>+[+'[+++[+++++++[+>!##.............................../=|_&|||_:=/...........................................................................//.//.......#!>>>>>>!+>!!!!!!#######=#=###!##!!!>>>>!!!!!!!>>>>>+>>>>+>+>+>+>>+>+>>",
|
||||||
|
">>>>[>!>>!>!!>!>>>>>>>>>>>_!!!!!!>!!>!!!!!!!!!!!!##=/........../...///............../.../=.//}/=}=|>_#=/....}||__>[+[[[>[+>'>[>>[>+>+[+++[+[++[[++[++[+[+>>#!}/.....................................=//....................................................................................//.....//}!!!!!!!!#!#!!!###}|}|#/}}}==#}##!!!!!!!!!!!!>+>>+++>[>>>[+![>>[>>>>",
|
||||||
|
">>>!!!>!>>>>>>>!>!>!>!>>>>!!>>>>>>>>>!>!!!!!!#!!!!!!!!..../=}=}=//..../...../..///../}=/===/==|}:|||_=.......//|>&>!__!>>[+[+++++++++++[++++[+++[++[+++'+[_!##....................................................................................../=|_/..........................//.../=||||}=//=/./##!!##|#}}##|!####!#!!!!!!>[>+>>!!!!!!!!!!!!>>>>>>+>++[>>>+>>>>>>>",
|
||||||
|
">>>>>>>!>>>!>>>>_>>!>[!!>>>>[>>>>>>>>!>!!!!!!!!#!!!!|...../../.}}=#=//=|/=..///=|:/./=./|:}=///}#+>!=.........../......./=>+[[++[+[+[+++[+['+[+'+'++1+[++['+_#}...............................................................................}##>_==//......................//==::::||=&|:&|_||||:|:=/=..............}#####=}:|_#|_>+;'+!>!>!>>>+>>>>>!>!!>>>[>>>>>>>>>",
|
||||||
|
">>>>>>>>!!>>>>>>>>>+>>+[+>>>>+!>>>>>>>!!!!!!!!!>###/.....//....../=/=//./.......//./=}=.==:=|:![!>+!/...................../|++[+++'[++[++++[+['['[[++''[''[+>#=/............................................................................}>_}/.........................=:|::::|::::::==:==:&::::=:/................//######/}=||!_>>|_&>;$$$2$)2+;;$);+;++>+>+>[[>+>>",
|
||||||
|
"++>>!!>>!>!!>!>>>>>>[>>!>_!>>!_>>>!>>!!!!!!!}/./../..../||||||}/.........//....////./:|=}/./==/.====_#=.....................|>+[+[+'++'['1+'['+[''+<['++[>_::}............................................................................=||=............/..........///===:::::::::::::::::::::}=:=://////..../////...//}/##/}=/}=}/==/=}||_#![>[++;+!$$))))$;;;;;;;;3+",
|
||||||
|
"}|||!!!!!!>!###====|#>>>#/=./../.......................}||||:/}|#:==///.|}|...//}:///}///./}==/}::_/}|++/.................../}!++'+[<'['++'''[''+<'+'+<+[||}|/........................................................................../}|}.............=::=..=.//=/&:&::::|@:::::::::,::::,:==::=:::|@&:::::/::}===/......///===}=//..............////#_>_|||}}!_}==|}",
|
||||||
|
"..../././///./........=................................/:|:/.=|||#||||||=|}/..../#/.=}/...}}|==}}:|}|}_+>>/=................=}/|_'++''[+[['['+['[+'[+[+[&|||}/..........................................................................|:#:.........../:||:/=:=:}:|::=:@&:@:::::::::::::,=}=,:==:::,::,&:&&:[_::|:}=/..=//////}::|:}:||:=/.............................",
|
||||||
|
"//................../=/==///./................................=}}|:|||}}}=|}//...../|}}/.../}:||:|:}||:|';[_!|}............../}=}_['[+'<+'++<'+'''['''[>>_}/|=............................................/====}}}=.......................///..........:&:@|:/:::::::::::,:::,::::}&,:=,,=:===}====,},:::::=:=,[':=:*|==:&}:}:|:|::::&=::|::===:}://.................../",
|
||||||
|
".................}||}:}::|:|}|&}}}====/.........//=}|/.}///....|||}=}}}=}==}/}/../=//}=//...../=}=////==:_!:}_>&/............#+|/|[+'[''['[+['['[''[+'+[[[#|/......................................../=:}:|:&|&:&::}=.........................//}:=////=|&:::=|::|::::|:::,:}=&}====:=:::=,=,==,}==,},:,,:&*[**:,:|''3*:'~:=:::,::|:|::::::::::::::=/////////./=====///.",
|
||||||
|
"/.............==|&==}}=}:}::&|::____|:|||}=}}}}}|#||||||}|||}}==}//}/=}///////.../#=./}/}/}=..=|}}/..../=|:&:::|=................|+'[++['+'''+'+'+[[+___|}/......................................./==::}}}:|:::|:||&&|&|:}/.....//..=/.//=/===:}}::::::=,:::|/=::=,}@::::::::}==::::=::==,}===}=,}}=:==:::&:&::,&[~['_@[@:,,,:,},:,=::=,:==::|::|:=|:::|:::|:==|}:::::::",
|
||||||
|
":}}/..........//:}:=}}=}}|_|&}_|||=}}}:=}}}:}}}||}|}}}|}}}}|}}:}}=//=///}}}/}//===}}/}}/}}=|/=|:}|/....#}//|:||[;;#=........../=|_['''+''['''+'['+_=./............................................==:}}}:=::::}}:&&|&|&&|:&|}...|}/.=:|:_:|:||::&&&@}:::::&::/=:&:::::,:,::,::::=,=:======,=,=,=====::_|,}:=:,==[^['([[[@::=:,:,::,,,==:,=::,:|::::|::::|:}::::::|::|:|:",
|
||||||
|
":::|:/=}/......//=/=/=}}}}=}}}|}}=}=}}}|:}}|}}}}}:|}}|}#}}/==}}}}}}}}}}}/|#}}}}}}}:}=}}}=}}=}=====......../|:=:&|[;+|}.........||_''[+''+'[+[+['[|...............................................=:&=}}},&||:}::&::&|::&|&|&}.//|:=|&&:&:::&@::&&:::::::,::==:::::::::::::==:=}=:=:==}}:=,,==,=}},}=}==:==:===},=:'~[1[:&[::=,:,,:},:::,::,,,:,,:,::|&|:::|:|_|::::=::::",
|
||||||
|
"==:}:::||=../}|}:|==}===}}}}}}}}}}}}=}|}}}:}:}:}|=||}}}}#=///=}}}}}}}}}}}}}}}/}}}=}}}/}}}}}}|///........./||:::|}./||}.........}!_+'+<+<+'''__=/............/}=/==}||=..........................=:=}=,,&|:===::}::::||=.////=:|&|&&&&&::&::&:::::::,:}:::::::|::,|=,}:::},:=:=:}}=}::=:}}=}=====}=}=::==:=}=}====:[^33'@[',=:,:::,,,:,=,=,==,::::,=:&*&&['*&:&::==:::=::",
|
||||||
|
"..../=|=...../==/=/}====}======>_=}}}:}}}|,}}|}}}|}}|}==}}/=#}}/#}}}}/}/}/}/}}/}/}/}/}}/}/}=//|||=....:|//||}}||::=............./=[+'+'+''+!.................=|||+;;>}......................../=:=:}}}::&=..=|,,}::::::./:=,|&&:&:::::&|::&:::::::,:,:::::}::::::}}}}}}}:}:}}}},=}}=}}===,=}}},=}===,,===},=====,=::~[32~~'<'__|:::==:,,:,:::=,,=:_*/'3~~***&,:::::,:=//",
|
||||||
|
".................//==}=}|}=|[3'+~+[}=}}:}}|::|}|}}}=}|}|}##}#/}}}}}}}}}}}/}/}}///}}}}}}}}/.../}}////.......=|&&|}:#/............/_>''[''[[>=................./==|!|=......................../=::}}}=:&&:,/=:&:|:&=,:&:}|::|&|:&:&&&&}}}}}},}:}:}=}=:}:::}::::}:},:}}=},=}=}=:}}}=,}}=:}}====,=}=}===}:}=====,}==/====:&_&1['~2)3'_:,=,},},=,:==&}*['['*@::&:,,:::::::::.",
|
||||||
|
"........./.....==}====}|}==|'+=|}*!+3+|}}}=}}}|=|}}}#/#}}}=|}#}}}}/}}/}/}}/}}///}}/}/}}//.......//....//../../=|===..............=>[''+++>/...............................................=}::===}}:&:=..&:::}}}=::|::::&&&@::@::::}}}}=}}}|}}}===:},}:,}}}:},}}}}:}}}}:=:}=}::}}},=}}},}=,====}=:====,==,==}=}|===,==,/=/,:&*2)$33;_&:=:=::=&:~22~@&,:/==,::=|3$[_|[||=",
|
||||||
|
"..............===}}=}===}|:$|,}}_|&|>[''&__:&=}}}}}}}}}}}}}}}|}}////}}}}}}}//}/}}}}}}}/............./.:|:::}/...//................=>+'<++|...............................................:,==}}}:}},&=...=:}===}}::|&||}:&&|:&:|&}|}:}}:}|=}}}}}==:}}:|,:}}=|}}}}}}=::}}},|=}=}==}}=,====}==,=,======,=}}}=====}=}==}/=,=,=:*_^3))322$~'~_~3''$3[====:=/&'~'_'~':,//....",
|
||||||
|
"............../}=//}=}}=}}>}/}||==[_&'!';|_[!}}/}}}}}/}}}}}}}}}}//}}}}//}}/}}}}///}/}/................:====:::/..................../=:|[>/...............................................::=}}}=}}:::=/./|&::&:}:&}/}:::&:|&|}}}}|}|}|}}}}}}:}:=}}}}=}::=}}}}:}}}}}==}}:}=,}}}:}},=}}}:=::=}=======,===,==:=====}=}=======}&*[,:$'@[3~~~~32$2$[=....//=[~&:,,@://.......",
|
||||||
|
"............./..=/==}//==}/.}|=/...//.==:}'[[_}/}}}/}}}}}#}#}/#}}#}}/}}}}}}//}}}}}}}}/................=::===::/....}...................=/................................................=:}=:}},=::::=.../===//=::,:}|}}:},||}:}|:}}:}}:}}}}}==::}}:}:&}}}=}}=,==:}}=}=:::=,},}}}=:==,:,=,===,=====,|&}===|_}===========&_,:::~$_}}_&==:=::&:,.....=[[,=//.//..........",
|
||||||
|
"..................////=}=_=/............./||}|>}}}}}}/}}/}/}}}}}}}}}}}}/}}/}}}/}}///}}/............../::=:::=:}///|:=..........................................................//........=::}./=}=:,:=/...=}::,}:}||,},||}&|:=}}}}}}|}||}}}}}=}=,=:}}}}:}:=}:}}}}}=}=::}}:}}}==}=}:}}}}==,:=,===,,===:&:::&<'&:===,=|,=&[~&==,;3:=........././..../=~<=/................",
|
||||||
|
"......................}#//}/.............../:=}_|_!|}}}!}}#}}}}}}}}}/}#}/}}}}//}}/}}/#}/............../:=:=:=:=::::|:=......................................................./}}./........./..=/@}::}.=../}/:&:}}:}}}|:}||&}|}:|}|:}|}}}:}}:}=}=::|}|}=}}}}}}=:}=:=:,}}:}==::},},===,:=:==,=,=,===}==,:::[&'1['&&&:[[*&'_'':_3~:.................=='3_=.................",
|
||||||
|
"....................=|=/../.................=}=}}=}_>#}}}}}/#}}|}}}}}#/}##}}//}}/}}///}}}}=/...........===:===:/=}:=}:......................................................./=}}=..........}}=.=:}&=./..&:::::,}}}:}}|:}}|:}}},}|}|:|:}|}}|}}}|,}::}:}:,:,}}:}=}}}}}=,}}:}=,===}:}=:========}===},}::_&'^[~[*'[~[+_[[3'<::;;[=.................==;~_==.................",
|
||||||
|
".................//|=/........................=/=}}_}_|}=/}}}}}=}}}/}}}/}/}}}}}}}/}/#//}}}=}=/......../:=====:=:=:==::=......................................................./}}=..........=}===:///....:::,:}:=:}}}}|}}}|}}:|}}|}}}}}}}}}}|}=}:|&:,,:,==,,,:,::=:}:::,},=}=}===:==::,=:,==,=},&}:=::&&_*_'&*[)~1[~33~~&^[<,..................=='':&=/.................",
|
||||||
|
".............../...............................///=====}}}}}}}}}}}}}}}/#/}/}}//}}////}//====}=}}}=...==:=},}====}=}}}}}:}=.................................................=}}=/=}|........./}=}=//.===/:},}:}}}}}}:}}:|:}|:}|}|::}|||&,:,&:}}}::,:/=,=,:,,=,/:,,:=:,/=,,::==,}::,[:==&==,====,}_}&_=,:&:''**~~&[@&&&:@[[::=//................./,':,/=..................",
|
||||||
|
"...............................................=./=}=}/}==}}!}}}}/}}#}}}}}/}}//////#/}}}}/}=}=:=}=../:=,====}/===}===}===:=/............................................../}::../}:}....../==}}=}:}:=,}}::||:&}}::}&:}}}:|}|}:}}}|&,::=:=:::,::==,,,=,:,::::,/=/=:==,,=/,,,:}:=}}::&*'&=,,=},=:|=}&:::&&*'~*_**&'<*::}=:=,==}====//............/_[:}....................",
|
||||||
|
".............................................../../}==/}}===}!+>}}/}}}}}}}}}}}}//=.}}}/}/}///=,}}}=..}=}==/}/}}}}=}}}=}}==}:..............................................=}|}./}}}&}/...=}}}=:}=:}}}:=}}}}},}:,}|:,|}}}|}:}|:}:&}:|,::,,,/,=&},,=,:@,:::@::,@:,,/,,=,,,::/:,,:::&_::&[&:}=,==}}::_==:[*'[_::'~'*:*:=:,,:=:}=:}===&/............:_=.....................",
|
||||||
|
".................................................../}!_=}/}=}}:[_}}/}}}}}//}}/}//}//}}}}}}/=//}//}=//}}/}//}///}}}=}}}=}=:==..............................................==./.==}}:}..==}==}}}}=}=}}:,:}}:}}}}}}:|::,|:&}|&&:|,|:}:=,==,=,,,==,:,=::@::@:&:&:,@,::,::::@:,:,/,:_,:&&:[<&&&&}}=&:,:_|_^|,,:,,:[*,=,:,,,/,:&,=::&}/:/............///.....................",
|
||||||
|
"..................................................../}}}!}}}/==}>[|}}/}}}}}/}}/#//}/}}/}//}/}//=/}==}///}///}/}}/=}}}:}:=/=|...................................................===/=//}=}}}}}}}=:=,=:}}}}}}}}:==}:}|}:,:=&,}}}:::}::,=::},,=,=,,,:@@:::&:,:@@:&,@:,:::@&@&:,,::*&_&'*_:=,[&*[::,,=_^*&:,=,//:&'&,/,,///,,[&::='|=.:}....................................",
|
||||||
|
"...................................................../}=}=}}}}=/}!|=}}}}}}}}}}/}}}}}///}}}//}}}}////}/}///#///}}}.////....:}......................................................//=}}}}:}}}:}}}}==}=,}}=}}}}}:}::}}:}:=&:}::}:,,,=:,::::},,,::@:::@,@:&&::&::::&@:@:&::::_,|:::},:&[^|:,=:,,,}:|'3:,,,,,,,*''&:,/,,,==,,::=:[,=.==....................................",
|
||||||
|
"....................................................../}/=}/}/}==}>}/}}/}}/}/}}/}//}#/}//}/////}}#/#/}}}}//#/}}//}=/.....==:}:/................................................/===:}}:}}}:}=}}}}==,}}}=,}:=:==:,:,::}:}:==:}=:===::,::,:,@::::::@::&:@:&@:@:@:,:&@&&@:,:/,::*&&:,=&*:_*=:=,,|&&~~::=,,,/,,=@*,,//,//,,,=}==,[*=/.:.....................................",
|
||||||
|
"......................................................./}=}}}}}}}/==//}=}}#}}/}/#}}/}/#}}///.////}/}/////////=}}===......},==}/................................................/==:}}=}}=}===:==:}}=::,}:=}=}}}}}:==:,,,=:,,/,,,,:::::::@::@@&@@::@@:::@:&&:@&&@&&&@}::::::=:_&&:,=:::|::::==,,,,::,,,=,,,,,|:/,,,/,,,===:::*&=/./=.....................................",
|
||||||
|
"......................................................./}}}}==/=}}}}/}///}}}}}}}//}}/}/}////////}/}/}}}}/}}#//=/}}}/.../....../................................................../}&}:=}}}}}}:&}}}=}=}}}:},}},}::=,======/},,,:}:&@:,:=//&*&&&&*&&::&@&&&&@&&&|&::&:@:&:/,::=,/:&&&::,,::=,,:,,,,,,,,,,,,,,:,,/,/,/,,=:=,=,:&,=...}.....................................",
|
||||||
|
"......................................................./}:|}}=}}|>+!!||/}/}/#}}}}/}}}//}}}/}//}/}//////}////}/}======///........................................................../,|}}}=}=&=}}==::,}::},&:,|:,|:=.//::///=:,/,,::::/..=:_<*&*&#}&:@,&@:@:&&@&:&*&&&@:&,:::@:&,:,:,|_::=,,,,,,,:,,@,,,,,,/,:=,,,,/,/,/,===,=:/..../.....................................",
|
||||||
|
"......................................................./:|||}}}|![[_|_!/!///}/}/}}/}}}}}}}}}/.}}/.///}}/}}}/}/=////=}/............................................................/|}}}}=}}}=},:/.=}:,}:}:&|:&_:,/.../=/.,==,:,,:,:/..}&<_<*[~&##::&@,:,@:@&&&*&:@:},,::&@:&&@::@:,:,|,,,,,,,::,:,,@,,,,,:&,,,,,,/,,,==,=,=,/....=}/....................................",
|
||||||
|
".......................................................=}=}||}}=|__:|[&|>|}/}//}}}}/}}/}/}/}//}}}/}}}////}///}/...//......................................................./=/=/./=}}=}}=}}/./}}:=.=::,}},:&,:&&=..........===/,,:,}/..&_<&<'<&||@@&:,@:::,,:=:@::,:=:},::,,:,:::::,@:::,:,::,@,,@,,,,,,,,,=,,,,,,,,=:=}=,}/.....=::}/..................................",
|
||||||
|
"......................................................./}}}}||}}:}:&|+_:>_!/}}}}}/}}}}}/}}/=../}=////}//}//}/..............................................................:::=}}===}}}/..../,/}}:=///::=:&}:::&/..../....../=,=,:<&/../}&*&~<::&&:@@:,:,,:,,,,},,,&&,::,,=,=,,:@:@:@:@::@:,,@:,@,:,,,,/:&,=,/==/,=,=,=/=/...../==:,/...................................",
|
||||||
|
"......................................................./}}}}}|}}|&|=_|||'>[=/}}/#/}}/}}/}}}}/=/}}/////}////}/..............................................................:,::,::,}}=/...../=..=:::/./:::&:&:@&=/.==}==/....=,=,:,&:/..}=&&*_:::@&:&@:,,,,=,}:&=:&:}:},=,,,,:,:@:@|:@,:::@::,:::,:,,,,,:|:=}:},=,=:==..........=/......................................",
|
||||||
|
"........................................................}}:}&&}:}&%:[;>=*'>}/}}}}#}#}}}}/////#////}/}//}////...............................................................}:=@:::::=.......,:.../}::}/}:@:&,,:,/:,,,,,,::,,,,:,::*,:&...||&::@:@&:@}@::=,=}_*[*&:::::&&@&:,::,::::,&:&:@::@,@,,,,,,,,,=,:,==/=}==,,}=........./==......................................",
|
||||||
|
"........................................................}|=|}||:&&*&*&||_++}=}}}}}}}|/}}}}}}}}}/}/}}/}//}/................................................................/&@::@*^@:/../....:,.../.=://.&::///=,,,:::::,=,:,,,::@}&}::...&&*&,&&:@:@=:,::,:&'~<&:::@*&*_&@_&,}:,:,:@&::&,::::,,,,,,,,,,,=}}/./====:=/........../}:......................................",
|
||||||
|
"......................................................../}||[|:}::&:[==/__!//=}}=}}}|}}/}}}}/}/}/}////////................................................................/&*&&&^11&........//.../.=:.../@:,//,,,:@@::,:,/=,:@:&&&_&,=.../&:,}@:::::@,::::::[*=&&,**_**&&::::::,::::,:,::,:@:@:@,,,,,,:,:=/..,../=,:/..........==/......................................",
|
||||||
|
"........................................................./|}*_::&:&__=}+;[>|/}}}}}}}|}#}}//}/}}/}}/}//}/...................................................................&&@^1~%_/........./..=&_//.../:&,///,,,,:,:,,,,,:@@:@@:&~_}/../_::,::::::@::,=:::&'[@|&&*&*_@:,,,:,,::,::,,,,,,,::,,,,,/,=,=:==:/=//..==::........./}=/......................................",
|
||||||
|
"..........................................................=}}&:_&:::|}=}:+__=}}}|=}}}}}}/}}/}}=}//}////}..................................................................../,@:,=.../,//=,/,::...=....../=/.../,=,/,,,/,:@**<*@*:&*&:_&=},},:,,::,@:&:::=&}:_'<:=:&&:&:},=},,_:,,,,=,=/,=,,,,@,,,,,::,:=,==}=....====....../:}==.......................................",
|
||||||
|
"........................................................../=}&*_@:&&,}=}}|+}//}}}}}=}}}}}/}}/}/}}///////...................................................................../////=,,::@@::_@_&/...........===./....////}&&*&**_*&,&@&:_*&:,:,,,,,,}:@::=:,:_[*<3<*<::,<<:<&::&=,&,,,,,,,,,,,,/,,:,},}=}}|}}......=}=/..////==},/.......................................",
|
||||||
|
"...........................................................=}:&**&&:&:|_/|_/=}}}}}}}=}/}}}#//=}=///}/}}/...................................................................../@,:@&&:@&&*&****:/............///......}/.:**<**<_*&:::@:&::&&_:},},=,,:=::,},:~32&*&,::::&&&},::&:&:/,,/:,::::,,}:=,,::}:}:}=......==/../}=====/.........................................",
|
||||||
|
"............................................................./:&@@@::}|&/}|}/=&:,}}}}}=/}}}}}//}//////...................................................................../=,,:&****@***<*<_<:/....................../=&***<<<&@*},&&,&:,::,:,,,::,}:}::}=:=:[3$~|:::,:,&::,:,&&*~3&,,=:},,=,:,::}==}}}:}}:=...../../===,=/............................................",
|
||||||
|
"............................................................../&&&_@*:}|//====::&:}==}}=}/}/}}}/}//=......................................................................./@:,:@&**@*@**<<<'**_,:=.....=|&=........../}::_*****:&@:::<*&::::,:/,,}:,::=,::=,}:_~3~[*=,=,,:},:&<+';$3_:,,,::,,:=:,=:,,}}}}:}:......../:=/...............................................",
|
||||||
|
"...............................................................=&:@[@@=}======}:,:}}==}}}}}=///}}}/.......................................................................=::,::*@&******<<<<<**&&*:/../+<<*_|}/./././=:&&&**<*<&&&&@::<_&&},},,=,:::,,,/,:::,},*'33[*:&,,:,/:+3*'~';2<<&_,:,},,,::}:}},}}}}:=........==................................................",
|
||||||
|
".............................................................../:=/@@@&}|===}}:::&:}}:|}}}}/}/}}/}/....................................................................../=,,,,&@**<<<<<<<<'<<****@&_*}=<<<<<*<[*__}_*&@&@*&<<<<<<*&&&,:<3:::=,:,:@::&=:,,,:}::=,,@~3[<|_&,&_<'<|*'3$~;$'<},,,=,:,=}}}:&}}}|:}..........................................................",
|
||||||
|
"................................................................=:/:|:&:}=}/=}::,}:}:===///...////}....................................................................../=::,:***@*<<<<<<<<<**@@**@*[*[<<*<<<<<<<*&:*:&&@**<<<<<<<*=/=::,&&*<,,==::,@::&,=,=,:=,=,=&*~'~&:<@_}:=[;3))'+3&==,},====}=}}:::}}}}/.........................................................",
|
||||||
|
"................................................................./}/:@&::::===,::=}==............==...............................................................././=./::,&&&&**<<<<<<<<<<****_@&&&*<<<*<<<<<<<<*_&:&,&:_**<<*<<<<}..}=:::,}:}:,,::::::}:::&:==,=,,,=&33'['232$'$~~23*:====,,,},=,},}}}:|}}=..........................................................",
|
||||||
|
"................................................................./_//=@:=::=,}=}=}:............../}/............................................................././///_:::@**@*@&<<<<<<<*<<*****_@*&=&<***<<'<<<<*<&}=},:*<<**<<<<<*/./=},::}:,:==:=:/,,::&:@:,:,====,,::&3~2'33@_&:&_=,=,=,==:=}==}:},}:}|}...........................................................",
|
||||||
|
"................................................................../}/.=:=,:::====}=..............//=..................................................................&_@:::&&&::@*<<<***:@&*&*******:,<**<<<1'<'<<*&:=.}:&*@&**<*<<<*=../}=/}}}=:,}:,,:=:@&:,:,=::,:=,,=:,:,:,:,=,},,:=,,=,==,,=}:=}}}||}|=............................................................",
|
||||||
|
".................................................................../|./}},}::},==}/...............//.................................................................&<_:@&@&&@&:&@<*<*,&_&=::&&*<<*@&*<<<<*<<'<'<<<*:}./:=,::@**&**<<,&../}/,=:}}=}}==:,:&,:,,,,==:,}=,==/,:,:=:,=,==:=:,=,,,==,:==:,}}}}}/............................................................",
|
||||||
|
"....................................................................&=..=:::,}}//}..................................................................................=**::&&@&&::&&<<<<_**_*&&:&_<<<&@**<*<<*<<<'<'<<_&:=.}::,:&&&*&*<<[&//=*=..../..../==:::=,,=,=,,/::=,,:}:}:===,=,:=:,=,===:}==:==}:}=}=./=..........................................................",
|
||||||
|
"...................................................................../=./}=:=/}==}................................................................................./[<&@@&&&@&****<<<<<<*:::@*:*<<****&@&****<<''<'<*&&}./=:}::@**&&***__<_*}&}......../=::,,=,=/,/,,=,==,,}:}::}=:=,=:=:,===,,=:=,====}}/..==..........................................................",
|
||||||
|
"........................................................................./}:===/}=/.............../................................................................|<*::*@&&&*****<<<<<*,@&&&*****@*<*&,*&*<<<'<<'<**&@:}./},:&&&&*******<**_&&=.........=,==,,,,,:,=,=,===,|:|}=,=:},=:,}:=,=:=:==::==/....=/..........................................................",
|
||||||
|
"........................................................................../}===////................./............................................................./+*_**&&**<<****<<<****&@<@***:**@:,,,****<<<'<'<_<&:,}./}&,:@&****<<<<*@&&,_=........./,,=},,==,/,==:=,,===/.},:=:=,},=}}=====}==/...................................................................",
|
||||||
|
"........................................................................../=}////=/.......///........///........................................................../&'<<_*<<<<<<<*<<<<*****_@***@***&&,,:**&<<<<'<<*<<*&&:/.:}::&@&*&<<<<<****_&..........././=,/,:,,=,,,,=}/....=:=,=}==}:}==,=..//.....................................................................",
|
||||||
|
"......................../..................................................}}=}////.......==/.............../......................................................}<***<<<<<<<<<<<<<*****@:&*<*****<&::***<<'<'<'*<<**&},..=}::&***<<<<<*<<*&/............./=,==,/,,=====/......=::,:,=}}}:=}/..}=.....................................................................",
|
||||||
|
"............................................................................/}}}}/=/.....//=...............//=/....................................................=<'<<<1<<<<''1<<<<<<^***@:_*<<<<<***&*_<<1'<'<<<<__*@::...}:,&***<<<<*<<_:/............../,/,:=,/,,:==......../}:===,,:=}}}../:/........../..........................................................",
|
||||||
|
".............................................................................././}////=/////........../............................................................=<<<**<<'<<<<<<<<<*<**&,,:<<<<<<<****<&*<<'<'<<<**<*&&:&/./}:&**<<****@_=/.............../,,/,,,=//,=........../::,}==:==:=/.............=}..........................................................",
|
||||||
|
"................................................................................/}/}//////=/.......................................................................=**********<<***<****@*@:**<<<<<<<_&<<*<'<'<<'<<<<&&&&,:/./=}@&<<&_&,:}=................../,/,,,=,==...........=::=:=::}}}}==............/:=.........................................................",
|
||||||
|
"...................................................................................//.//////.//=...................................................................&***@@@@@@******<^**&@@***<***<<*<<<**<*<<<<<<<<*&*&:&:=,/.,}&@[**&&}/..................../,/,,,,=.............////:=:,:=}},=/........../==..........................................................",
|
||||||
|
".......................................................................................//}/==////................................................................./***:&,::&:@@*@*@****<***<<***<<*<***<***<*<<*****:@:@,,::}//:&&&&&://....................../,/,/==.................::=:=},==}}...........==/.........................................................",
|
||||||
|
"..........................................................................................///}///..................................................................:@:@,,,,,,::@:@@&**@<*<*<<**<<&_***@**@*@&***&@**@::@,,,,::/}}&}:/.........................,,,,,,/.................=:=::}:}===.........../==/........................................................",
|
||||||
|
"............................................................................................//=/...................................................................=,,,,/,,,,,,,,,@@@&****^<<<<***|@:::::::@:@*@@@:@:@::,,/,==:}}............................../,,/,/................./=/=::}::=}/..........///=/.......................................................",
|
||||||
|
"..............................................................................................//....................................................................=:},,,/,,,,,,,},&@::@&@******:@:@,,,:,,@@@*&,,,@:,,,::,,==://.../=_/.......................=,,,,..................==../:,::=}............/////......................................................",
|
||||||
|
"............................................................................................../}/..........//......................................................./}=}}=,}=,:=,,,,,:,:::::::*&@:&,,,/,,,,,,:,,,,,,,,,,,/,,,,::=,}__*</........................=,,=............/.....,=...=}}:=.........../../=//......................................................",
|
||||||
|
"................................................................................................/........////=////../................................................/=},|}}}}},}=}:,=::,::,,,,,=,:,,,,}:==,,,,,,/,,,,,,,=,},,:,&&*<*<*.........................=},.=.................==....=}}.........../.../=./......................................................",
|
||||||
|
".................................................................................................///....////=//////=/==...............................................=||,:}}}}}=}:}}:}==,=}}}:=:,,,=}},=:,=/,/,/,,,/,==,/,,,,,:@:@<<*}.........................==//&/................=&=..../.........../....//==/.....................................................",
|
||||||
|
"..................................................................................................//.////=/////=/}/}//}=...............................................}|&}},}}}}}}=}=:}::}=}=}}:}=}:==}}=:,,,,,,/,,,,,=,,,,,,@,,,,@_&/.........................././::................/:=................/..../===/.....................................................",
|
||||||
|
"......................................................................................................////////}/}////=/=:=..............................................=|,::}}|::&:}}}:=}}}}}=}}}}=}}}}}=}}}}:,,,.,==,,=,:,@,:@:,:*_=............................./&}................./:=..............//...../}//.....................................................",
|
||||||
|
".......................................................................................................//////////}//}/=/==/............................................../|}&}}&}:&:=/../=}}}:}}:}}}}}}}}}}}}}}},,//,,=,=,,,,,,@:@:*&.............................../..............=/...}@:/.........../,:=...../.......................................................",
|
||||||
|
".......................................................................................................////////}//}//}/===}====............................................}:=/////....../:===}}}}}|=}=}=}}:}}::=,,,,,/::=:,,:,,@,&@/..............................................=&:///,:=..........==::}.............................................................",
|
||||||
|
".......................................................................................................////////}//////////===:::.............................................................=}:}==}}}}}}}}}}},,,==/,,/:,::,,=,=,,:=................................................=&://&&,........//}=}=/.............................................................",
|
||||||
|
".......................................................................................................///////////}////=/=/==,}=}.............................................................=}}}}}}}=}}}}},::=,=,,/,,,:,=:=,,,,:=................................................../:|/=:&.......====:==........../...................................................",
|
||||||
|
"...................................................................................................../=}//}}/}//}//}//}//=//=/=//............................................................/},}}}}=}}}}:::::}=/,=,,,/,=:,:}=,/,.....................................................=|::=|/....:=}},=}::/........==...................................................",
|
||||||
|
".....................................................................................................////////////}/////}//}//=/===.........................................................../}|}}}}}}}},,}}:,,,/,,==},,,/:=,,==.....................................................//}:&:=..../&&&==}},:=.==/}=..==...................................................",
|
||||||
|
"....................................................................................................}/////}////////}///////}//}///...........................................................}:}},:,:},:},},,,/,,=/,=/}==,,=:/=.......................................................//}:&|/....&@&:=,=::././//...=/.//}/..............................................",
|
||||||
|
"....................................................................................................=///////}///////////}//////}/}//.........................................................=:,:&|:}:|:::,=/,/,,,,=/=,,=,=,,,........................................................//::&&=/...=@_:::::/.:::=//..//./::}////..........................................",
|
||||||
|
"...................................................................................................}////}///}////}/}//////}/}///}}/=//......................................................./&|:,|:,},}/,,,/,/,/,,=}},,==,,=.........................................................../&,&,&=./.&*::,&=..:::/.//..//./=,/./===/.......................................",
|
||||||
|
"...................................................................................................}}//////////}//}//////}////}////=/////.....................................................=:&:,:|::,,//,,,,,,=/,,,=,,,,=/............................................................/:&&&/...//==:&=./:,:=...:/==:./}&/==}==}//......./............................",
|
||||||
|
".................................................................................................../////////}///////}/}///}////}/}/}/==},:,::=................................................./:|:,::,,,,,//,,/,,/,=,===,,/..............................................................=&:&........//...===:/...././../.=}}=}/===//.....//...........................",
|
||||||
|
"...................................................................................................!/}//}/}/////}//}////}//}/}//}/////}/=:=:@:/.................................................}|&:=:=/,/,,,,,,,:/,,,,,=,=/.............................................................../:}/............=/.=..........//../}/}=/===.././/............................",
|
||||||
|
"..................................................................................................._}/}/////}////////////////}//}/}/}/}===,,,::=/.............................................../:::=:,/,,,,.,,/,:=,=,===,}=.................................................................=:}=/////.................../=.../=}}/}}=}/./..............................",
|
||||||
|
"...................................................................................................}}////////////////}///}/}//}//}///=/=/,=:::,,}.............................................../},&:=,,/.,,,,/,/,:/=,,,,===..................................................................=,:::::=......./..../....=....../}/}//=}}/................................",
|
||||||
|
"..................................................................................................../}/}/////}/}/}/}//}/////}//}//}/}=}=},=:,=:,:/...............................................}=:&}/,,=,.,,,,=,:,===/,,,/.................................................................../..==,}====}===//=/=/.../......//}}|/.//}/...............................",
|
||||||
|
".....................................................................................................}/}}/////////////////}//////}///==,,=,=}==}:................................................},},,,,,,,,,=,}::}:=,,,/,==............................................................................//.,/../:=/..............=/....==/..............................",
|
||||||
|
".....................................................................................................////}///}//}/////}/////}/}//}/}=}},=======::................................................}:}:},,/,,/,:,}},}:=}=,=,=:/............................................................................../=.///......................////.............................",
|
||||||
|
"......................................................................................................#}//////////}}////}/}/////}///==:======}==..................................................}&|,},/=,,,,=,:}:},:}=,,===.........................................................................................//./......../.....................................",
|
||||||
|
"....................................................................................................../}/}///////////////////}//}/}/=,===,===}=..................................................}:}::}:,,,=,},}:|,||&}:==:==......../................................................................................/==:=}/..../}.....................................",
|
||||||
|
".......................................................................................................|/////}/}////////}/}/}//}/====},=}=}=,}/................................................./&,|},:=:=,,,,:,}:|:,&|:==,==.......}&.............................................................................../=::::}/..../}=....................................",
|
||||||
|
"......................................................................................................./|//}/////}//}/}/////}//}//},,:,:=,=},/..................................................&}:::}::::,:,==,=:}|&_:&|::},....../__/........................................................................../==//:@:::=/....=&==...................................",
|
||||||
|
"........................................................................................................!}/}///////}///}/}}//}/==}=,:,,::=}=}..................................................._&,}}:,:,::},,,}=:}&|}&|&__|=.....=|&_=........................................................................./:=,::,,:,::=....::::/..................................",
|
||||||
|
".........................................................................................................||||}/}/}/}==:}:==}//}/==:,::},::=:=................................................../<::,}:}::,:::::,}:}|_}__|!_=..../|&|*|......................................................................../==,,,:,:,:,,:::/..:&}}/..................................",
|
||||||
|
"..........................................................................................................=[_>}|=/==::::&,}}/}/==:}:,:===,:=}..................................................=~&=}::,}::::,}:=:}:}&|_|#|/.....:&_&_&........................................................................=,:@::,:,@@@@,,,,=/::,:}..................................",
|
||||||
|
"............................................................................................................=&}=}}==::&@&@:}/}/===:}}=,}==,=}................................................../<|:::}:,&},::,:::=}}:}__}.......|&&__=......................................................................./:@,@,,@@@@,@@@@,,,:=::==/.................................",
|
||||||
|
".............................................................................................................=|}:&=&,@&&@&:}=/}=}:|&@}},}====...................................................=&,::,:&:::::},,,::,}&|}........=&|@[/......................................................................,,@@@@@@@,@@@@@@@@,,:,:=}==/................................",
|
||||||
|
"............................................................................................................./[&!}|:::@@@*::=:::,}:,},==:}==/...................................................._=,:::&:&:,::=::==:=}}.........::__:....................................................................=,,@@@@@@@@@@@@@@@@@@@@@,:::,:==...............................",
|
||||||
|
"..............................................................................................................[_'_&::&&*&@@:::,=}====}}=,,}}...................................................../&}:&@&*@&::::=::,,:,:........}&|@_=................................................................./:::,,,,@@@@,@@@@@@@@@@@@@@,,:,:,:==..............//..............",
|
||||||
|
"..............................................................................................................*:,:=:@&:@&@&::::==,}===}=}=:/......................................................|:,_***&&:,}::,}:,==}/.......:&:&_.................................................................=[%1:,,,,@,,@@,@@@@@@@@@@@@@,:,}:::==/.............................",
|
||||||
|
"............................................................................................................./__|:,=,@@&@_::::}|/}=//=,}}==.......................................................*&:***@*@&&::,:},}:},=.......=|:&_.................................................................=%(%-@@,,@@,,@@@@@@@@@@@@@@@:,,,,,::}}.............................",
|
||||||
|
".............................................................................................................=*:&:=:}:@&::}=:::==}}/}=////........................................................}<&&@_***&:,:==:::==&=......./_&&}.................................................................&^1@1@,@@,,,,,@,@@@@@@@@@-@@@:,::,:=::=............................",
|
||||||
|
".............................................................................................................}[:::=,:*&:::=}::}=/}/=//............................................................}<&&<@***@:},:::,::}/.........=:=..................................................................=*@@@@@,,@@@,,,@,,@@@@@--%-@@@@,,},,:===...........................",
|
||||||
|
".............................................................................................................}_&&:=:@@&==:===:}=/=/}............................................................../_*:****&&::}:::},&/...............................................................................=,@@,@@,,,,@,,,,,@@,@@@-1%^@&&::,:,:,:}:...........................",
|
||||||
|
".............................................................................................................|^_:,::&_@:::===:}}}/=/...............................................................}*&:_&:*:@:=:,|::&................................................................................/,,@@,,@,@,,@,@,,,@@@@@-~111@@,:,=:,,,,:/..........................",
|
||||||
|
".............................................................................................................__*:==::&&@:==,=::}=///.............................................................../_*&<*&*&&@:&@::*:.................................................................................:,,,@,@,@,@,,,@,@,@,@@^~~]]^-@@@,::::,:/..........................",
|
||||||
|
"............................................................................................................/*&&:,==:::::,}}::==}=}................................................................./<*<<****&*@&&@}...................................................................................@,,,@,,,@@,,@,,,@,@@@@%1<{%(^@@,,,,}::/..........................",
|
||||||
|
"............................................................................................................=_::==::::&::::=:::=}/}.................................................................._**<**@*@&@&@}.................................................................................../,@,@,,@,@,,@@,@@@@,@@@1*@^1]--^-@:,:::...........................",
|
||||||
|
"............................................................................................................/:}_:::@&:::=::====}/..................................................................../_***&@@&@@_*=....................................................................................,,,@,@,,,,@@@,,,@@@@*@*&@&-(](((-(@,}|...........................",
|
||||||
|
"............................................................................................................,:::::@@@@:/=:===//=/.....................................................................&****@&:@&*/.....................................................................................=:@,,@,@,,,.,/./.,,@@@@,:@,^](-((^@,&/...........................",
|
||||||
|
"............................................................................................................/:<=:@@:&,:===//=/==......................................................................,:&@__@&&:/......................................................................................=:@@,:,@,,.........,^@@@,@@,@](((@@@=............................",
|
||||||
|
"............................................................................................................==&,::@&@:,====/}}//......................................................................=:::/==/........................................................................................./::://./............&/:@:,,@@-((]-@:/............................",
|
||||||
|
"............................................................................................................:&::@@@@@@&,//}/}|/.........................................................................................................................................................................//...................=:@,@-----@@&=.............................",
|
||||||
|
".........................................................................................................../|_,:::@&@&&:&}/................................................................................................................................................................................................../.=,@@@@@@:@|........................=.....",
|
||||||
|
"...........................................................................................................,,=&@,:@@@@@@@&&/....................................................................................................................................................................................................}:,@::::::......................../=....",
|
||||||
|
"........................................................................................................../::::@@&::@&@&@@_/..................................................................................................................................................................................................../=}=,}:=........................../===..",
|
||||||
|
"........................................................................................................../:_:&&@@@@,@&@@&=......................................................................................................................................................................................................../..............................=,=/..",
|
||||||
|
"........................................................................................................../:_&:@&@&&&:,/............................................................................................................................................................................................................./../..........................=....",
|
||||||
|
"..........................................................................................................,[,:&&@@@@&_............................................................................................................................................................................................................../}=}/......................./=//....",
|
||||||
|
"..........................................................................................................:[:@&::&&/,/...............................................................................................................................................................................................................}:}....................../_==......",
|
||||||
|
"..........................................................................................................=:::&*@&&=/.................................................................................................................................................................................................................=/...................../}==.......",
|
||||||
|
".........................................................................................................//:&@:&:@:/......................................................................................................................................................................................................................................./:==/........",
|
||||||
|
"........................................................................................................./=:::@:&:=........................................................................................................................................................................................................................................===}.........",
|
||||||
|
".........................................................................................................//|:@&:&=........................................................................................................................................................................................................................................./=,..........",
|
||||||
|
"......................................................................................................../:|::::::........................................................................................................................................................................................................................................../............",
|
||||||
|
".........................................................................................................=[}::@::}......................................................................................................................................................................................................................................................",
|
||||||
|
"......................................................................................................../:[::,&&:}......................................................................................................................................................................................................................................................",
|
||||||
|
"......................................................................................................../=+:::::=.......................................................................................................................................................................................................................................................",
|
||||||
|
".........................................................................................................=[::@&=/.......................................................................................................................................................................................................................................................",
|
||||||
|
".........................................................................................................:|::::/........./..............................................................................................................................................................................................................................................",
|
||||||
|
"........................................................................................................./:::::/......../...............................................................................................................................................................................................................................................",
|
||||||
|
"..........................................................................................................=&:,::/.......................................................................................................................................................................................................................................................",
|
||||||
|
".........................................................................................................../==:::=......................................................................................................................................................................................................................................................",
|
||||||
|
"............................................................................................................./===/......................................................................................................................................................................................................................................................",
|
||||||
|
"........................................................................................................................................................................................................................................................................................................................................................................",
|
||||||
|
"........................................................................................................................................................................................................................................................................................................................................................................",
|
||||||
|
"........................................................................................................................................................................................................................................................................................................................................................................",
|
||||||
|
"........................................................................................................................................................................................................................................................................................................................................................................",
|
||||||
|
"........................................................................................................................................................................................................................................................................................................................................................................",
|
||||||
|
"........................................................................................................................................................................................................................................................................................................................................................................",
|
||||||
|
".........................................................................................................................////...........................................................................................................................................................................................................................................",
|
||||||
|
"....................................................................................................................///|}}=.............................................................................................................................................................................................................................................",
|
||||||
|
"....................................................................................................................|_=/...............................................................................................................................................................././..........//...................=|............................................",
|
||||||
|
"..................................................................................................................|_||=/..............................................................................................................}&[[[!=...............................=/....////.=_!__|}}=//}_[!_#=..././/==|/..}}}|_[|:///.......................................",
|
||||||
|
"..............................................................................................................._}[>}==}/........................................................................................................./=/|_['''''+[|=/=////.............../||__[[++[>[++++[++'''''''[+['''''+[[[[+++'+''+[[+'''''+''+++[>_}//................................",
|
||||||
|
"................................................................................................................/[_/=}//.............................................................................................//......:!+[+'+'''+''''''';'+'+[++[[>........}[[+''''''''[''''''''''''''''''''''+''';+'''''''''''''''''''''''+''+++!_}/./..........................",
|
||||||
|
"............................................................................................................||/.|>++##}............................................................................................/}+[|/=.}>''<'''''''''''''''''''''''''_/.../=}_+'''''''''''''''''''''''''''''''''''''''';'''''';'''''''''''''''''''''''++++[_|_}/....................",
|
||||||
|
"........................................................................................................=...#>>|+'+++|}.................................................................///}|}/.}:}|&_||}=//=}|&_[[++'+'+[[''''''''''''''''''+'''+''''''[|#}}[[+'''''''''''';''''''''''''';''''+''''''''''''''''''''''''+;'''''+''''''''''''''''+''+[>&}}}}/............",
|
||||||
|
"......................................................................................................../|}|&[+_:'++++>}...............................................|[[}.}!}}||//|[['[+'''<+++''''''''+''''+'''<''''''''''''''+'';+'''''''''''''''''+!||_+''''''''''+'''''''''''''''''+''''''+''''';'''''''''''''''';'''''''''+'''''''''''''''''''''';'++_}/.........",
|
||||||
|
".............................................................................=}||||=................./../}|}|>_}:++''+!|...........................................=|!*++''+*''<'''+''''''''''''''''''''''''''''''''''''''''''''''''''''''+''''''''''''[>|[++'''''''''''''''''''''''+''+''''''''''';''''''''';''''''''''';''''''''''''''''''''';''''''''''+<++=.........",
|
||||||
|
"..................................................==/../............}/......}||_['[>_|___&!_|}=/...=|_//|}|||:#_[<'[+'_}........................................}[+++'+'''''''''''''''''''''''''''+';'''<'''''''''''''''''''';'''''+'''''''''''''';';''''+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''';''''''';'''''''''''''';''';'<+[[[:..........",
|
||||||
|
".............................................//}|_|[+[_[>[[_|_|_||__>+!_![>_[['+''''++'++'['+'+++[[++[+[[[++++++'+'+[+&..................................../}}}[++<'+''''''''''+'''+''''''''''''''''''''''''+''+;'''''''''+''+''''+''''+;'''''+''''+'''''''''''''+'''''''+''+''+''+''''''''''''''''''';'''''''''''';+''''''''''''+''';''''''''''''''''[+[:/.............",
|
||||||
|
"..................................///=||>+++>[[+;+'+'+''''+++'++'++''[''''''+'+'''+'''+''+''''+'''+'+'[++'''''+'+'+++>_}/................................./|_[[+++;'''+''+''''''''''''''''+''''''''+'''''+''''''''''''+'''''''''''''''''''+'''''+''';''''''''''''''+''+'''''''''''''''''''+''''+';''''''';'''''';+'';'';''''''''''';''''';''''';'''';+_/................",
|
||||||
|
"............................/=}_>[++++'''''''+'''+'+'++++'+'''''''++;++'''';'''+''+'+''+''+++'++''+'+'''[;++[+[[+[>_!!>!!|!}=//......................./=|>''+[+'<''''''''''''''''''''''+'''''''''''''+''''''''''''''''''''''''''''''''''''''''''''<'''';'';'''+'''''''''''''''''';''''''';''''''''''''''''';';''''''''''''''''''''''''''''';''''''''''_.................",
|
||||||
|
"...................}=|}=//||_||[''''''+'+'+'+'+++;+;+'';'+''+++++''''+'+'++''+''+''+''+'+''''+'''+''+''+'+'[>[>!>!>>_>_>_>_!>#!##}/............../=|_[+'''[+''''''+''+'''+'''''''''+'''''''''+'''''''';'''+''''+''+'''''''''''+'''+'''''''+''''''''''''''''+''''''''''''''''''''''''''''''+'''''''';''''''''''''''''''+;''';''''''+''';'''''''''''''''+}..///...........",
|
||||||
|
"....../=|__|_#&_![[+''+++'++;+'+'+'+'''''''''+''+'+'+'++'++''+''++++'+''''+'''+''+''+'+''+'+'+++'++'+''+'''+>[>[_>_>>!#_!_>_>_>>[!!__|_||_![[[[_[+''''''''''''''''''''''''''+''+'''''';''''+'''+''''''''''''''''''''''''+'''''''''''''''''''+''''+'''+'''''''''''''''''''+''+''+'''+''+'''''''''+'''';''''''''';''''''''''''''''''''''''''''''';'''''''+!_|=//./........",
|
||||||
|
"/==&!++''+++''+'''+'+''+''+'+'''+'+''+'+'+'+'''''''+'+''+''+''++''''''+'+''++'''';+''''+'+''''''+''''++''++[+[+[[[>![[>>_!>!_>_[+'++++'+'''+''+'+'''+''''''+''+''''<''+''+'''''''''+'''''''''''''+'''''''''''''''''''+'''+'''''''''+''''''''''+'''''''+'''''''+'''+'''+'''''''''''''''''''+''+''''''''''''''''''''';'''';''''''''''''';'';'';'''';'''''''';+'+'++[_:=/..",
|
||||||
|
"+++'1''+'+'''''++''''+''+''+'''''''''+'+;''+'''''''+'+''+''''''++'+'+'''''';+''++''+'''+''++'++''+'''''+''+[_[![[[[[[['+>[>[>[>+<''+'+'''''''+''''''''+'''''''''''''+'''''''''+''''''+'''+''''''''''+''+''''+''''''+'''''''''''+''''''+''''''''''''+''''''''''''''''+'''''''''''''''''''''''''';''''''';''';''''''''''''''';';'''''''''''''''''''''''''''''''''''''+'+++",
|
||||||
|
"''+'''''''+'''+''+'+''+''+''';''''';'''''+''+''+''''+;'+;+''+'+''<''''''+'+''+;'''''''+'''''''''''+'''['''+++++[[[[[[+[['['''''''+''''''''''''';[';+'''+'''''''''+'''['''+'+'''+''''''''''''''''''''''';+''+;'''+'''''''''+'''''''''''''''''''''''''''+'''''''''''+';''''''''''+''''''''';''';'''''''''''''''''''''''';'''''''''';'';';'''''''''''''''';'''''''''+;'''''",
|
||||||
|
"'''+'+'+';''+''''''''''''''''';''''+''''''''''''+'''''++''''''''''''''+'''+''''';''''''''+''''''''';''''[;''''+'+'''''+'''''+'+'''''''+''+''';''''''''''''''+''+'''''''+''''''''''''''''''''''''''''''''''''';'''''''''''';'+';''''''''''''''''''''''''''+'''''+''''''''''+''+'''+''''+''''''''''';''''''''''';';''''''''''''';'''''''''''';'''';';'''''''''''''''''''''",
|
||||||
|
"''';';''''';'';''';';'''';'+''';''''''';'''+''''''''''''+'';'''';+'+''''';''';''+';+'''''''''+''''''';'''''''''''''+'''''''''''''''+''''''''''''';';';'+'''''''''''';''''''''''''''''+'';'''+'''+'''''''''''''''''''+'''''''''''+'''''''+'''+''+''''''''''''+''''''''''+'''''';'''''''''''''+'+''''''''''''''''''';'''''''''''''''''''''''''';''''''''''+'''''''''''''''",
|
||||||
|
"''+'''';'''''''';'''''+''''''+'';''''+'+'''''+';''+''''''''''+'''''''''''''''''''''';'+';''+''';';[''''+'''+'''''+''''''+''''';;''''';'''';'''''''''''''''';''''''+''';''''''''';''';''+'';'''''''+;<''''+''<''''''''''''''''''''''+'''''''''''''''''''''';''''''''''''''''''''''''+''''''+'''''+''';'''''';''''''''''''''''''''''''''';''''''''''''''';'';';'''';;'''''",
|
||||||
|
";';'+''''''';''''''+;';''';'';''''';;''';';+'''+;';'''';''+''';''''+'';'+'''+';''''+'';''''''''''';'''';+'''+'''';'+'+'';'+;''+'''''''+''''+'''''''''';';''''';'''''''''''+'''''++''''''+''''''''''''''''''+''+''''''';'''''+'''''''+'';'''''''''''''+'''''''';'+''+'''''''''''''''''''+''''';''''''''';''''''''''''''';''''''''''''''''';''''''''''''''''''''''''''''''",
|
||||||
|
"''''''+'''''''''+'''''''+''''''+'''+'''''''''+''''''''''+;'''+'''''''+''''+''''''+;''';''';'''''+'+''''''''''''''''''''''''''''';'''';''+''''+''+''+''''+';''';'';''+'''''''+'''''''''''''''''''''+'''+'''';'''''+'''+'''+''''''''''''''';''''''+''''''+''''''''''''''''+'''''''+'''''''''''''''''''''''''''''''''';''''''''''''''''''''''''';'';';''''''''''';'''''''''",
|
||||||
|
"''';';'+''''+''''''''''';'''''''''''''''''''''+''';''+''''+';''''';''''';';''''''''''''''''''''''''''''''';'';+''''';'''';''''+''+'''''';''''''''''''''''''+'''''+''''''';''''''+'''''''+''+'''''''''''''''''''''';'''''''''''+'''''''+'''''''''''''''''''''+'''''''+'''''''+'''''''''''''''''''''''''';''''''''''''''';'';'';'';'';''''''''''''''''''''''''';''''''''''",
|
||||||
|
"''''''''''';''''';'''''''''''''';''''''''';'''''+'''''';''''''''+''+;'''''''+'+''''''+'+''''''''';''''''''''''''+''''''''''+'''''''+''''''''''''+;''''+''''''+'''''''''''''''''''''+'''''''''+'''''''''''''''''+'+'''''+''''''''+''''''+'+''+'''''''';'''+''''''''''''''''+'''+'''''''''''+''''''';'''''''''''''''''''''''''''''''''''''''''''''''';';'''''''''''';'';''",
|
||||||
|
"'''''';';'''';''''''';''''''';''''';'''''''''''''+';'''''''''''''''''''''''''''''''''''''''+''''''''''+''''''''''''''''''''''''';'''+;'''+'''''''''+;''''''''''''''''+''+'''''''+'''''''''''''''''+''''''''+''''''''+'''''''''''''''''''''''''''+'''''''''''''+'''''''''''''''''''+'''+''''+''''''''''''';'';'';''''''''''''''''''';''''''';'';'''''''''';''''''''''''''"};
|
556
wmglobe/src/mycontext.c
Normal file
556
wmglobe/src/mycontext.c
Normal file
|
@ -0,0 +1,556 @@
|
||||||
|
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
||||||
|
* mycontext.c - an adaptation of wrlib for use in wmglobe
|
||||||
|
* initial source taken in WindowMaker-0.20.3/wrlib :
|
||||||
|
*/
|
||||||
|
/* context.c - X context management
|
||||||
|
* Raster graphics library
|
||||||
|
*
|
||||||
|
* Copyright (c) 1997 Alfredo K. Kojima
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* #include <config.h>
|
||||||
|
*/
|
||||||
|
#include "wmglobe.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* #include <X11/Xlib.h>
|
||||||
|
* #include <X11/Xutil.h>
|
||||||
|
* #include <X11/Xatom.h>
|
||||||
|
*
|
||||||
|
* #include <stdio.h>
|
||||||
|
* #include <stdlib.h>
|
||||||
|
* #include <string.h>
|
||||||
|
* #include <assert.h>
|
||||||
|
*
|
||||||
|
* #include <math.h>
|
||||||
|
*
|
||||||
|
* #include "wraster.h"
|
||||||
|
*/
|
||||||
|
|
||||||
|
static Bool bestContext(Display * dpy, int screen_number, RContext * context);
|
||||||
|
|
||||||
|
static RContextAttributes DEFAULT_CONTEXT_ATTRIBS =
|
||||||
|
{
|
||||||
|
RC_DefaultVisual, /* flags */
|
||||||
|
0, /* render_mode */
|
||||||
|
0, /* colors_per_channel */
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0 /* NO use_shared_memory */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static XColor *
|
||||||
|
allocatePseudoColor(RContext * ctx)
|
||||||
|
{
|
||||||
|
XColor *colors;
|
||||||
|
XColor avcolors[256];
|
||||||
|
int avncolors;
|
||||||
|
int i, ncolors, r, g, b;
|
||||||
|
int retries;
|
||||||
|
int cpc = ctx->attribs->colors_per_channel;
|
||||||
|
|
||||||
|
ncolors = cpc * cpc * cpc;
|
||||||
|
|
||||||
|
if (ncolors > (1 << ctx->depth)) {
|
||||||
|
/* reduce colormap size */
|
||||||
|
cpc = ctx->attribs->colors_per_channel = 1 << ((int) ctx->depth / 3);
|
||||||
|
ncolors = cpc * cpc * cpc;
|
||||||
|
}
|
||||||
|
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
||||||
|
|
||||||
|
colors = malloc(sizeof(XColor) * ncolors);
|
||||||
|
if (!colors) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
if ((ctx->attribs->flags & RC_GammaCorrection) && ctx->attribs->rgamma > 0
|
||||||
|
&& ctx->attribs->ggamma > 0 && ctx->attribs->bgamma > 0) {
|
||||||
|
double rg, gg, bg;
|
||||||
|
double tmp;
|
||||||
|
|
||||||
|
/* do gamma correction */
|
||||||
|
rg = 1.0 / ctx->attribs->rgamma;
|
||||||
|
gg = 1.0 / ctx->attribs->ggamma;
|
||||||
|
bg = 1.0 / ctx->attribs->bgamma;
|
||||||
|
for (r = 0; r < cpc; r++) {
|
||||||
|
for (g = 0; g < cpc; g++) {
|
||||||
|
for (b = 0; b < cpc; b++) {
|
||||||
|
colors[i].red = (r * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].green = (g * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].blue = (b * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
|
||||||
|
tmp = (double) colors[i].red / 65536.0;
|
||||||
|
colors[i].red = (unsigned short) (65536.0 * pow(tmp, rg));
|
||||||
|
|
||||||
|
tmp = (double) colors[i].green / 65536.0;
|
||||||
|
colors[i].green = (unsigned short) (65536.0 * pow(tmp, gg));
|
||||||
|
|
||||||
|
tmp = (double) colors[i].blue / 65536.0;
|
||||||
|
colors[i].blue = (unsigned short) (65536.0 * pow(tmp, bg));
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
for (r = 0; r < cpc; r++) {
|
||||||
|
for (g = 0; g < cpc; g++) {
|
||||||
|
for (b = 0; b < cpc; b++) {
|
||||||
|
colors[i].red = (r * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].green = (g * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].blue = (b * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* try to allocate the colors */
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
||||||
|
colors[i].flags = 0; /* failed */
|
||||||
|
} else {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* try to allocate close values for the colors that couldn't
|
||||||
|
* be allocated before */
|
||||||
|
avncolors = (1 << ctx->depth > 256 ? 256 : 1 << ctx->depth);
|
||||||
|
for (i = 0; i < avncolors; i++)
|
||||||
|
avcolors[i].pixel = i;
|
||||||
|
|
||||||
|
XQueryColors(ctx->dpy, ctx->cmap, avcolors, avncolors);
|
||||||
|
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
if (colors[i].flags == 0) {
|
||||||
|
int j;
|
||||||
|
unsigned long cdiff = 0xffffffff, diff;
|
||||||
|
unsigned long closest = 0;
|
||||||
|
|
||||||
|
retries = 2;
|
||||||
|
|
||||||
|
while (retries--) {
|
||||||
|
/* find closest color */
|
||||||
|
for (j = 0; j < avncolors; j++) {
|
||||||
|
r = (colors[i].red - avcolors[i].red) >> 8;
|
||||||
|
g = (colors[i].green - avcolors[i].green) >> 8;
|
||||||
|
b = (colors[i].blue - avcolors[i].blue) >> 8;
|
||||||
|
diff = r * r + g * g + b * b;
|
||||||
|
if (diff < cdiff) {
|
||||||
|
cdiff = diff;
|
||||||
|
closest = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* allocate closest color found */
|
||||||
|
colors[i].red = avcolors[closest].red;
|
||||||
|
colors[i].green = avcolors[closest].green;
|
||||||
|
colors[i].blue = avcolors[closest].blue;
|
||||||
|
if (XAllocColor(ctx->dpy, ctx->cmap, &colors[i])) {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
break; /* succeeded, don't need to retry */
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("close color allocation failed. Retrying...\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return colors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static XColor *
|
||||||
|
allocateGrayScale(RContext * ctx)
|
||||||
|
{
|
||||||
|
XColor *colors;
|
||||||
|
XColor avcolors[256];
|
||||||
|
int avncolors;
|
||||||
|
int i, ncolors, r, g, b;
|
||||||
|
int retries;
|
||||||
|
int cpc = ctx->attribs->colors_per_channel;
|
||||||
|
|
||||||
|
ncolors = cpc * cpc * cpc;
|
||||||
|
|
||||||
|
if (ctx->vclass == StaticGray) {
|
||||||
|
/* we might as well use all grays */
|
||||||
|
ncolors = 1 << ctx->depth;
|
||||||
|
} else {
|
||||||
|
if (ncolors > (1 << ctx->depth)) {
|
||||||
|
/* reduce colormap size */
|
||||||
|
cpc = ctx->attribs->colors_per_channel = 1 << ((int) ctx->depth / 3);
|
||||||
|
ncolors = cpc * cpc * cpc;
|
||||||
|
}
|
||||||
|
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ncolors >= 256 && ctx->vclass == StaticGray) {
|
||||||
|
/* don't need dithering for 256 levels of gray in StaticGray visual */
|
||||||
|
ctx->attribs->render_mode = RM_MATCH;
|
||||||
|
}
|
||||||
|
colors = malloc(sizeof(XColor) * ncolors);
|
||||||
|
if (!colors) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
colors[i].red = (i * 0xffff) / (ncolors - 1);
|
||||||
|
colors[i].green = (i * 0xffff) / (ncolors - 1);
|
||||||
|
colors[i].blue = (i * 0xffff) / (ncolors - 1);
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
}
|
||||||
|
/* try to allocate the colors */
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("trying:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
||||||
|
#endif
|
||||||
|
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
||||||
|
colors[i].flags = 0; /* failed */
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("failed:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("success:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* try to allocate close values for the colors that couldn't
|
||||||
|
* be allocated before */
|
||||||
|
avncolors = (1 << ctx->depth > 256 ? 256 : 1 << ctx->depth);
|
||||||
|
for (i = 0; i < avncolors; i++)
|
||||||
|
avcolors[i].pixel = i;
|
||||||
|
|
||||||
|
XQueryColors(ctx->dpy, ctx->cmap, avcolors, avncolors);
|
||||||
|
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
if (colors[i].flags == 0) {
|
||||||
|
int j;
|
||||||
|
unsigned long cdiff = 0xffffffff, diff;
|
||||||
|
unsigned long closest = 0;
|
||||||
|
|
||||||
|
retries = 2;
|
||||||
|
|
||||||
|
while (retries--) {
|
||||||
|
/* find closest color */
|
||||||
|
for (j = 0; j < avncolors; j++) {
|
||||||
|
r = (colors[i].red - avcolors[i].red) >> 8;
|
||||||
|
g = (colors[i].green - avcolors[i].green) >> 8;
|
||||||
|
b = (colors[i].blue - avcolors[i].blue) >> 8;
|
||||||
|
diff = r * r + g * g + b * b;
|
||||||
|
if (diff < cdiff) {
|
||||||
|
cdiff = diff;
|
||||||
|
closest = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* allocate closest color found */
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("best match:%x,%x,%x => %x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue, avcolors[closest].red, avcolors[closest].green, avcolors[closest].blue);
|
||||||
|
#endif
|
||||||
|
colors[i].red = avcolors[closest].red;
|
||||||
|
colors[i].green = avcolors[closest].green;
|
||||||
|
colors[i].blue = avcolors[closest].blue;
|
||||||
|
if (XAllocColor(ctx->dpy, ctx->cmap, &colors[i])) {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
break; /* succeeded, don't need to retry */
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("close color allocation failed. Retrying...\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return colors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
mygetenv(char *var, int scr)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
char varname[64];
|
||||||
|
|
||||||
|
sprintf(varname, "%s%i", var, scr);
|
||||||
|
p = getenv(varname);
|
||||||
|
if (!p) {
|
||||||
|
p = getenv(var);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gatherconfig(RContext * context, int screen_n)
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
ptr = mygetenv("WRASTER_GAMMA", screen_n);
|
||||||
|
if (ptr) {
|
||||||
|
float g1, g2, g3;
|
||||||
|
if (sscanf(ptr, "%f/%f/%f", &g1, &g2, &g3) != 3
|
||||||
|
|| g1 <= 0.0 || g2 <= 0.0 || g3 <= 0.0) {
|
||||||
|
printf("wrlib: invalid value(s) for gamma correction \"%s\"\n",
|
||||||
|
ptr);
|
||||||
|
} else {
|
||||||
|
context->attribs->flags |= RC_GammaCorrection;
|
||||||
|
context->attribs->rgamma = g1;
|
||||||
|
context->attribs->ggamma = g2;
|
||||||
|
context->attribs->bgamma = g3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptr = mygetenv("WRASTER_COLOR_RESOLUTION", screen_n);
|
||||||
|
if (ptr) {
|
||||||
|
int i;
|
||||||
|
if (sscanf(ptr, "%d", &i) != 1 || i < 2 || i > 6) {
|
||||||
|
printf("wrlib: invalid value for color resolution \"%s\"\n", ptr);
|
||||||
|
} else {
|
||||||
|
context->attribs->flags |= RC_ColorsPerChannel;
|
||||||
|
context->attribs->colors_per_channel = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void getColormap(RContext * context, int screen_number)
|
||||||
|
{
|
||||||
|
Colormap cmap = None;
|
||||||
|
XStandardColormap *cmaps;
|
||||||
|
int ncmaps, i;
|
||||||
|
|
||||||
|
if (XGetRGBColormaps(context->dpy,
|
||||||
|
RootWindow(context->dpy, screen_number),
|
||||||
|
&cmaps, &ncmaps, XA_RGB_DEFAULT_MAP)) {
|
||||||
|
for (i = 0; i < ncmaps; ++i) {
|
||||||
|
if (cmaps[i].visualid == context->visual->visualid) {
|
||||||
|
puts("ACHOU");
|
||||||
|
cmap = cmaps[i].colormap;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XFree(cmaps);
|
||||||
|
}
|
||||||
|
if (cmap == None) {
|
||||||
|
XColor color;
|
||||||
|
|
||||||
|
cmap = XCreateColormap(context->dpy,
|
||||||
|
RootWindow(context->dpy, screen_number),
|
||||||
|
context->visual, AllocNone);
|
||||||
|
|
||||||
|
color.red = color.green = color.blue = 0;
|
||||||
|
XAllocColor(context->dpy, cmap, &color);
|
||||||
|
context->black = color.pixel;
|
||||||
|
|
||||||
|
color.red = color.green = color.blue = 0xffff;
|
||||||
|
XAllocColor(context->dpy, cmap, &color);
|
||||||
|
context->white = color.pixel;
|
||||||
|
|
||||||
|
}
|
||||||
|
context->cmap = cmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int count_offset(unsigned long mask)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while ((mask & 1) == 0) {
|
||||||
|
i++;
|
||||||
|
mask = mask >> 1;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RContext *
|
||||||
|
myRCreateContext(Display * dpy, int screen_number, RContextAttributes * attribs)
|
||||||
|
{
|
||||||
|
RContext *context;
|
||||||
|
XGCValues gcv;
|
||||||
|
|
||||||
|
|
||||||
|
context = malloc(sizeof(RContext));
|
||||||
|
if (!context) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memset(context, 0, sizeof(RContext));
|
||||||
|
|
||||||
|
context->dpy = dpy;
|
||||||
|
|
||||||
|
context->screen_number = screen_number;
|
||||||
|
|
||||||
|
context->attribs = malloc(sizeof(RContextAttributes));
|
||||||
|
if (!context->attribs) {
|
||||||
|
free(context);
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!attribs)
|
||||||
|
*context->attribs = DEFAULT_CONTEXT_ATTRIBS;
|
||||||
|
else
|
||||||
|
*context->attribs = *attribs;
|
||||||
|
|
||||||
|
/* get configuration from environment variables */
|
||||||
|
gatherconfig(context, screen_number);
|
||||||
|
|
||||||
|
if ((context->attribs->flags & RC_VisualID)) {
|
||||||
|
XVisualInfo *vinfo, templ;
|
||||||
|
int nret;
|
||||||
|
|
||||||
|
templ.screen = screen_number;
|
||||||
|
templ.visualid = context->attribs->visualid;
|
||||||
|
vinfo = XGetVisualInfo(context->dpy, VisualIDMask | VisualScreenMask,
|
||||||
|
&templ, &nret);
|
||||||
|
if (!vinfo || nret == 0) {
|
||||||
|
free(context);
|
||||||
|
RErrorCode = RERR_BADVISUALID;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (vinfo[0].visual == DefaultVisual(dpy, screen_number)) {
|
||||||
|
context->attribs->flags |= RC_DefaultVisual;
|
||||||
|
} else {
|
||||||
|
XSetWindowAttributes attr;
|
||||||
|
unsigned long mask;
|
||||||
|
|
||||||
|
context->visual = vinfo[0].visual;
|
||||||
|
context->depth = vinfo[0].depth;
|
||||||
|
context->vclass = vinfo[0].class;
|
||||||
|
getColormap(context, screen_number);
|
||||||
|
attr.colormap = context->cmap;
|
||||||
|
attr.override_redirect = True;
|
||||||
|
attr.border_pixel = 0;
|
||||||
|
attr.background_pixel = 0;
|
||||||
|
mask = CWBorderPixel | CWColormap | CWOverrideRedirect | CWBackPixel;
|
||||||
|
context->drawable =
|
||||||
|
XCreateWindow(dpy, RootWindow(dpy, screen_number), 1, 1,
|
||||||
|
1, 1, 0, context->depth, CopyFromParent,
|
||||||
|
context->visual, mask, &attr);
|
||||||
|
/* XSetWindowColormap(dpy, context->drawable, attr.colormap); */
|
||||||
|
}
|
||||||
|
XFree(vinfo);
|
||||||
|
}
|
||||||
|
/* use default */
|
||||||
|
if (!context->visual) {
|
||||||
|
if ((context->attribs->flags & RC_DefaultVisual)
|
||||||
|
|| !bestContext(dpy, screen_number, context)) {
|
||||||
|
context->visual = DefaultVisual(dpy, screen_number);
|
||||||
|
context->depth = DefaultDepth(dpy, screen_number);
|
||||||
|
context->cmap = DefaultColormap(dpy, screen_number);
|
||||||
|
context->drawable = RootWindow(dpy, screen_number);
|
||||||
|
context->black = BlackPixel(dpy, screen_number);
|
||||||
|
context->white = WhitePixel(dpy, screen_number);
|
||||||
|
context->vclass = context->visual->class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gcv.function = GXcopy;
|
||||||
|
gcv.graphics_exposures = False;
|
||||||
|
context->copy_gc = XCreateGC(dpy, context->drawable, GCFunction
|
||||||
|
| GCGraphicsExposures, &gcv);
|
||||||
|
|
||||||
|
if (context->vclass == PseudoColor || context->vclass == StaticColor) {
|
||||||
|
context->colors = allocatePseudoColor(context);
|
||||||
|
if (!context->colors) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else if (context->vclass == GrayScale || context->vclass == StaticGray) {
|
||||||
|
context->colors = allocateGrayScale(context);
|
||||||
|
if (!context->colors) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else if (context->vclass == TrueColor) {
|
||||||
|
/* calc offsets to create a TrueColor pixel */
|
||||||
|
context->red_offset = count_offset(context->visual->red_mask);
|
||||||
|
context->green_offset = count_offset(context->visual->green_mask);
|
||||||
|
context->blue_offset = count_offset(context->visual->blue_mask);
|
||||||
|
/* disable dithering on 24 bits visuals */
|
||||||
|
if (context->depth >= 24)
|
||||||
|
context->attribs->render_mode = RM_MATCH;
|
||||||
|
}
|
||||||
|
/* check avaiability of MIT-SHM */
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
bestContext(Display * dpy, int screen_number, RContext * context)
|
||||||
|
{
|
||||||
|
XVisualInfo *vinfo = NULL, rvinfo;
|
||||||
|
int best = -1, numvis, i;
|
||||||
|
long flags;
|
||||||
|
XSetWindowAttributes attr;
|
||||||
|
|
||||||
|
rvinfo.class = TrueColor;
|
||||||
|
rvinfo.screen = screen_number;
|
||||||
|
flags = VisualClassMask | VisualScreenMask;
|
||||||
|
|
||||||
|
vinfo = XGetVisualInfo(dpy, flags, &rvinfo, &numvis);
|
||||||
|
if (vinfo) { /* look for a TrueColor, 24-bit or more (pref 24) */
|
||||||
|
for (i = numvis - 1, best = -1; i >= 0; i--) {
|
||||||
|
if (vinfo[i].depth == 24)
|
||||||
|
best = i;
|
||||||
|
else if (vinfo[i].depth > 24 && best < 0)
|
||||||
|
best = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
if (best == -1) { /* look for a DirectColor, 24-bit or more (pref 24) */
|
||||||
|
rvinfo.class = DirectColor;
|
||||||
|
if (vinfo)
|
||||||
|
XFree((char *) vinfo);
|
||||||
|
vinfo = XGetVisualInfo(dpy, flags, &rvinfo, &numvis);
|
||||||
|
if (vinfo) {
|
||||||
|
for (i = 0, best = -1; i < numvis; i++) {
|
||||||
|
if (vinfo[i].depth == 24)
|
||||||
|
best = i;
|
||||||
|
else if (vinfo[i].depth > 24 && best < 0)
|
||||||
|
best = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (best > -1) {
|
||||||
|
context->visual = vinfo[best].visual;
|
||||||
|
context->depth = vinfo[best].depth;
|
||||||
|
context->vclass = vinfo[best].class;
|
||||||
|
getColormap(context, screen_number);
|
||||||
|
attr.colormap = context->cmap;
|
||||||
|
attr.override_redirect = True;
|
||||||
|
attr.border_pixel = 0;
|
||||||
|
context->drawable =
|
||||||
|
XCreateWindow(dpy, RootWindow(dpy, screen_number),
|
||||||
|
1, 1, 1, 1, 0, context->depth,
|
||||||
|
CopyFromParent, context->visual,
|
||||||
|
CWBorderPixel | CWColormap | CWOverrideRedirect, &attr);
|
||||||
|
/* XSetWindowColormap(dpy, context->drawable, context->cmap); */
|
||||||
|
}
|
||||||
|
if (vinfo)
|
||||||
|
XFree((char *) vinfo);
|
||||||
|
|
||||||
|
if (best < 0)
|
||||||
|
return False;
|
||||||
|
else
|
||||||
|
return True;
|
||||||
|
}
|
578
wmglobe/src/myconvert.c
Normal file
578
wmglobe/src/myconvert.c
Normal file
|
@ -0,0 +1,578 @@
|
||||||
|
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
||||||
|
* myconvert.c - an adaptation of wrlib for use in wmglobe
|
||||||
|
* initial source taken in WindowMaker-0.20.3/wrlib :
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* convert.c - convert RImage to Pixmap
|
||||||
|
* Raster graphics library
|
||||||
|
*
|
||||||
|
* Copyright (c) 1997 Alfredo K. Kojima
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* #include <config.h>
|
||||||
|
*/
|
||||||
|
#include "wmglobe.h"
|
||||||
|
|
||||||
|
typedef struct RConversionTable {
|
||||||
|
unsigned short table[256];
|
||||||
|
unsigned short index;
|
||||||
|
struct RConversionTable *next;
|
||||||
|
} RConversionTable;
|
||||||
|
|
||||||
|
|
||||||
|
static RConversionTable *conversionTable = NULL;
|
||||||
|
static RConversionTable *pif[3];
|
||||||
|
static short *re, *ge, *be;
|
||||||
|
static short *nre, *nge, *nbe;
|
||||||
|
static RXImage *ximgok;
|
||||||
|
|
||||||
|
void initmyconvert()
|
||||||
|
{
|
||||||
|
pif[0] = (RConversionTable *) malloc(sizeof(RConversionTable));
|
||||||
|
pif[1] = (RConversionTable *) malloc(sizeof(RConversionTable));
|
||||||
|
pif[2] = (RConversionTable *) malloc(sizeof(RConversionTable));
|
||||||
|
re = (short *) malloc((DIAMETRE + 2) * sizeof(short));
|
||||||
|
ge = (short *) malloc((DIAMETRE + 2) * sizeof(short));
|
||||||
|
be = (short *) malloc((DIAMETRE + 2) * sizeof(short));
|
||||||
|
nre = (short *) malloc((DIAMETRE + 2) * sizeof(short));
|
||||||
|
nge = (short *) malloc((DIAMETRE + 2) * sizeof(short));
|
||||||
|
nbe = (short *) malloc((DIAMETRE + 2) * sizeof(short));
|
||||||
|
ximgok = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned short *
|
||||||
|
computeTable(unsigned short mask, int hop)
|
||||||
|
{
|
||||||
|
RConversionTable *tmp = conversionTable;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
tmp = pif[hop];
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
tmp->table[i] = (i * mask + 0x7f) / 0xff;
|
||||||
|
|
||||||
|
tmp->index = mask;
|
||||||
|
return tmp->table;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static RXImage *
|
||||||
|
image2TrueColor(RContext * ctx, RImage * image)
|
||||||
|
{
|
||||||
|
RXImage *ximg;
|
||||||
|
register int x, y, r, g, b;
|
||||||
|
unsigned char *red, *grn, *blu;
|
||||||
|
unsigned long pixel;
|
||||||
|
unsigned short rmask, gmask, bmask;
|
||||||
|
unsigned short roffs, goffs, boffs;
|
||||||
|
unsigned short *rtable, *gtable, *btable;
|
||||||
|
int ofs;
|
||||||
|
|
||||||
|
if (ximgok == NULL)
|
||||||
|
ximgok = RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
||||||
|
|
||||||
|
ximg = ximgok;
|
||||||
|
if (!ximg) {
|
||||||
|
puts("err ");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
red = image->data[0];
|
||||||
|
grn = image->data[1];
|
||||||
|
blu = image->data[2];
|
||||||
|
|
||||||
|
roffs = ctx->red_offset;
|
||||||
|
goffs = ctx->green_offset;
|
||||||
|
boffs = ctx->blue_offset;
|
||||||
|
|
||||||
|
rmask = ctx->visual->red_mask >> roffs;
|
||||||
|
gmask = ctx->visual->green_mask >> goffs;
|
||||||
|
bmask = ctx->visual->blue_mask >> boffs;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
rtable = computeTable(rmask, 0);
|
||||||
|
gtable = computeTable(gmask, 1);
|
||||||
|
btable = computeTable(bmask, 2);
|
||||||
|
|
||||||
|
if (rtable == NULL || gtable == NULL || btable == NULL) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
RDestroyXImage(ctx, ximg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (ctx->attribs->render_mode == RM_MATCH) {
|
||||||
|
/* fake match */
|
||||||
|
#ifdef DEBUG
|
||||||
|
puts("true color match");
|
||||||
|
#endif
|
||||||
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
|
for (x = 0; x < image->width; x++, ofs++) {
|
||||||
|
/* reduce pixel */
|
||||||
|
r = rtable[red[ofs]];
|
||||||
|
g = gtable[grn[ofs]];
|
||||||
|
b = btable[blu[ofs]];
|
||||||
|
pixel = (r << roffs) | (g << goffs) | (b << boffs);
|
||||||
|
XPutPixel(ximg->image, x, y, pixel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* dither */
|
||||||
|
short *rerr, *gerr, *berr;
|
||||||
|
short *nrerr, *ngerr, *nberr;
|
||||||
|
short *terr;
|
||||||
|
int rer, ger, ber;
|
||||||
|
const int dr = 0xff / rmask;
|
||||||
|
const int dg = 0xff / gmask;
|
||||||
|
const int db = 0xff / bmask;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
puts("true color dither");
|
||||||
|
#endif
|
||||||
|
rerr = re;
|
||||||
|
gerr = ge;
|
||||||
|
berr = be;
|
||||||
|
nrerr = nre;
|
||||||
|
ngerr = nge;
|
||||||
|
nberr = nbe;
|
||||||
|
|
||||||
|
if (!rerr || !gerr || !berr || !nrerr || !ngerr || !nberr) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
RDestroyXImage(ctx, ximg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (x = 0; x < image->width; x++) {
|
||||||
|
|
||||||
|
rerr[x] = red[x];
|
||||||
|
gerr[x] = grn[x];
|
||||||
|
berr[x] = blu[x];
|
||||||
|
}
|
||||||
|
rerr[x] = gerr[x] = berr[x] = 0;
|
||||||
|
/* convert and dither the image to XImage */
|
||||||
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
|
if (y < image->height - 1) {
|
||||||
|
int x1;
|
||||||
|
for (x = 0, x1 = ofs + image->width; x < image->width; x++, x1++) {
|
||||||
|
nrerr[x] = red[x1];
|
||||||
|
ngerr[x] = grn[x1];
|
||||||
|
nberr[x] = blu[x1];
|
||||||
|
}
|
||||||
|
/* last column */
|
||||||
|
x1--;
|
||||||
|
nrerr[x] = red[x1];
|
||||||
|
ngerr[x] = grn[x1];
|
||||||
|
nberr[x] = blu[x1];
|
||||||
|
}
|
||||||
|
for (x = 0; x < image->width; x++) {
|
||||||
|
/* reduce pixel */
|
||||||
|
if (rerr[x] > 0xff)
|
||||||
|
rerr[x] = 0xff;
|
||||||
|
else if (rerr[x] < 0)
|
||||||
|
rerr[x] = 0;
|
||||||
|
if (gerr[x] > 0xff)
|
||||||
|
gerr[x] = 0xff;
|
||||||
|
else if (gerr[x] < 0)
|
||||||
|
gerr[x] = 0;
|
||||||
|
if (berr[x] > 0xff)
|
||||||
|
berr[x] = 0xff;
|
||||||
|
else if (berr[x] < 0)
|
||||||
|
berr[x] = 0;
|
||||||
|
|
||||||
|
r = rtable[rerr[x]];
|
||||||
|
g = gtable[gerr[x]];
|
||||||
|
b = btable[berr[x]];
|
||||||
|
|
||||||
|
pixel = (r << roffs) | (g << goffs) | (b << boffs);
|
||||||
|
XPutPixel(ximg->image, x, y, pixel);
|
||||||
|
/* calc error */
|
||||||
|
rer = rerr[x] - r * dr;
|
||||||
|
ger = gerr[x] - g * dg;
|
||||||
|
ber = berr[x] - b * db;
|
||||||
|
|
||||||
|
/* distribute error */
|
||||||
|
r = (rer * 3) / 8;
|
||||||
|
g = (ger * 3) / 8;
|
||||||
|
b = (ber * 3) / 8;
|
||||||
|
/* x+1, y */
|
||||||
|
rerr[x + 1] += r;
|
||||||
|
gerr[x + 1] += g;
|
||||||
|
berr[x + 1] += b;
|
||||||
|
/* x, y+1 */
|
||||||
|
nrerr[x] += r;
|
||||||
|
ngerr[x] += g;
|
||||||
|
nberr[x] += b;
|
||||||
|
/* x+1, y+1 */
|
||||||
|
nrerr[x + 1] += rer - 2 * r;
|
||||||
|
ngerr[x + 1] += ger - 2 * g;
|
||||||
|
nberr[x + 1] += ber - 2 * b;
|
||||||
|
}
|
||||||
|
ofs += image->width;
|
||||||
|
/* skip to next line */
|
||||||
|
terr = rerr;
|
||||||
|
rerr = nrerr;
|
||||||
|
nrerr = terr;
|
||||||
|
|
||||||
|
terr = gerr;
|
||||||
|
gerr = ngerr;
|
||||||
|
ngerr = terr;
|
||||||
|
|
||||||
|
terr = berr;
|
||||||
|
berr = nberr;
|
||||||
|
nberr = terr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ximg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static RXImage *
|
||||||
|
image2PseudoColor(RContext * ctx, RImage * image)
|
||||||
|
{
|
||||||
|
RXImage *ximg;
|
||||||
|
register int x, y, r, g, b;
|
||||||
|
unsigned char *red, *grn, *blu;
|
||||||
|
unsigned long pixel;
|
||||||
|
const int cpc = ctx->attribs->colors_per_channel;
|
||||||
|
const unsigned short rmask = cpc - 1; /* different sizes could be used */
|
||||||
|
const unsigned short gmask = rmask; /* for r,g,b */
|
||||||
|
const unsigned short bmask = rmask;
|
||||||
|
unsigned short *rtable, *gtable, *btable;
|
||||||
|
const int cpccpc = cpc * cpc;
|
||||||
|
unsigned char *data;
|
||||||
|
int ofs;
|
||||||
|
/*register unsigned char maxrgb = 0xff; */
|
||||||
|
|
||||||
|
if (ximgok == NULL)
|
||||||
|
ximgok = RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
||||||
|
|
||||||
|
ximg = ximgok;
|
||||||
|
|
||||||
|
if (!ximg) {
|
||||||
|
puts("err psc");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
red = image->data[0];
|
||||||
|
grn = image->data[1];
|
||||||
|
blu = image->data[2];
|
||||||
|
|
||||||
|
data = ximg->image->data;
|
||||||
|
|
||||||
|
/* Tables are same at the moment because rmask==gmask==bmask. */
|
||||||
|
rtable = computeTable(rmask, 0);
|
||||||
|
gtable = computeTable(gmask, 1);
|
||||||
|
btable = computeTable(bmask, 2);
|
||||||
|
|
||||||
|
if (rtable == NULL || gtable == NULL || btable == NULL) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
RDestroyXImage(ctx, ximg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (ctx->attribs->render_mode == RM_MATCH) {
|
||||||
|
/* fake match */
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("pseudo color match with %d colors per channel\n", cpc);
|
||||||
|
#endif
|
||||||
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
|
for (x = 0; x < image->width; x++, ofs++) {
|
||||||
|
/* reduce pixel */
|
||||||
|
r = rtable[red[ofs]];
|
||||||
|
g = gtable[grn[ofs]];
|
||||||
|
b = btable[blu[ofs]];
|
||||||
|
pixel = r * cpccpc + g * cpc + b;
|
||||||
|
/*data[ofs] = ctx->colors[pixel].pixel; */
|
||||||
|
XPutPixel(ximg->image, x, y, ctx->colors[pixel].pixel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* dither */
|
||||||
|
short *rerr, *gerr, *berr;
|
||||||
|
short *nrerr, *ngerr, *nberr;
|
||||||
|
short *terr;
|
||||||
|
int rer, ger, ber;
|
||||||
|
const int dr = 0xff / rmask;
|
||||||
|
const int dg = 0xff / gmask;
|
||||||
|
const int db = 0xff / bmask;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("pseudo color dithering with %d colors per channel\n", cpc);
|
||||||
|
#endif
|
||||||
|
rerr = re;
|
||||||
|
gerr = ge;
|
||||||
|
berr = be;
|
||||||
|
nrerr = nre;
|
||||||
|
ngerr = nge;
|
||||||
|
nberr = nbe;
|
||||||
|
if (!rerr || !gerr || !berr || !nrerr || !ngerr || !nberr) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
RDestroyXImage(ctx, ximg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (x = 0; x < image->width; x++) {
|
||||||
|
rerr[x] = red[x];
|
||||||
|
gerr[x] = grn[x];
|
||||||
|
berr[x] = blu[x];
|
||||||
|
}
|
||||||
|
rerr[x] = gerr[x] = berr[x] = 0;
|
||||||
|
/* convert and dither the image to XImage */
|
||||||
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
|
if (y < image->height - 1) {
|
||||||
|
int x1;
|
||||||
|
for (x = 0, x1 = ofs + image->width; x < image->width; x++, x1++) {
|
||||||
|
nrerr[x] = red[x1];
|
||||||
|
ngerr[x] = grn[x1];
|
||||||
|
nberr[x] = blu[x1];
|
||||||
|
}
|
||||||
|
/* last column */
|
||||||
|
x1--;
|
||||||
|
nrerr[x] = red[x1];
|
||||||
|
ngerr[x] = grn[x1];
|
||||||
|
nberr[x] = blu[x1];
|
||||||
|
}
|
||||||
|
for (x = 0; x < image->width; x++, ofs++) {
|
||||||
|
/* reduce pixel */
|
||||||
|
if (rerr[x] > 0xff)
|
||||||
|
rerr[x] = 0xff;
|
||||||
|
else if (rerr[x] < 0)
|
||||||
|
rerr[x] = 0;
|
||||||
|
if (gerr[x] > 0xff)
|
||||||
|
gerr[x] = 0xff;
|
||||||
|
else if (gerr[x] < 0)
|
||||||
|
gerr[x] = 0;
|
||||||
|
if (berr[x] > 0xff)
|
||||||
|
berr[x] = 0xff;
|
||||||
|
else if (berr[x] < 0)
|
||||||
|
berr[x] = 0;
|
||||||
|
|
||||||
|
r = rtable[rerr[x]];
|
||||||
|
g = gtable[gerr[x]];
|
||||||
|
b = btable[berr[x]];
|
||||||
|
|
||||||
|
pixel = r * cpccpc + g * cpc + b;
|
||||||
|
/*data[ofs] = ctx->colors[pixel].pixel; */
|
||||||
|
XPutPixel(ximg->image, x, y, ctx->colors[pixel].pixel);
|
||||||
|
|
||||||
|
/* calc error */
|
||||||
|
rer = rerr[x] - r * dr;
|
||||||
|
ger = gerr[x] - g * dg;
|
||||||
|
ber = berr[x] - b * db;
|
||||||
|
|
||||||
|
/* distribute error */
|
||||||
|
rerr[x + 1] += (rer * 7) / 16;
|
||||||
|
gerr[x + 1] += (ger * 7) / 16;
|
||||||
|
berr[x + 1] += (ber * 7) / 16;
|
||||||
|
|
||||||
|
nrerr[x] += (rer * 5) / 16;
|
||||||
|
ngerr[x] += (ger * 5) / 16;
|
||||||
|
nberr[x] += (ber * 5) / 16;
|
||||||
|
|
||||||
|
if (x > 0) {
|
||||||
|
nrerr[x - 1] += (rer * 3) / 16;
|
||||||
|
ngerr[x - 1] += (ger * 3) / 16;
|
||||||
|
nberr[x - 1] += (ber * 3) / 16;
|
||||||
|
}
|
||||||
|
nrerr[x + 1] += rer / 16;
|
||||||
|
ngerr[x + 1] += ger / 16;
|
||||||
|
nberr[x + 1] += ber / 16;
|
||||||
|
}
|
||||||
|
/* skip to next line */
|
||||||
|
terr = rerr;
|
||||||
|
rerr = nrerr;
|
||||||
|
nrerr = terr;
|
||||||
|
|
||||||
|
terr = gerr;
|
||||||
|
gerr = ngerr;
|
||||||
|
ngerr = terr;
|
||||||
|
|
||||||
|
terr = berr;
|
||||||
|
berr = nberr;
|
||||||
|
nberr = terr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ximg->image->data = (char *) data;
|
||||||
|
|
||||||
|
return ximg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static RXImage *
|
||||||
|
image2GrayScale(RContext * ctx, RImage * image)
|
||||||
|
{
|
||||||
|
RXImage *ximg;
|
||||||
|
register int x, y, g;
|
||||||
|
unsigned char *red, *grn, *blu;
|
||||||
|
const int cpc = ctx->attribs->colors_per_channel;
|
||||||
|
unsigned short gmask;
|
||||||
|
unsigned short *table;
|
||||||
|
unsigned char *data;
|
||||||
|
int ofs;
|
||||||
|
/*register unsigned char maxrgb = 0xff; */
|
||||||
|
|
||||||
|
if (ximgok == NULL)
|
||||||
|
ximgok = RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
||||||
|
|
||||||
|
ximg = ximgok;
|
||||||
|
|
||||||
|
if (!ximg) {
|
||||||
|
puts("error!");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
red = image->data[0];
|
||||||
|
grn = image->data[1];
|
||||||
|
blu = image->data[2];
|
||||||
|
|
||||||
|
data = ximg->image->data;
|
||||||
|
|
||||||
|
if (ctx->vclass == StaticGray)
|
||||||
|
gmask = (1 << ctx->depth) - 1; /* use all grays */
|
||||||
|
else
|
||||||
|
gmask = cpc * cpc * cpc - 1;
|
||||||
|
|
||||||
|
table = computeTable(gmask, 0);
|
||||||
|
|
||||||
|
if (table == NULL) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
RDestroyXImage(ctx, ximg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (ctx->attribs->render_mode == RM_MATCH) {
|
||||||
|
/* fake match */
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("grayscale match with %d colors per channel\n", cpc);
|
||||||
|
#endif
|
||||||
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
|
for (x = 0; x < image->width; x++, ofs++) {
|
||||||
|
/* reduce pixel */
|
||||||
|
g = table[(red[ofs] * 30 + grn[ofs] * 59 + blu[ofs] * 11) / 100];
|
||||||
|
|
||||||
|
/*data[ofs] = ctx->colors[g].pixel; */
|
||||||
|
XPutPixel(ximg->image, x, y, ctx->colors[g].pixel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* dither */
|
||||||
|
short *gerr;
|
||||||
|
short *ngerr;
|
||||||
|
short *terr;
|
||||||
|
int ger;
|
||||||
|
const int dg = 0xff / gmask;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("grayscale dither with %d colors per channel\n", cpc);
|
||||||
|
#endif
|
||||||
|
gerr = ge;
|
||||||
|
ngerr = nge;
|
||||||
|
if (!gerr || !ngerr) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
RDestroyXImage(ctx, ximg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (x = 0; x < image->width; x++) {
|
||||||
|
gerr[x] = (red[x] * 30 + grn[x] * 59 + blu[x] * 11) / 100;
|
||||||
|
}
|
||||||
|
gerr[x] = 0;
|
||||||
|
/* convert and dither the image to XImage */
|
||||||
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
|
if (y < image->height - 1) {
|
||||||
|
int x1;
|
||||||
|
for (x = 0, x1 = ofs + image->width; x < image->width; x++, x1++) {
|
||||||
|
ngerr[x] = (red[x1] * 30 + grn[x1] * 59 + blu[x1] * 11) / 100;
|
||||||
|
}
|
||||||
|
/* last column */
|
||||||
|
x1--;
|
||||||
|
ngerr[x] = (red[x1] * 30 + grn[x1] * 59 + blu[x1] * 11) / 100;
|
||||||
|
}
|
||||||
|
for (x = 0; x < image->width; x++, ofs++) {
|
||||||
|
/* reduce pixel */
|
||||||
|
if (gerr[x] > 0xff)
|
||||||
|
gerr[x] = 0xff;
|
||||||
|
else if (gerr[x] < 0)
|
||||||
|
gerr[x] = 0;
|
||||||
|
|
||||||
|
g = table[gerr[x]];
|
||||||
|
|
||||||
|
/*data[ofs] = ctx->colors[g].pixel; */
|
||||||
|
XPutPixel(ximg->image, x, y, ctx->colors[g].pixel);
|
||||||
|
/* calc error */
|
||||||
|
ger = gerr[x] - g * dg;
|
||||||
|
|
||||||
|
/* distribute error */
|
||||||
|
g = (ger * 3) / 8;
|
||||||
|
/* x+1, y */
|
||||||
|
gerr[x + 1] += g;
|
||||||
|
/* x, y+1 */
|
||||||
|
ngerr[x] += g;
|
||||||
|
/* x+1, y+1 */
|
||||||
|
ngerr[x + 1] += ger - 2 * g;
|
||||||
|
}
|
||||||
|
/* skip to next line */
|
||||||
|
terr = gerr;
|
||||||
|
gerr = ngerr;
|
||||||
|
ngerr = terr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ximg->image->data = (char *) data;
|
||||||
|
|
||||||
|
return ximg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int myRConvertImage(RContext * context, RImage * image, Pixmap * pixmap)
|
||||||
|
{
|
||||||
|
RXImage *ximg = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
assert(context != NULL);
|
||||||
|
assert(image != NULL);
|
||||||
|
assert(pixmap != NULL);
|
||||||
|
|
||||||
|
/* clear error message */
|
||||||
|
if (context->vclass == TrueColor)
|
||||||
|
ximg = image2TrueColor(context, image);
|
||||||
|
else if (context->vclass == PseudoColor || context->vclass == StaticColor)
|
||||||
|
ximg = image2PseudoColor(context, image);
|
||||||
|
else if (context->vclass == GrayScale || context->vclass == StaticGray)
|
||||||
|
ximg = image2GrayScale(context, image);
|
||||||
|
|
||||||
|
if (!ximg) {
|
||||||
|
#ifdef C_ALLOCA
|
||||||
|
alloca(0);
|
||||||
|
#endif
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* *pixmap = XCreatePixmap(context->dpy, context->drawable, image->width,
|
||||||
|
* image->height, context->depth);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
RPutXImage(context, *pixmap, context->copy_gc, ximg, 0, 0, 0, 0,
|
||||||
|
image->width, image->height);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RDestroyXImage(context, ximg);
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef C_ALLOCA
|
||||||
|
|
||||||
|
alloca(0);
|
||||||
|
#endif
|
||||||
|
return True;
|
||||||
|
}
|
703
wmglobe/src/rend.c
Normal file
703
wmglobe/src/rend.c
Normal file
|
@ -0,0 +1,703 @@
|
||||||
|
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
||||||
|
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
***************************************************************************/
|
||||||
|
/* this code is based on XGlobe :
|
||||||
|
|
||||||
|
renderer.cpp
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This file is part of XGlobe. See README for details.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 Thorsten Scheuermann
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public Licenses as published by
|
||||||
|
* the Free Software Foundation.
|
||||||
|
*************************************************************************** */
|
||||||
|
|
||||||
|
|
||||||
|
#include "wmglobe.h"
|
||||||
|
|
||||||
|
static RColor mygetMapColorLinear
|
||||||
|
(double longitude, double latitude, double angle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* static RColor getMapColor(double longitude, double latitude, double angle);
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void randomPosition();
|
||||||
|
void setViewPos(double lat, double lon);
|
||||||
|
static void myRPutPixel(int x, int y, RColor * color);
|
||||||
|
static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx, int dy);
|
||||||
|
static void updateTime(int force);
|
||||||
|
static struct timeval timeaccel(struct timeval t);
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
struct timeval timeaccel(struct timeval t)
|
||||||
|
{
|
||||||
|
struct timeval at;
|
||||||
|
double rr;
|
||||||
|
|
||||||
|
t = diftimev(t, tini);
|
||||||
|
rr = floor((double) t.tv_sec * time_multi + (double) t.tv_usec * time_multi / 1000000.);
|
||||||
|
/*** something bad may appen if time_multi=max after 41 minutes (overflow) ***/
|
||||||
|
while (rr > (double) LONG_MAX)
|
||||||
|
rr -= (2.0 * (double) LONG_MAX + 1.0);
|
||||||
|
at.tv_sec = (int) rr;
|
||||||
|
at.tv_usec = (int) (t.tv_usec * time_multi) % 1000000;
|
||||||
|
return addtimev(at, tbase);
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
static void myRPutPixel(int x, int y, RColor * color)
|
||||||
|
{
|
||||||
|
int ofs;
|
||||||
|
unsigned char *sr, *sg, *sb;
|
||||||
|
|
||||||
|
ofs = y * DIAMETRE + x;
|
||||||
|
sr = small->data[0] + ofs;
|
||||||
|
sg = small->data[1] + ofs;
|
||||||
|
sb = small->data[2] + ofs;
|
||||||
|
|
||||||
|
*sr = color->red;
|
||||||
|
*sg = color->green;
|
||||||
|
*sb = color->blue;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx, int dy)
|
||||||
|
{
|
||||||
|
int xx;
|
||||||
|
register int ofs;
|
||||||
|
|
||||||
|
/*** hope this is faster than calculation with floats .... ****/
|
||||||
|
|
||||||
|
x %= image->width;
|
||||||
|
xx = x;
|
||||||
|
y %= image->height;
|
||||||
|
ofs = y * image->width + x;
|
||||||
|
m[0]->r = image->data[0][ofs];
|
||||||
|
m[0]->g = image->data[1][ofs];
|
||||||
|
m[0]->b = image->data[2][ofs];
|
||||||
|
|
||||||
|
xx++;
|
||||||
|
xx %= image->width;
|
||||||
|
ofs = y * image->width + xx;
|
||||||
|
m[1]->r = image->data[0][ofs];
|
||||||
|
m[1]->g = image->data[1][ofs];
|
||||||
|
m[1]->b = image->data[2][ofs];
|
||||||
|
|
||||||
|
y++;
|
||||||
|
y %= image->height;
|
||||||
|
ofs = y * image->width + x;
|
||||||
|
m[2]->r = image->data[0][ofs];
|
||||||
|
m[2]->g = image->data[1][ofs];
|
||||||
|
m[2]->b = image->data[2][ofs];
|
||||||
|
|
||||||
|
ofs = y * image->width + xx;
|
||||||
|
m[3]->r = image->data[0][ofs];
|
||||||
|
m[3]->g = image->data[1][ofs];
|
||||||
|
m[3]->b = image->data[2][ofs];
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* m[0]->r=((m[0]->r*(256-dx)*(256-dy))+
|
||||||
|
* (m[1]->r*dx*(256-dy))+
|
||||||
|
* (m[2]->r*(256-dx)*dy)+
|
||||||
|
* (m[3]->r*dx*dy))>>16;
|
||||||
|
* m[0]->g=((m[0]->g*(256-dx)*(256-dy))+
|
||||||
|
* (m[1]->g*dx*(256-dy))+
|
||||||
|
* (m[2]->g*(256-dx)*dy)+
|
||||||
|
* (m[3]->g*dx*dy))>>16;
|
||||||
|
* m[0]->b=((m[0]->b*(256-dx)*(256-dy))+
|
||||||
|
* (m[1]->b*dx*(256-dy))+
|
||||||
|
* (m[2]->b*(256-dx)*dy)+
|
||||||
|
* (m[3]->b*dx*dy))>>16;
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((ofs = m[1]->r - m[0]->r) != 0)
|
||||||
|
m[0]->r += (ofs * dx) >> 8;
|
||||||
|
if ((ofs = m[1]->g - m[0]->g) != 0)
|
||||||
|
m[0]->g += (ofs * dx) >> 8;
|
||||||
|
if ((ofs = m[1]->b - m[0]->b) != 0)
|
||||||
|
m[0]->b += (ofs * dx) >> 8;
|
||||||
|
|
||||||
|
if ((ofs = m[3]->r - m[2]->r) != 0)
|
||||||
|
m[2]->r += (ofs * dx) >> 8;
|
||||||
|
if ((ofs = m[3]->g - m[2]->g) != 0)
|
||||||
|
m[2]->g += (ofs * dx) >> 8;
|
||||||
|
if ((ofs = m[3]->b - m[2]->b) != 0)
|
||||||
|
m[2]->b += (ofs * dx) >> 8;
|
||||||
|
|
||||||
|
if ((ofs = m[2]->r - m[0]->r) != 0)
|
||||||
|
m[0]->r += (ofs * dy) >> 8;
|
||||||
|
if ((ofs = m[2]->g - m[0]->g) != 0)
|
||||||
|
m[0]->g += (ofs * dy) >> 8;
|
||||||
|
if ((ofs = m[2]->b - m[0]->b) != 0)
|
||||||
|
m[0]->b += (ofs * dy) >> 8;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
void calcDistance()
|
||||||
|
{
|
||||||
|
double tan_a;
|
||||||
|
|
||||||
|
tan_a = (zoom * DIAMETRE / 2.0) / proj_dist;
|
||||||
|
/*
|
||||||
|
* distance of camera to center of earth ( = coordinate origin)
|
||||||
|
*/
|
||||||
|
center_dist = radius / sin(atan(tan_a));
|
||||||
|
c_coef = center_dist * center_dist - radius * radius;
|
||||||
|
solution = FALSE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
void renderFrame()
|
||||||
|
{
|
||||||
|
int py, px;
|
||||||
|
RColor teinte;
|
||||||
|
|
||||||
|
double dir_x, dir_y, dir_z; /* direction of cast ray */
|
||||||
|
|
||||||
|
double hit_x, hit_y, hit_z; /* hit position on earth surface */
|
||||||
|
|
||||||
|
double hit2_x, hit2_y, hit2_z; /* mirrored hit position on earth surface */
|
||||||
|
|
||||||
|
double sp_x, sp_y, sp_z; /* intersection point of globe and ray */
|
||||||
|
|
||||||
|
double a; /* coeff. of quardatic equation */
|
||||||
|
|
||||||
|
double radikand;
|
||||||
|
double wurzel;
|
||||||
|
double r; /* r' */
|
||||||
|
|
||||||
|
double s1, s2, s; /*distance between intersections and
|
||||||
|
camera position */
|
||||||
|
|
||||||
|
double longitude, latitude; /* coordinates of hit position */
|
||||||
|
|
||||||
|
double light_angle; /* cosine of angle between sunlight and
|
||||||
|
surface normal */
|
||||||
|
|
||||||
|
int startx, endx; /* the region to be painted */
|
||||||
|
|
||||||
|
int starty, endy;
|
||||||
|
|
||||||
|
double m11;
|
||||||
|
double m12;
|
||||||
|
double m13;
|
||||||
|
double m21;
|
||||||
|
double m22;
|
||||||
|
double m23;
|
||||||
|
double m31;
|
||||||
|
double m32;
|
||||||
|
double m33;
|
||||||
|
|
||||||
|
a = dir_x = dir_y = 0;
|
||||||
|
dir_z = -proj_dist;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "solution : %d\n", solution);
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* clear image
|
||||||
|
*/
|
||||||
|
if (solution == FALSE)
|
||||||
|
RClearImage(small, &noir);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rotation matrix
|
||||||
|
*/
|
||||||
|
|
||||||
|
m11 = cos(v_long);
|
||||||
|
m22 = cos(v_lat);
|
||||||
|
m23 = sin(v_lat);
|
||||||
|
m31 = -sin(v_long);
|
||||||
|
m12 = m23 * m31;
|
||||||
|
m13 = -m22 * m31;
|
||||||
|
m21 = 0.;
|
||||||
|
m32 = -m23 * m11;
|
||||||
|
m33 = m22 * m11;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* calc. radius of projected sphere
|
||||||
|
*/
|
||||||
|
if (solution == FALSE) {
|
||||||
|
b_coef = 2 * center_dist * dir_z;
|
||||||
|
radius_proj = (int) sqrt(b_coef * b_coef / (4 * c_coef) - dir_z * dir_z) + 1;
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------------------------------------*/
|
||||||
|
if (fun) {
|
||||||
|
starty = DIAMETRE / 2 - radius_proj - 3;
|
||||||
|
endy = DIAMETRE - starty - 1;
|
||||||
|
if ((double) starty < (double) (-funy))
|
||||||
|
starty = -funy;
|
||||||
|
if ((double) starty > (double) (DIAMETRE - 1 - funy))
|
||||||
|
starty = DIAMETRE - 1 - funy;
|
||||||
|
if ((double) endy < (double) (-funy))
|
||||||
|
endy = -funy;
|
||||||
|
if ((double) endy > (double) (DIAMETRE - 1 - funy))
|
||||||
|
endy = DIAMETRE - 1 - funy;
|
||||||
|
|
||||||
|
for (py = starty; py <= endy; py++) {
|
||||||
|
|
||||||
|
startx = DIAMETRE / 2 - 6 -
|
||||||
|
(int) sqrt(radius_proj * radius_proj -
|
||||||
|
(py - DIAMETRE / 2) *
|
||||||
|
(py - DIAMETRE / 2));
|
||||||
|
|
||||||
|
endx = DIAMETRE - startx - 1;
|
||||||
|
if ((double) startx < (double) (-funx))
|
||||||
|
startx = -funx;
|
||||||
|
|
||||||
|
if ((double) startx > (double) (DIAMETRE - 1 - funx))
|
||||||
|
startx = DIAMETRE - 1 - funx;
|
||||||
|
|
||||||
|
if ((double) endx < (double) (-funx))
|
||||||
|
endx = -funx;
|
||||||
|
if ((double) endx > (double) (DIAMETRE - 1 - funx))
|
||||||
|
endx = DIAMETRE - 1 - funx;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* calculate offset into image data
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (px = startx; px <= endx; px++) {
|
||||||
|
|
||||||
|
dir_x = (double) px - DIAMETRE / 2 + 0.5;
|
||||||
|
dir_y = -(double) py + DIAMETRE / 2 - 0.5;
|
||||||
|
|
||||||
|
a = dir_x * dir_x + dir_y * dir_y + dir_z * dir_z;
|
||||||
|
/*
|
||||||
|
* c constant, see above
|
||||||
|
*/
|
||||||
|
radikand = b_coef * b_coef - 4 * a * c_coef; /*what's under the sq.root when solving the
|
||||||
|
quadratic equation */
|
||||||
|
|
||||||
|
if (radikand >= 0.0) { /* solution exists <=> intersection */
|
||||||
|
|
||||||
|
wurzel = sqrt(radikand);
|
||||||
|
s1 = (-b_coef + wurzel) / (2. * a);
|
||||||
|
s2 = (-b_coef - wurzel) / (2. * a);
|
||||||
|
s = (s1 < s2) ? s1 : s2; /* smaller solution belongs to nearer
|
||||||
|
* intersection */
|
||||||
|
|
||||||
|
|
||||||
|
sp_x = s * dir_x; /* sp = camera pos + s*dir */
|
||||||
|
sp_y = s * dir_y;
|
||||||
|
sp_z = center_dist + s * dir_z;
|
||||||
|
|
||||||
|
hit_x = m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
||||||
|
hit_y = m22 * sp_y + m23 * sp_z;
|
||||||
|
hit_z = m31 * sp_x + m32 * sp_y + m33 * sp_z;
|
||||||
|
|
||||||
|
hit2_x = -m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
||||||
|
hit2_y = m22 * sp_y + m23 * sp_z;
|
||||||
|
hit2_z = -m31 * sp_x + m32 * sp_y + m33 * sp_z;
|
||||||
|
/*** hope hit_z wont get too close to zero *******/
|
||||||
|
if (ABS(hit_z) < 0.001) {
|
||||||
|
if (hit_x * hit_z > 0.)
|
||||||
|
longitude = PI / 2.;
|
||||||
|
else
|
||||||
|
longitude = -PI / 2.;
|
||||||
|
if (hit_z > 0.)
|
||||||
|
hit_z = 0.001;
|
||||||
|
else
|
||||||
|
hit_z = -0.001;
|
||||||
|
} else {
|
||||||
|
longitude = atan(hit_x / hit_z);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hit_z < 0.)
|
||||||
|
longitude += PI;
|
||||||
|
|
||||||
|
r = (double) sqrt(hit_x * hit_x + hit_z * hit_z);
|
||||||
|
|
||||||
|
latitude = atan(-hit_y / r);
|
||||||
|
|
||||||
|
light_angle =
|
||||||
|
(light_x * hit_x + light_y * hit_y + light_z * hit_z) / radius;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set pixel in image
|
||||||
|
*/
|
||||||
|
|
||||||
|
teinte = mygetMapColorLinear(longitude, latitude, light_angle);
|
||||||
|
RPutPixel(small, px + funx, py + funy, &teinte);
|
||||||
|
}
|
||||||
|
} /*px */
|
||||||
|
} /*py */
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------------------------------------*/
|
||||||
|
/*** not fun : ***/
|
||||||
|
else {
|
||||||
|
starty = DIAMETRE / 2 - radius_proj - 3;
|
||||||
|
starty = (starty < 0) ? 0 : starty;
|
||||||
|
endy = DIAMETRE - starty - 1;
|
||||||
|
/*
|
||||||
|
* py 0 to 63 max
|
||||||
|
*/
|
||||||
|
for (py = starty; py <= endy; py++) {
|
||||||
|
startx = DIAMETRE / 2 - 6 -
|
||||||
|
(int) sqrt(radius_proj * radius_proj -
|
||||||
|
(py - DIAMETRE / 2) *
|
||||||
|
(py - DIAMETRE / 2));
|
||||||
|
startx = (startx < 0) ? 0 : startx;
|
||||||
|
/*
|
||||||
|
* 0<= startx <=31
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (px = startx; px < DIAMETRE / 2; px++) {
|
||||||
|
if (solution == FALSE) {
|
||||||
|
dir_x = (double) px - DIAMETRE / 2 + 0.5;
|
||||||
|
|
||||||
|
dir_y = -(double) py + DIAMETRE / 2 - 0.5;
|
||||||
|
|
||||||
|
a = dir_x * dir_x + dir_y * dir_y + dir_z * dir_z;
|
||||||
|
|
||||||
|
|
||||||
|
soluce[px][py][0] = b_coef * b_coef - 4 * a * c_coef;
|
||||||
|
/*what's under the sq.root when solving the
|
||||||
|
quadratic equation */
|
||||||
|
|
||||||
|
}
|
||||||
|
if (soluce[px][py][0] >= 0.0) { /* solution exists <=> intersection */
|
||||||
|
|
||||||
|
if (solution == FALSE) {
|
||||||
|
wurzel = sqrt(soluce[px][py][0]);
|
||||||
|
s1 = (-b_coef + wurzel) / (2. * a);
|
||||||
|
s2 = (-b_coef - wurzel) / (2. * a);
|
||||||
|
s = (s1 < s2) ? s1 : s2; /* smaller solution belongs to nearer
|
||||||
|
* intersection */
|
||||||
|
|
||||||
|
soluce[px][py][1] = s * dir_x; /* sp = camera pos + s*dir */
|
||||||
|
soluce[px][py][2] = s * dir_y;
|
||||||
|
soluce[px][py][3] = center_dist + s * dir_z;
|
||||||
|
}
|
||||||
|
sp_x = soluce[px][py][1];
|
||||||
|
sp_y = soluce[px][py][2];
|
||||||
|
sp_z = soluce[px][py][3];
|
||||||
|
hit_x = m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
||||||
|
hit_y = m22 * sp_y + m23 * sp_z;
|
||||||
|
hit_z = m31 * sp_x + m32 * sp_y + m33 * sp_z;
|
||||||
|
|
||||||
|
hit2_x = -m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
||||||
|
hit2_y = m22 * sp_y + m23 * sp_z;
|
||||||
|
hit2_z = -m31 * sp_x + m32 * sp_y + m33 * sp_z;
|
||||||
|
|
||||||
|
/*** hope hit_z wont get too close to zero *******/
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (ABS(hit_z) < ABS(minhz)) {
|
||||||
|
minhz = hit_z;
|
||||||
|
fprintf(stdout, "should >>0 : hit_z %f\n", hit_z);
|
||||||
|
fprintf(stdout, " hit_x %f\n", hit_x);
|
||||||
|
fprintf(stdout, " ratio %f\n", hit_x / hit_z);
|
||||||
|
fprintf(stdout, " long %f\n", atan(hit_x / hit_z));
|
||||||
|
|
||||||
|
sleep(5);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (ABS(hit_z) < 0.001) {
|
||||||
|
if (hit_x * hit_z > 0.)
|
||||||
|
longitude = PI / 2.;
|
||||||
|
else
|
||||||
|
longitude = -PI / 2.;
|
||||||
|
if (hit_z > 0.)
|
||||||
|
hit_z = 0.001;
|
||||||
|
else
|
||||||
|
hit_z = -0.001;
|
||||||
|
} else {
|
||||||
|
longitude = atan(hit_x / hit_z);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hit_z < 0.)
|
||||||
|
longitude += PI;
|
||||||
|
|
||||||
|
r = (double) sqrt(hit_x * hit_x + hit_z * hit_z);
|
||||||
|
|
||||||
|
latitude = atan(-hit_y / r);
|
||||||
|
|
||||||
|
light_angle =
|
||||||
|
(light_x * hit_x + light_y * hit_y + light_z * hit_z) / radius;
|
||||||
|
if (sens == 1) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set pixel in image
|
||||||
|
*/
|
||||||
|
|
||||||
|
teinte = mygetMapColorLinear(longitude, latitude, light_angle);
|
||||||
|
myRPutPixel(px, py, &teinte);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mirror the left half-circle of the globe: we need a new position
|
||||||
|
* and have to recalc. the light intensity
|
||||||
|
*/
|
||||||
|
|
||||||
|
light_angle =
|
||||||
|
(light_x * hit2_x + light_y * hit2_y + light_z * hit2_z) / radius;
|
||||||
|
teinte = mygetMapColorLinear(2 * v_long - longitude, latitude, light_angle);
|
||||||
|
myRPutPixel(DIAMETRE - px - 1, py, &teinte);
|
||||||
|
} else {
|
||||||
|
/* sens==-1 */
|
||||||
|
/*
|
||||||
|
* Set pixel in image
|
||||||
|
*/
|
||||||
|
|
||||||
|
teinte = mygetMapColorLinear(longitude, latitude, light_angle);
|
||||||
|
myRPutPixel(DIAMETRE - px - 1, DIAMETRE - py - 1, &teinte);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mirror the left half-circle of the globe: we need a new position
|
||||||
|
* and have to recalc. the light intensity
|
||||||
|
*/
|
||||||
|
|
||||||
|
light_angle =
|
||||||
|
(light_x * hit2_x + light_y * hit2_y + light_z * hit2_z) / radius;
|
||||||
|
teinte = mygetMapColorLinear(2 * v_long - longitude, latitude, light_angle);
|
||||||
|
myRPutPixel(px, DIAMETRE - py - 1, &teinte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /*px */
|
||||||
|
} /*py */
|
||||||
|
} /*else fun */
|
||||||
|
solution = TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/*------------------------------------------------------------------------ */
|
||||||
|
static RColor
|
||||||
|
mygetMapColorLinear(double longitude, double latitude, double angle)
|
||||||
|
{
|
||||||
|
RColor point;
|
||||||
|
int x, y, xl, yl, dx, dy, ang;
|
||||||
|
|
||||||
|
if (longitude < 0.)
|
||||||
|
longitude += 2 * PI;
|
||||||
|
|
||||||
|
latitude += PI / 2;
|
||||||
|
|
||||||
|
longitude += PI;
|
||||||
|
if (longitude >= 2 * PI)
|
||||||
|
longitude -= 2 * PI;
|
||||||
|
|
||||||
|
if (angle > 0)
|
||||||
|
ang = (int) floor((1 - ((1 - angle) * dawn)) * 256);
|
||||||
|
else
|
||||||
|
ang = angle * 256;
|
||||||
|
|
||||||
|
xl = (int) (longitude * mratiox);
|
||||||
|
yl = (int) (latitude * mratioy);
|
||||||
|
|
||||||
|
x = xl >> 8;
|
||||||
|
y = yl >> 8;
|
||||||
|
dx = xl - (x << 8);
|
||||||
|
dy = yl - (y << 8);
|
||||||
|
|
||||||
|
if (use_nightmap) {
|
||||||
|
if (ang > 0) {
|
||||||
|
getquarter(map, x, y, md, dx, dy);
|
||||||
|
getquarter(mapnight, x, y, mn, dx, dy);
|
||||||
|
|
||||||
|
md[0]->r = ((mn[0]->r * (256 - ang) + md[0]->r * ang)) >> 8;
|
||||||
|
md[0]->g = ((mn[0]->g * (256 - ang) + md[0]->g * ang)) >> 8;
|
||||||
|
md[0]->b = ((mn[0]->b * (256 - ang) + md[0]->b * ang)) >> 8;
|
||||||
|
} else {
|
||||||
|
getquarter(mapnight, x, y, md, dx, dy);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
getquarter(map, x, y, md, dx, dy);
|
||||||
|
if (ang > 0) {
|
||||||
|
md[0]->r = ((md[0]->r * aml + md[0]->r * ang / 256 * (256 - aml))) >> 8;
|
||||||
|
md[0]->g = ((md[0]->g * aml + md[0]->g * ang / 256 * (256 - aml))) >> 8;
|
||||||
|
md[0]->b = ((md[0]->b * aml + md[0]->b * ang / 256 * (256 - aml))) >> 8;
|
||||||
|
} else {
|
||||||
|
md[0]->r = (md[0]->r * aml) >> 8;
|
||||||
|
md[0]->g = (md[0]->g * aml) >> 8;
|
||||||
|
md[0]->b = (md[0]->b * aml) >> 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
point.red = (unsigned char) md[0]->r;
|
||||||
|
point.green = (unsigned char) md[0]->g;
|
||||||
|
point.blue = (unsigned char) md[0]->b;
|
||||||
|
point.alpha = 255;
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
static void randomPosition()
|
||||||
|
{
|
||||||
|
addlat = ((rand() % 30001) / 30000.) * 180. - 90.;
|
||||||
|
addlong = ((rand() % 30001) / 30000.) * 360. - 180.;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
static void updateTime(int force)
|
||||||
|
{
|
||||||
|
/* calcul of sun position every minute */
|
||||||
|
if ((trend.tv_sec - tsunpos) >= 60 || force) {
|
||||||
|
tsunpos = trend.tv_sec;
|
||||||
|
GetSunPos(tsunpos, &sun_lat, &sun_long);
|
||||||
|
light_x = cos(sun_lat) * sin(sun_long);
|
||||||
|
light_y = sin(sun_lat);
|
||||||
|
light_z = cos(sun_lat) * cos(sun_long);
|
||||||
|
do_something = TRUE;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
void setViewPos(double lat, double lon)
|
||||||
|
{
|
||||||
|
double dif;
|
||||||
|
while (lat >= 360.)
|
||||||
|
lat -= 360.;
|
||||||
|
while (lat <= -360.)
|
||||||
|
lat += 360.;
|
||||||
|
while (addlat >= 360.)
|
||||||
|
addlat -= 360.;
|
||||||
|
while (addlat <= -360.)
|
||||||
|
addlat += 360.;
|
||||||
|
|
||||||
|
if (lat >= 90.) {
|
||||||
|
dif = lat;
|
||||||
|
lat = 180. - lat;
|
||||||
|
addlat += (lat - dif);
|
||||||
|
dlat *= -1;
|
||||||
|
if (!fun) {
|
||||||
|
lon += 180.;
|
||||||
|
addlong += 180.;
|
||||||
|
}
|
||||||
|
sens *= -1;
|
||||||
|
}
|
||||||
|
if (lat <= -90.) {
|
||||||
|
dif = lat;
|
||||||
|
lat = -180. - lat;
|
||||||
|
addlat += (lat - dif);
|
||||||
|
dlat *= -1;
|
||||||
|
if (!fun) {
|
||||||
|
lon += 180.;
|
||||||
|
addlong += 180.;
|
||||||
|
}
|
||||||
|
sens *= -1;
|
||||||
|
}
|
||||||
|
if (lat >= 90.) {
|
||||||
|
dif = lat;
|
||||||
|
lat = 180. - lat;
|
||||||
|
addlat += (lat - dif);
|
||||||
|
dlat *= -1;
|
||||||
|
if (!fun) {
|
||||||
|
lon += 180.;
|
||||||
|
addlong += 180.;
|
||||||
|
}
|
||||||
|
sens *= -1;
|
||||||
|
}
|
||||||
|
if (lat <= -90.) {
|
||||||
|
dif = lat;
|
||||||
|
lat = -180. - lat;
|
||||||
|
addlat += (lat - dif);
|
||||||
|
dlat *= -1;
|
||||||
|
if (!fun) {
|
||||||
|
lon += 180.;
|
||||||
|
addlong += 180.;
|
||||||
|
}
|
||||||
|
sens *= -1;
|
||||||
|
}
|
||||||
|
while (lon >= 180.) {
|
||||||
|
lon -= 360.;
|
||||||
|
addlong -= 360.;
|
||||||
|
}
|
||||||
|
while (lon <= -180.) {
|
||||||
|
lon += 360.;
|
||||||
|
addlong += 360.;
|
||||||
|
}
|
||||||
|
|
||||||
|
v_lat = lat * PI / 180.;
|
||||||
|
v_long = lon * PI / 180.;
|
||||||
|
dv_lat = lat;
|
||||||
|
dv_long = lon;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
void recalc(int calme)
|
||||||
|
{
|
||||||
|
double coeff, va, vo;
|
||||||
|
struct timeval tv, tnow;
|
||||||
|
|
||||||
|
tnow = getimev();
|
||||||
|
trend = timeaccel(tnow);
|
||||||
|
tv = diftimev(tnow, tlast);
|
||||||
|
|
||||||
|
if (firstTime) {
|
||||||
|
firstTime = FALSE;
|
||||||
|
updateTime(TRUE);
|
||||||
|
} else {
|
||||||
|
coeff = (double) tv.tv_sec + tv.tv_usec / 1000000.;
|
||||||
|
|
||||||
|
if (!calme) {
|
||||||
|
/** while !clic button rotate earth **/
|
||||||
|
addlat += dlat * coeff;
|
||||||
|
addlong += dlong * coeff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addlong != old_dvlong || addlat != old_dvlat || p_type == PTRANDOM) {
|
||||||
|
old_dvlong = addlong;
|
||||||
|
old_dvlat = addlat;
|
||||||
|
do_something = TRUE;
|
||||||
|
}
|
||||||
|
if (calme && p_type == PTSUNREL) {
|
||||||
|
va = sun_lat * 180. / PI;
|
||||||
|
vo = sun_long * 180. / PI;
|
||||||
|
updateTime(TRUE);
|
||||||
|
addlat -= sun_lat * 180. / PI - va;
|
||||||
|
addlong -= sun_long * 180. / PI - vo;
|
||||||
|
} else {
|
||||||
|
updateTime(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (do_something) {
|
||||||
|
switch (p_type) {
|
||||||
|
case PTSUNREL:
|
||||||
|
setViewPos(sun_lat * 180. / PI + addlat,
|
||||||
|
sun_long * 180. / PI + addlong);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PTFIXED:
|
||||||
|
setViewPos(addlat, addlong);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PTRANDOM:
|
||||||
|
if (stoprand == FALSE)
|
||||||
|
randomPosition();
|
||||||
|
else
|
||||||
|
stoprand--;
|
||||||
|
setViewPos(addlat, addlong);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "%s render\n", ctime(&trend.tv_sec));
|
||||||
|
#endif
|
||||||
|
renderFrame();
|
||||||
|
}
|
||||||
|
tlast = tnow;
|
||||||
|
tnext = addtimev(tnow, tdelay);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ------------------------------------------------------------------------ */
|
73
wmglobe/src/scrdiv.xpm
Normal file
73
wmglobe/src/scrdiv.xpm
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * scrdiv_xpm[] = {
|
||||||
|
"64 64 6 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
"+ c #CCCC6E",
|
||||||
|
"@ c #FFFFFF",
|
||||||
|
"# c #CCCCCC",
|
||||||
|
"$ c #F7F3FF",
|
||||||
|
" ",
|
||||||
|
"............................................................ ",
|
||||||
|
"....................................++...................... ",
|
||||||
|
"...................................+..+..................... ",
|
||||||
|
"...................................+..+..................... ",
|
||||||
|
"....................................++...................... ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
"............................................................ ",
|
||||||
|
" ",
|
||||||
|
"@@@@@@@@@@@@@@@@@@@#@@@@@@@$@@@$@@@@@@@#@@@@@@@@@@@@@@@@@@@# ",
|
||||||
|
"@#######.####.#####.@#####.####.#######.@##################. ",
|
||||||
|
"@######..###..#####.@#####..###..######.@##################. ",
|
||||||
|
"@#####...##...#####.@#####...##...#####.@#####.......######. ",
|
||||||
|
"@####....#....#####.@#####....#....####.@#####.......######. ",
|
||||||
|
"@#####...##...#####.@#####...##...#####.@#####.......######. ",
|
||||||
|
"@######..###..#####.@#####..###..######.@##################. ",
|
||||||
|
"@#######.####.#####.@#####.####.#######.@##################. ",
|
||||||
|
"#...................#...................#................... ",
|
||||||
|
" ",
|
||||||
|
"...................#...................#...................# ",
|
||||||
|
".#######.####.#####@.#####.####.#######@.##################@ ",
|
||||||
|
".######..###..#####@.#####..###..######@.##################@ ",
|
||||||
|
".#####...##...#####@.#####...##...#####@.#####.......######@ ",
|
||||||
|
".####....#....#####@.#####....#....####@.#####.......######@ ",
|
||||||
|
".#####...##...#####@.#####...##...#####@.#####.......######@ ",
|
||||||
|
".######..###..#####@.#####..###..######@.##################@ ",
|
||||||
|
".#######.####.#####@.#####.####.#######@.##################@ ",
|
||||||
|
"#@@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@@@@@@ ",
|
||||||
|
" ",
|
||||||
|
".............................................................# ",
|
||||||
|
".@@@@@@@@@@@@@@@@@@@#@@@@@@@$@@@$@@@@@@@#@@@@@@@@@@@@@@@@@@@## ",
|
||||||
|
".@#######.####.#####.@#####.####.#######.@##################.# ",
|
||||||
|
".@######..###..#####.@#####..###..######.@##################.# ",
|
||||||
|
".@#####...##...#####.@#####...##...#####.@#####.......######.# ",
|
||||||
|
".@####....#....#####.@#####....#....####.@#####.......######.# ",
|
||||||
|
".@#####...##...#####.@#####...##...#####.@#####.......######.# ",
|
||||||
|
".@######..###..#####.@#####..###..######.@##################.# ",
|
||||||
|
".@#######.####.#####.@#####.####.#######.@##################.# ",
|
||||||
|
".#...................#...................#...................# ",
|
||||||
|
"############################################################## ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
73
wmglobe/src/scrpos.xpm
Normal file
73
wmglobe/src/scrpos.xpm
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * scrpos_xpm[] = {
|
||||||
|
"64 64 6 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
"+ c #CCCC6E",
|
||||||
|
"@ c #FFFFFF",
|
||||||
|
"# c #CCCCCC",
|
||||||
|
"$ c #F7F3FF",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" .. ... ...... ",
|
||||||
|
" .. ... ...... ",
|
||||||
|
" .. .. .. .. ",
|
||||||
|
" .. .. .. .. ",
|
||||||
|
" .. .. .. .. ",
|
||||||
|
" .. ....... .. ",
|
||||||
|
" ..... .. .. .. ",
|
||||||
|
" ..... .. .. .. ",
|
||||||
|
" ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ....................................++...................... ",
|
||||||
|
" ...................................+..+..................... ",
|
||||||
|
" ...................................+..+..................... ",
|
||||||
|
" ....................................++...................... ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" .. ... .. .. .... ",
|
||||||
|
" .. .. .. ... .. .. .. ",
|
||||||
|
" .. .. .. ... .. .. . ",
|
||||||
|
" .. .. .. .. . .. .. ",
|
||||||
|
" .. .. .. .. . .. .. ... ",
|
||||||
|
" .. .. .. .. ... .. .. ",
|
||||||
|
" ..... .. .. .. ... .. .. ",
|
||||||
|
" ..... ... .. .. ... . ",
|
||||||
|
" ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ....................................++...................... ",
|
||||||
|
" ...................................+..+..................... ",
|
||||||
|
" ...................................+..+..................... ",
|
||||||
|
" ....................................++...................... ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" @@@@@@@@@@@@@@@@@@@#@@@@@@@$@@@$@@@@@@@#@@@@@@@@@@@@@@@@@@@# ",
|
||||||
|
" @#######.####.#####.@#####.####.#######.@##################. ",
|
||||||
|
" @######..###..#####.@#####..###..######.@##################. ",
|
||||||
|
" @#####...##...#####.@#####...##...#####.@#####.......######. ",
|
||||||
|
" @####....#....#####.@#####....#....####.@#####.......######. ",
|
||||||
|
" @#####...##...#####.@#####...##...#####.@#####.......######. ",
|
||||||
|
" @######..###..#####.@#####..###..######.@##################. ",
|
||||||
|
" @#######.####.#####.@#####.####.#######.@##################. ",
|
||||||
|
" #...................#...................#................... ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
72
wmglobe/src/scrtime.xpm
Normal file
72
wmglobe/src/scrtime.xpm
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * scrtime_xpm[] = {
|
||||||
|
"64 64 5 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
"+ c #FFFFFF",
|
||||||
|
"@ c #CCCCCC",
|
||||||
|
"# c #F7F3FF",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ............................................................ ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" +++++++++++++++++++@+++++++#+++#+++++++@+++++++++++++++++++@ ",
|
||||||
|
" +@@@@@@@.@@@@.@@@@@.+@@@@@.@@@@.@@@@@@@.+@@@@@@@@@@@@@@@@@@. ",
|
||||||
|
" +@@@@@@..@@@..@@@@@.+@@@@@..@@@..@@@@@@.+@@@@@@@@@@@@@@@@@@. ",
|
||||||
|
" +@@@@@...@@...@@@@@.+@@@@@...@@...@@@@@.+@@@@@.......@@@@@@. ",
|
||||||
|
" +@@@@....@....@@@@@.+@@@@@....@....@@@@.+@@@@@.......@@@@@@. ",
|
||||||
|
" +@@@@@...@@...@@@@@.+@@@@@...@@...@@@@@.+@@@@@.......@@@@@@. ",
|
||||||
|
" +@@@@@@..@@@..@@@@@.+@@@@@..@@@..@@@@@@.+@@@@@@@@@@@@@@@@@@. ",
|
||||||
|
" +@@@@@@@.@@@@.@@@@@.+@@@@@.@@@@.@@@@@@@.+@@@@@@@@@@@@@@@@@@. ",
|
||||||
|
" @...................@...................@................... ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
278
wmglobe/src/sunpos.c
Normal file
278
wmglobe/src/sunpos.c
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
||||||
|
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
* sunpos.c is taken from Xearth :
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* sunpos.c
|
||||||
|
* kirk johnson
|
||||||
|
* july 1993
|
||||||
|
*
|
||||||
|
* code for calculating the position on the earth's surface for which
|
||||||
|
* the sun is directly overhead (adapted from _practical astronomy
|
||||||
|
* with your calculator, third edition_, peter duffett-smith,
|
||||||
|
* cambridge university press, 1988.)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright (C) 1989, 1990, 1993, 1994, 1995 Kirk Lauritz Johnson
|
||||||
|
*
|
||||||
|
* Parts of the source code (as marked) are:
|
||||||
|
* Copyright (C) 1989, 1990, 1991 by Jim Frost
|
||||||
|
* Copyright (C) 1992 by Jamie Zawinski <jwz@lucid.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify and freely distribute xearth for
|
||||||
|
* non-commercial and not-for-profit purposes is hereby granted
|
||||||
|
* without fee, provided that both the above copyright notice and this
|
||||||
|
* permission notice appear in all copies and in supporting
|
||||||
|
* documentation.
|
||||||
|
*
|
||||||
|
* Unisys Corporation holds worldwide patent rights on the Lempel Zev
|
||||||
|
* Welch (LZW) compression technique employed in the CompuServe GIF
|
||||||
|
* image file format as well as in other formats. Unisys has made it
|
||||||
|
* clear, however, that it does not require licensing or fees to be
|
||||||
|
* paid for freely distributed, non-commercial applications (such as
|
||||||
|
* xearth) that employ LZW/GIF technology. Those wishing further
|
||||||
|
* information about licensing the LZW patent should contact Unisys
|
||||||
|
* directly at (lzw_info@unisys.com) or by writing to
|
||||||
|
*
|
||||||
|
* Unisys Corporation
|
||||||
|
* Welch Licensing Department
|
||||||
|
* M/S-C1SW19
|
||||||
|
* P.O. Box 500
|
||||||
|
* Blue Bell, PA 19424
|
||||||
|
*
|
||||||
|
* The author makes no representations about the suitability of this
|
||||||
|
* software for any purpose. It is provided "as is" without express or
|
||||||
|
* implied warranty.
|
||||||
|
*
|
||||||
|
* THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT
|
||||||
|
* OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||||
|
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI 3.141592653
|
||||||
|
#endif
|
||||||
|
#define TWOPI (2*PI)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the epoch upon which these astronomical calculations are based is
|
||||||
|
* 1990 january 0.0, 631065600 seconds since the beginning of the
|
||||||
|
* "unix epoch" (00:00:00 GMT, Jan. 1, 1970)
|
||||||
|
*
|
||||||
|
* given a number of seconds since the start of the unix epoch,
|
||||||
|
* DaysSinceEpoch() computes the number of days since the start of the
|
||||||
|
* astronomical epoch (1990 january 0.0)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EpochStart (631065600)
|
||||||
|
#define DaysSinceEpoch(secs) (((secs)-EpochStart)*(1.0/(24*3600)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assuming the apparent orbit of the sun about the earth is circular,
|
||||||
|
* the rate at which the orbit progresses is given by RadsPerDay --
|
||||||
|
* TWOPI radians per orbit divided by 365.242191 days per year:
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define RadsPerDay (TWOPI/365.242191)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* details of sun's apparent orbit at epoch 1990.0 (after
|
||||||
|
* duffett-smith, table 6, section 46)
|
||||||
|
*
|
||||||
|
* Epsilon_g (ecliptic longitude at epoch 1990.0) 279.403303 degrees
|
||||||
|
* OmegaBar_g (ecliptic longitude of perigee) 282.768422 degrees
|
||||||
|
* Eccentricity (eccentricity of orbit) 0.016713
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define Epsilon_g (279.403303*(TWOPI/360))
|
||||||
|
#define OmegaBar_g (282.768422*(TWOPI/360))
|
||||||
|
#define Eccentricity (0.016713)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MeanObliquity gives the mean obliquity of the earth's axis at epoch
|
||||||
|
* 1990.0 (computed as 23.440592 degrees according to the method given
|
||||||
|
* in duffett-smith, section 27)
|
||||||
|
*/
|
||||||
|
#define MeanObliquity (23.440592*(TWOPI/360))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* solve Kepler's equation via Newton's method
|
||||||
|
* (after duffett-smith, section 47)
|
||||||
|
*/
|
||||||
|
static double solve_keplers_equation(double M)
|
||||||
|
{
|
||||||
|
double E;
|
||||||
|
double delta;
|
||||||
|
|
||||||
|
E = M;
|
||||||
|
while (1) {
|
||||||
|
delta = E - Eccentricity * sin(E) - M;
|
||||||
|
if (fabs(delta) <= 1e-10)
|
||||||
|
break;
|
||||||
|
E -= delta / (1 - Eccentricity * cos(E));
|
||||||
|
}
|
||||||
|
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* compute ecliptic longitude of sun (in radians)
|
||||||
|
* (after duffett-smith, section 47)
|
||||||
|
*/
|
||||||
|
static double sun_ecliptic_longitude(time_t ssue)
|
||||||
|
/* seconds since unix epoch */
|
||||||
|
{
|
||||||
|
double D, N;
|
||||||
|
double M_sun, E;
|
||||||
|
double v;
|
||||||
|
|
||||||
|
D = DaysSinceEpoch(ssue);
|
||||||
|
|
||||||
|
N = RadsPerDay * D;
|
||||||
|
N = fmod(N, TWOPI);
|
||||||
|
if (N < 0)
|
||||||
|
N += TWOPI;
|
||||||
|
|
||||||
|
M_sun = N + Epsilon_g - OmegaBar_g;
|
||||||
|
if (M_sun < 0)
|
||||||
|
M_sun += TWOPI;
|
||||||
|
|
||||||
|
E = solve_keplers_equation(M_sun);
|
||||||
|
v = 2 * atan(sqrt((1 + Eccentricity) / (1 - Eccentricity)) * tan(E / 2));
|
||||||
|
|
||||||
|
return (v + OmegaBar_g);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* convert from ecliptic to equatorial coordinates
|
||||||
|
* (after duffett-smith, section 27)
|
||||||
|
*/
|
||||||
|
static void ecliptic_to_equatorial(double lambda, double beta, double *alpha, double *delta)
|
||||||
|
/*
|
||||||
|
* double lambda; ecliptic longitude
|
||||||
|
* double beta; ecliptic latitude
|
||||||
|
* double *alpha; (return) right ascension
|
||||||
|
* double *delta; (return) declination
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
double sin_e, cos_e;
|
||||||
|
|
||||||
|
sin_e = sin(MeanObliquity);
|
||||||
|
cos_e = cos(MeanObliquity);
|
||||||
|
|
||||||
|
*alpha = atan2(sin(lambda) * cos_e - tan(beta) * sin_e, cos(lambda));
|
||||||
|
*delta = asin(sin(beta) * cos_e + cos(beta) * sin_e * sin(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* computing julian dates (assuming gregorian calendar, thus this is
|
||||||
|
* only valid for dates of 1582 oct 15 or later)
|
||||||
|
* (after duffett-smith, section 4)
|
||||||
|
*/
|
||||||
|
static double julian_date(int y, int m, int d)
|
||||||
|
/*
|
||||||
|
* int y; year (e.g. 19xx)
|
||||||
|
* int m; month (jan=1, feb=2, ...)
|
||||||
|
* int d; day of month
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
int A, B, C, D;
|
||||||
|
double JD;
|
||||||
|
|
||||||
|
/* lazy test to ensure gregorian calendar */
|
||||||
|
/*
|
||||||
|
* ASSERT(y >= 1583);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((m == 1) || (m == 2)) {
|
||||||
|
y -= 1;
|
||||||
|
m += 12;
|
||||||
|
}
|
||||||
|
A = y / 100;
|
||||||
|
B = 2 - A + (A / 4);
|
||||||
|
C = (int) (365.25 * y);
|
||||||
|
D = (int) (30.6001 * (m + 1));
|
||||||
|
|
||||||
|
JD = B + C + D + d + 1720994.5;
|
||||||
|
|
||||||
|
return JD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* compute greenwich mean sidereal time (GST) corresponding to a given
|
||||||
|
* number of seconds since the unix epoch
|
||||||
|
* (after duffett-smith, section 12)
|
||||||
|
*/
|
||||||
|
static double GST(time_t ssue)
|
||||||
|
/*time_t ssue; seconds since unix epoch */
|
||||||
|
{
|
||||||
|
double JD;
|
||||||
|
double T, T0;
|
||||||
|
double UT;
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
tm = gmtime(&ssue);
|
||||||
|
|
||||||
|
JD = julian_date(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
|
||||||
|
T = (JD - 2451545) / 36525;
|
||||||
|
|
||||||
|
T0 = ((T + 2.5862e-5) * T + 2400.051336) * T + 6.697374558;
|
||||||
|
|
||||||
|
T0 = fmod(T0, 24.0);
|
||||||
|
if (T0 < 0)
|
||||||
|
T0 += 24;
|
||||||
|
|
||||||
|
UT = tm->tm_hour + (tm->tm_min + tm->tm_sec / 60.0) / 60.0;
|
||||||
|
|
||||||
|
T0 += UT * 1.002737909;
|
||||||
|
T0 = fmod(T0, 24.0);
|
||||||
|
if (T0 < 0)
|
||||||
|
T0 += 24;
|
||||||
|
|
||||||
|
return T0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* given a particular time (expressed in seconds since the unix
|
||||||
|
* epoch), compute position on the earth (lat, lon) such that sun is
|
||||||
|
* directly overhead.
|
||||||
|
*/
|
||||||
|
void GetSunPos(time_t ssue, double *lat, double *lon)
|
||||||
|
/* time_t ssue; seconds since unix epoch */
|
||||||
|
/* double *lat; (return) latitude */
|
||||||
|
/* double *lon; (return) longitude */
|
||||||
|
{
|
||||||
|
double lambda;
|
||||||
|
double alpha, delta;
|
||||||
|
double tmp;
|
||||||
|
|
||||||
|
lambda = sun_ecliptic_longitude(ssue);
|
||||||
|
ecliptic_to_equatorial(lambda, 0.0, &alpha, &delta);
|
||||||
|
|
||||||
|
tmp = alpha - (TWOPI / 24) * GST(ssue);
|
||||||
|
if (tmp < -PI) {
|
||||||
|
do
|
||||||
|
tmp += TWOPI;
|
||||||
|
while (tmp < -PI);
|
||||||
|
} else if (tmp > PI) {
|
||||||
|
do
|
||||||
|
tmp -= TWOPI;
|
||||||
|
while (tmp < -PI);
|
||||||
|
}
|
||||||
|
*lon = tmp;
|
||||||
|
*lat = delta;
|
||||||
|
}
|
387
wmglobe/src/wmglobe.c
Normal file
387
wmglobe/src/wmglobe.c
Normal file
|
@ -0,0 +1,387 @@
|
||||||
|
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
||||||
|
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
***************************************************************************/
|
||||||
|
/*
|
||||||
|
* I used many functions of wmgeneral.c ("openXwindow")
|
||||||
|
* for the main function of wmglobe.c
|
||||||
|
* wmgeneral.c was taken from wmaker applet wmtune-1.0 :
|
||||||
|
* Author: Martijn Pieterse (pieterse@xs4all.nl)
|
||||||
|
*
|
||||||
|
* wmglobe.c uses functions of : Xglobe, Xearth, wmgeneral, wmaker/wrlib
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "wmglobe.h"
|
||||||
|
|
||||||
|
#include "cadre0.xbm"
|
||||||
|
#include "cadre1.xbm"
|
||||||
|
#include "cadre2.xbm"
|
||||||
|
|
||||||
|
#ifdef DEFMAPOK
|
||||||
|
#include "defmap.xpm"
|
||||||
|
#include "defnimap.xpm"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
unsigned int borderwidth = 1;
|
||||||
|
XClassHint classHint;
|
||||||
|
char *wname = argv[0];
|
||||||
|
XTextProperty name;
|
||||||
|
|
||||||
|
XGCValues gcv;
|
||||||
|
unsigned long gcm;
|
||||||
|
XWindowAttributes attributes;
|
||||||
|
XColor color;
|
||||||
|
|
||||||
|
RContext *ctx;
|
||||||
|
|
||||||
|
XSizeHints mysizehints;
|
||||||
|
XWMHints mywmhints;
|
||||||
|
Pixel back_pix, fore_pix;
|
||||||
|
char Geometry[256];
|
||||||
|
|
||||||
|
char *rond_bits;
|
||||||
|
|
||||||
|
int dummy = 0;
|
||||||
|
int ok, redoaction, wait_release, move_lat_flag;
|
||||||
|
int xx, yy;
|
||||||
|
|
||||||
|
/** initialisation *********************/
|
||||||
|
|
||||||
|
xx = 0;
|
||||||
|
yy = 0;
|
||||||
|
ok = FALSE;
|
||||||
|
move_lat_flag = FALSE;
|
||||||
|
redoaction = 0;
|
||||||
|
wait_release = 0;
|
||||||
|
|
||||||
|
setlocale(LC_TIME, "");
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "%s\n", setlocale(LC_TIME, ""));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
set_defaults();
|
||||||
|
|
||||||
|
cmdline(argc, argv);
|
||||||
|
|
||||||
|
switch (typecadre) {
|
||||||
|
case 1:
|
||||||
|
rond_bits = cadre1_bits;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rond_bits = cadre2_bits;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rond_bits = cadre0_bits;
|
||||||
|
}
|
||||||
|
if (p_type == PTRANDOM) {
|
||||||
|
dlat = 0;
|
||||||
|
dlong = 0;
|
||||||
|
}
|
||||||
|
initmyconvert();
|
||||||
|
|
||||||
|
tdelay.tv_sec = (int) floor(delay);
|
||||||
|
tdelay.tv_usec = (int) ((delay - tdelay.tv_sec) * 1000000);
|
||||||
|
aml = (int) floor(ambient_light * 256);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
if (!(dpy = XOpenDisplay(dpy_name))) {
|
||||||
|
fprintf(stderr, "%s: can't open display \"%s\"\n",
|
||||||
|
wname, XDisplayName(dpy_name));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
ctx = myRCreateContext(dpy, DefaultScreen(dpy), NULL);
|
||||||
|
|
||||||
|
if (ctx->attribs->use_shared_memory) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "enleve les flags use_shared_memory\n");
|
||||||
|
#endif
|
||||||
|
ctx->attribs->flags ^= RC_UseSharedMemory;
|
||||||
|
ctx->attribs->use_shared_memory = FALSE;
|
||||||
|
ctx->flags.use_shared_pixmap = 0;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "depth %d\n", ctx->depth);
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* loading maps .............
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (dayfile != NULL) {
|
||||||
|
map = RLoadImage(ctx, dayfile, 0);
|
||||||
|
if (!map) {
|
||||||
|
fprintf(stdout, "pb map ! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#ifdef DEFMAPOK
|
||||||
|
map = RGetImageFromXPMData(ctx, defmap_xpm);
|
||||||
|
if (!map) {
|
||||||
|
fprintf(stdout, "pb def map ! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
nightfile = NULL;
|
||||||
|
use_nightmap = TRUE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
fprintf(stdout, "need a map !\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (use_nightmap) {
|
||||||
|
if (nightfile != NULL) {
|
||||||
|
mapnight = RLoadImage(ctx, nightfile, 0);
|
||||||
|
if (!mapnight) {
|
||||||
|
fprintf(stdout, "pb map night! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#ifdef DEFMAPOK
|
||||||
|
mapnight = RGetImageFromXPMData(ctx, defnimap_xpm);
|
||||||
|
if (!mapnight) {
|
||||||
|
fprintf(stdout, "pb def map night ! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* not very useful... */
|
||||||
|
use_nightmap = FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
use_nmap_ini = use_nightmap;
|
||||||
|
if (!oknimap)
|
||||||
|
use_nightmap = FALSE;
|
||||||
|
/* some other init ..................................... */
|
||||||
|
ratiox = (double) map->width / (2 * PI);
|
||||||
|
ratioy = (double) map->height / PI;
|
||||||
|
mratiox = (int) floor(ratiox * 256);
|
||||||
|
mratioy = (int) floor(ratioy * 256);
|
||||||
|
loadxpm(ctx->drawable);
|
||||||
|
|
||||||
|
small = RCreateImage(DIAMETRE, DIAMETRE, 1);
|
||||||
|
|
||||||
|
calcDistance();
|
||||||
|
/*...................................................... */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* first rendering of the earth
|
||||||
|
*/
|
||||||
|
recalc(0);
|
||||||
|
do_something = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* well, here the problems begin : this code is a merge from wmgeneral and
|
||||||
|
* some stuff of wmaker, should be rewritten ...
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
/* wmg */
|
||||||
|
|
||||||
|
XGetWindowAttributes(dpy, ctx->drawable, &attributes);
|
||||||
|
|
||||||
|
if (!RConvertImage(ctx, small, &pix)) {
|
||||||
|
fprintf(stdout, "error small->&pix\n");
|
||||||
|
puts(RMessageForError(RErrorCode));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
wmg.pixmap = pix;
|
||||||
|
wmg.mask = pix;
|
||||||
|
|
||||||
|
mysizehints.flags = USSize | USPosition;
|
||||||
|
mysizehints.x = 0;
|
||||||
|
mysizehints.y = 0;
|
||||||
|
|
||||||
|
color.pixel = 0;
|
||||||
|
if (!XParseColor(dpy, attributes.colormap, "white", &color)) {
|
||||||
|
fprintf(stdout, "wmglobe: can't parse white\n");
|
||||||
|
} else if (!XAllocColor(dpy, attributes.colormap, &color)) {
|
||||||
|
fprintf(stdout, "wmglobe: can't allocate white\n");
|
||||||
|
}
|
||||||
|
back_pix = color.pixel;
|
||||||
|
|
||||||
|
XGetWindowAttributes(dpy, ctx->drawable, &attributes);
|
||||||
|
|
||||||
|
color.pixel = 0;
|
||||||
|
if (!XParseColor(dpy, attributes.colormap, "black", &color)) {
|
||||||
|
fprintf(stdout, "wmglobe: can't parse black\n");
|
||||||
|
} else if (!XAllocColor(dpy, attributes.colormap, &color)) {
|
||||||
|
fprintf(stdout, "wmglobe: can't allocate black\n");
|
||||||
|
}
|
||||||
|
fore_pix = color.pixel;
|
||||||
|
|
||||||
|
|
||||||
|
XWMGeometry(dpy, ctx->screen_number, Geometry, NULL, borderwidth, &mysizehints,
|
||||||
|
&mysizehints.x, &mysizehints.y, &mysizehints.width, &mysizehints.height, &dummy);
|
||||||
|
mysizehints.width = DIAMETRE;
|
||||||
|
mysizehints.height = DIAMETRE;
|
||||||
|
|
||||||
|
win = XCreateSimpleWindow(dpy, ctx->drawable, mysizehints.x, mysizehints.y,
|
||||||
|
mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix);
|
||||||
|
|
||||||
|
iconwin = XCreateSimpleWindow(dpy, win, mysizehints.x, mysizehints.y,
|
||||||
|
mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix);
|
||||||
|
|
||||||
|
/* Activate hints */
|
||||||
|
XSetWMNormalHints(dpy, win, &mysizehints);
|
||||||
|
classHint.res_name = wname;
|
||||||
|
classHint.res_class = wname;
|
||||||
|
XSetClassHint(dpy, win, &classHint);
|
||||||
|
|
||||||
|
XSelectInput(dpy, win, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask);
|
||||||
|
XSelectInput(dpy, iconwin, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask);
|
||||||
|
|
||||||
|
if (XStringListToTextProperty(&wname, 1, &name) == 0) {
|
||||||
|
fprintf(stdout, "%s: can't allocate window name\n", wname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
XSetWMName(dpy, win, &name);
|
||||||
|
|
||||||
|
/* Create GC for drawing */
|
||||||
|
|
||||||
|
gcm = GCForeground | GCBackground | GCGraphicsExposures;
|
||||||
|
gcv.foreground = fore_pix;
|
||||||
|
gcv.background = back_pix;
|
||||||
|
gcv.graphics_exposures = 0;
|
||||||
|
NormalGC = XCreateGC(dpy, ctx->drawable, gcm, &gcv);
|
||||||
|
|
||||||
|
/* ONLYSHAPE ON */
|
||||||
|
if (onlyshape) {
|
||||||
|
pixmask = XCreateBitmapFromData(dpy, win, rond_bits, DIAMETRE, DIAMETRE);
|
||||||
|
XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, pixmask, ShapeSet);
|
||||||
|
XShapeCombineMask(dpy, iconwin, ShapeBounding, 0, 0, pixmask, ShapeSet);
|
||||||
|
}
|
||||||
|
/* ONLYSHAPE OFF */
|
||||||
|
|
||||||
|
mywmhints.initial_state = option_iw;
|
||||||
|
mywmhints.icon_window = iconwin;
|
||||||
|
mywmhints.icon_x = mysizehints.x;
|
||||||
|
mywmhints.icon_y = mysizehints.y;
|
||||||
|
mywmhints.window_group = win;
|
||||||
|
mywmhints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
|
||||||
|
|
||||||
|
XSetWMHints(dpy, win, &mywmhints);
|
||||||
|
|
||||||
|
XSetCommand(dpy, win, argv, argc);
|
||||||
|
XMapWindow(dpy, win);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
XCopyArea(dpy, wmg.pixmap, win, NormalGC, 0, 0, DIAMETRE, DIAMETRE, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
|
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ================= MAIN LOOP ==================
|
||||||
|
*/
|
||||||
|
while (1) {
|
||||||
|
while (XPending(dpy)) {
|
||||||
|
XNextEvent(dpy, &Event);
|
||||||
|
switch (Event.type) {
|
||||||
|
case Expose:
|
||||||
|
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
||||||
|
break;
|
||||||
|
case DestroyNotify:
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
case ButtonPress:
|
||||||
|
/*
|
||||||
|
* earth rotate when clic left (1) , zooming when middle (2)
|
||||||
|
* change screen to longitude / latitude when (3)
|
||||||
|
*/
|
||||||
|
switch (Event.xbutton.button) {
|
||||||
|
case 1:
|
||||||
|
#ifdef MOUSE_LAT_NO_SHIFT
|
||||||
|
move_lat_flag = TRUE;
|
||||||
|
#else
|
||||||
|
if (Event.xbutton.state & ShiftMask)
|
||||||
|
move_lat_flag = TRUE;
|
||||||
|
else
|
||||||
|
move_lat_flag = FALSE;
|
||||||
|
#endif
|
||||||
|
redoaction = 1;
|
||||||
|
wait_release = 1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (Event.xbutton.state & ShiftMask)
|
||||||
|
redoaction = 2;
|
||||||
|
else
|
||||||
|
redoaction = 3;
|
||||||
|
wait_release = 1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
wait_release = 0;
|
||||||
|
redoaction = 0;
|
||||||
|
screen_back();
|
||||||
|
ok = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ButtonRelease:
|
||||||
|
wait_release = 0;
|
||||||
|
redoaction = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wait_release) {
|
||||||
|
usleep(2 * VAL_USLEEP_SHORT);
|
||||||
|
if (redoaction == 1)
|
||||||
|
rotation_terre(Event.xbutton.x, Event.xbutton.y, move_lat_flag);
|
||||||
|
else
|
||||||
|
zooming(Event.xbutton.state & ShiftMask);
|
||||||
|
ok = TRUE;
|
||||||
|
}
|
||||||
|
if (diftimev(tnext, getimev()).tv_sec < 0 || ok) {
|
||||||
|
ok = FALSE;
|
||||||
|
recalc(redoaction == 1);
|
||||||
|
if (do_something) {
|
||||||
|
if (!myRConvertImage(ctx, small, &pix)) {
|
||||||
|
fprintf(stdout, "plante !?\n");
|
||||||
|
fprintf(stdout, RMessageForError(RErrorCode));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
wmg.pixmap = pix;
|
||||||
|
wmg.mask = pix;
|
||||||
|
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "draw\n");
|
||||||
|
#endif
|
||||||
|
do_something = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usleep(VAL_USLEEP);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Still wonder about freeing some memory for X
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
}
|
197
wmglobe/src/wmglobe.h
Normal file
197
wmglobe/src/wmglobe.h
Normal file
|
@ -0,0 +1,197 @@
|
||||||
|
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
||||||
|
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
***************************************************************************/
|
||||||
|
/* it uses some functions of : Xglobe, Xearth, wmgeneral, wmaker/wrlib
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef WMG_HEADER_H
|
||||||
|
#define WMG_HEADER_H
|
||||||
|
|
||||||
|
/* customization : see wmgoption.h */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <ctype.h> /*toupper */
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/timeb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/xpm.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
#include <X11/extensions/shape.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
|
#include "wraster.h"
|
||||||
|
|
||||||
|
#include "wmgoption.h"
|
||||||
|
|
||||||
|
#define FALSE 0
|
||||||
|
#define TRUE 1
|
||||||
|
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
||||||
|
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
||||||
|
#define ABS(a) ((a) < 0 ? -(a) : (a))
|
||||||
|
|
||||||
|
#define PTFIXED 1
|
||||||
|
#define PTSUNREL 2
|
||||||
|
#define PTRANDOM 3
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI 3.141592653
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wmglobe
|
||||||
|
* variables globales
|
||||||
|
*/
|
||||||
|
|
||||||
|
/************/
|
||||||
|
/* Typedefs */
|
||||||
|
/************/
|
||||||
|
#define MAX_MOUSE_REGION (8)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int enable;
|
||||||
|
int top;
|
||||||
|
int bottom;
|
||||||
|
int left;
|
||||||
|
int right;
|
||||||
|
} MOUSE_REGION;
|
||||||
|
|
||||||
|
MOUSE_REGION mouse_region[MAX_MOUSE_REGION];
|
||||||
|
|
||||||
|
typedef struct MPO {
|
||||||
|
int r, g, b;
|
||||||
|
} MPO;
|
||||||
|
|
||||||
|
MPO *md[4], *mn[4];
|
||||||
|
|
||||||
|
double soluce[DIAMETRE / 2][DIAMETRE][4];
|
||||||
|
int solution;
|
||||||
|
|
||||||
|
/************/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Pixmap pixmap;
|
||||||
|
Pixmap mask;
|
||||||
|
XpmAttributes attributes;
|
||||||
|
} XpmIcon;
|
||||||
|
|
||||||
|
/************/
|
||||||
|
|
||||||
|
|
||||||
|
Display *dpy;
|
||||||
|
|
||||||
|
char *dayfile, *nightfile, *dpy_name;
|
||||||
|
|
||||||
|
Pixmap pix, pixmask;
|
||||||
|
|
||||||
|
XEvent Event;
|
||||||
|
|
||||||
|
RImage *map, *small, *mapnight;
|
||||||
|
|
||||||
|
XpmIcon screenpos, scrdate, scrdiv, numpix, txtpix, wmg;
|
||||||
|
|
||||||
|
Window iconwin, win;
|
||||||
|
int onlyshape, option_iw;
|
||||||
|
GC NormalGC;
|
||||||
|
|
||||||
|
/********* rendering********/
|
||||||
|
|
||||||
|
double delay, time_multi;
|
||||||
|
/*
|
||||||
|
* struct timeval delta_tim, last_tim, next_tim, render_tim, base_tim,
|
||||||
|
* vec_tim;
|
||||||
|
*
|
||||||
|
* time_t beg_time, ini_time,t1901;
|
||||||
|
*/
|
||||||
|
struct timeval tlast, tnext, trend, tdelay, tini, tbase;
|
||||||
|
time_t tsunpos;
|
||||||
|
|
||||||
|
int sens, fun, funx, funy, oknimap, mratiox, mratioy, gotoscr;
|
||||||
|
|
||||||
|
int typecadre, p_type, use_nightmap, use_nmap_ini, firstTime, stoprand,
|
||||||
|
do_something, iop;
|
||||||
|
|
||||||
|
double v_lat, v_long, old_dvlat, old_dvlong, dv_lat, dv_long;
|
||||||
|
double dlat, dlong, addlat, addlong, ratiox, ratioy, dawn;
|
||||||
|
|
||||||
|
double sun_lat;
|
||||||
|
double sun_long;
|
||||||
|
|
||||||
|
double fov;
|
||||||
|
double radius;
|
||||||
|
double proj_dist; /* distance to projection plane */
|
||||||
|
|
||||||
|
double center_dist; /* distance to center of earth */
|
||||||
|
|
||||||
|
double ambient_light; /* how dark is the dark side? */
|
||||||
|
|
||||||
|
double light_x, light_y, light_z; /* vector of sunlight with lengt 1 */
|
||||||
|
|
||||||
|
double c_coef, b_coef;
|
||||||
|
double zoom;
|
||||||
|
int radius_proj, aml; /* radius of sphere on screen */
|
||||||
|
|
||||||
|
RColor noir;
|
||||||
|
#ifdef DEBUG
|
||||||
|
double minhz;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
/* Function Prototypes */
|
||||||
|
/****************************************************************/
|
||||||
|
int main(int argc, char *argv[]);
|
||||||
|
/****************************************************************/
|
||||||
|
void AddMouseRegion(int index, int left, int top, int right, int bottom);
|
||||||
|
int CheckMouseRegion(int x, int y);
|
||||||
|
void RedrawWindowXYWH(int x, int y, int w, int h);
|
||||||
|
void set_defaults();
|
||||||
|
void loadxpm(Window drawable);
|
||||||
|
void cmdline(int argc, char *argv[]);
|
||||||
|
void screen_back();
|
||||||
|
void rotation_terre(int x, int y, int lat_flag);
|
||||||
|
void zooming(int facto);
|
||||||
|
struct timeval diftimev(struct timeval t1, struct timeval t2);
|
||||||
|
struct timeval addtimev(struct timeval t1, struct timeval t2);
|
||||||
|
struct timeval getimev();
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
void setZoom(double z);
|
||||||
|
void calcDistance();
|
||||||
|
void renderFrame();
|
||||||
|
void initmyconvert();
|
||||||
|
int myRConvertImage(RContext * context, RImage * image, Pixmap * pixmap);
|
||||||
|
RContext *myRCreateContext
|
||||||
|
(Display * dpy, int screen_number, RContextAttributes * attribs);
|
||||||
|
void setTime(struct timeval t);
|
||||||
|
void recalc(int calme);
|
||||||
|
void GetSunPos(time_t ssue, double *lat, double *lon);
|
||||||
|
void setViewPos(double lat, double lon);
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
|
||||||
|
#endif
|
87
wmglobe/src/wmgoption.h
Normal file
87
wmglobe/src/wmgoption.h
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
||||||
|
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* #define DEBUG
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WMGVERSION "WMGlobe v.0.5 6 fev 1999 <jerome.dumonteil@capway.com>"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* comment DEFMAPOK to not install the built-in default maps,
|
||||||
|
* (smaller binary) usefull if you never use the default map
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DEFMAPOK
|
||||||
|
|
||||||
|
/*
|
||||||
|
* uncomment MOUSE_LAT_FULL to supprim the shift+left method of rotate earth
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* #define MOUSE_LAT_NO_SHIFT
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* number of parameter screen : min 1, max 7 (all, the recommanded default)
|
||||||
|
* - this doesnt modify the binary size -
|
||||||
|
* 1 : postion latitude & longitude
|
||||||
|
* 2 : time of viewpoint (+ screen 1)
|
||||||
|
* 3 : delay & zoom (+ screen 1 & 2)
|
||||||
|
* 4 : light & dawn (+ screen 1..3)
|
||||||
|
* 5 : accel & night map (+ screen 1..4)
|
||||||
|
* 6 : dlat & dlong (+ screen 1..5)
|
||||||
|
* 7 : type of view (+ screen 1..6)
|
||||||
|
*/
|
||||||
|
#define NUM_SCREEN 7
|
||||||
|
|
||||||
|
/*** 0.04 sec main loop sleep (maximum refresh rate when delay=0) ***/
|
||||||
|
#define VAL_USLEEP 40000
|
||||||
|
|
||||||
|
#define VAL_USLEEP_SHORT 500
|
||||||
|
|
||||||
|
/* waiting time before get back from param screen to earth (seconds) */
|
||||||
|
#define SCREEN_WAIT 5
|
||||||
|
|
||||||
|
#define ZOOM_FACTOR 1.06
|
||||||
|
#define ZOOM_MIN 0.08
|
||||||
|
#define ZOOM_MAX 100000.0
|
||||||
|
#define STOP_RANDOM_FACTOR 1
|
||||||
|
#define RATIO_ROTATE 0.5
|
||||||
|
|
||||||
|
|
||||||
|
#define DEFAULT_DELAY 1.0
|
||||||
|
#define DEFAULT_V_LAT 0.0
|
||||||
|
#define DEFAULT_V_LONG 0.0
|
||||||
|
#define DEFAULT_SENS 1
|
||||||
|
#define DEFAULT_ZOOM 1.0
|
||||||
|
#define DEFAULT_LIGHT 0.25
|
||||||
|
#define DEFAULT_BORDER 0
|
||||||
|
#define DEFAULT_NIGHTMAP 1 /* 1 or 0 */
|
||||||
|
|
||||||
|
#define MAX_DELAY_SEC 86400.0
|
||||||
|
#define MAX_MULTI_COEF 864000.0
|
||||||
|
#define MAX_DELTA_LONG 1800.0
|
||||||
|
|
||||||
|
/*** (1 - dawn/2) *****/
|
||||||
|
#define DEFAULT_DAWN 0.9
|
||||||
|
|
||||||
|
/* change this if not 64x64 icons (not deep tested) you will need to change
|
||||||
|
the cadrex.xbm too and a few other things for the parameters menus
|
||||||
|
--- DIAMETRE must be a multiple of 2 --- */
|
||||||
|
#define DIAMETRE 64
|
2357
wmglobe/src/wmgutil.c
Normal file
2357
wmglobe/src/wmgutil.c
Normal file
File diff suppressed because it is too large
Load diff
398
wmglobe/src/wraster.h
Normal file
398
wmglobe/src/wraster.h
Normal file
|
@ -0,0 +1,398 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Raster graphics library
|
||||||
|
*
|
||||||
|
* Copyright (c) 1997, 1998 Alfredo K. Kojima
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Environment variables:
|
||||||
|
*
|
||||||
|
* WRASTER_GAMMA <rgamma>/<ggamma>/<bgamma>
|
||||||
|
* gamma correction value. Must be greater than 0
|
||||||
|
* Only for PseudoColor visuals.
|
||||||
|
*
|
||||||
|
* Default:
|
||||||
|
* WRASTER_GAMMA 1/1/1
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* If you want a specific value for a screen, append the screen number
|
||||||
|
* preceded by a hash to the variable name as in
|
||||||
|
* WRASTER_GAMMA#1
|
||||||
|
* for screen number 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RLRASTER_H_
|
||||||
|
#define RLRASTER_H_
|
||||||
|
|
||||||
|
|
||||||
|
/* version of the header for the library: 0.11 */
|
||||||
|
#define WRASTER_HEADER_VERSION 11
|
||||||
|
|
||||||
|
#ifdef HAVE_ALLOCA_H
|
||||||
|
#include <alloca.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
|
||||||
|
#ifdef XSHM
|
||||||
|
#include <X11/extensions/XShm.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* RM_MATCH or RM_DITHER */
|
||||||
|
#define RC_RenderMode (1<<0)
|
||||||
|
|
||||||
|
/* number of colors per channel for colormap in PseudoColor mode */
|
||||||
|
#define RC_ColorsPerChannel (1<<1)
|
||||||
|
|
||||||
|
/* do gamma correction */
|
||||||
|
#define RC_GammaCorrection (1<<2)
|
||||||
|
|
||||||
|
/* visual id to use */
|
||||||
|
#define RC_VisualID (1<<3)
|
||||||
|
|
||||||
|
/* shared memory usage */
|
||||||
|
#define RC_UseSharedMemory (1<<4)
|
||||||
|
|
||||||
|
/* use default instead of best visual */
|
||||||
|
#define RC_DefaultVisual (1<<5)
|
||||||
|
|
||||||
|
typedef struct RContextAttributes {
|
||||||
|
int flags;
|
||||||
|
int render_mode;
|
||||||
|
int colors_per_channel; /* for PseudoColor */
|
||||||
|
float rgamma; /* gamma correction for red, */
|
||||||
|
float ggamma; /* green, */
|
||||||
|
float bgamma; /* and blue */
|
||||||
|
VisualID visualid; /* visual ID to use */
|
||||||
|
int use_shared_memory; /* True of False */
|
||||||
|
} RContextAttributes;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* describes a screen in terms of depth, visual, number of colors
|
||||||
|
* we can use, if we should do dithering, and what colors to use for
|
||||||
|
* dithering.
|
||||||
|
*/
|
||||||
|
typedef struct RContext {
|
||||||
|
Display *dpy;
|
||||||
|
int screen_number;
|
||||||
|
Colormap cmap;
|
||||||
|
|
||||||
|
RContextAttributes *attribs;
|
||||||
|
|
||||||
|
GC copy_gc;
|
||||||
|
|
||||||
|
Visual *visual;
|
||||||
|
int depth;
|
||||||
|
Window drawable; /* window to pass for XCreatePixmap(). */
|
||||||
|
/* generally = root */
|
||||||
|
int vclass;
|
||||||
|
|
||||||
|
unsigned long black;
|
||||||
|
unsigned long white;
|
||||||
|
|
||||||
|
int red_offset; /* only used in 24bpp */
|
||||||
|
int green_offset;
|
||||||
|
int blue_offset;
|
||||||
|
|
||||||
|
/* only used for pseudocolor and grayscale */
|
||||||
|
|
||||||
|
XStandardColormap *std_rgb_map; /* standard RGB colormap */
|
||||||
|
XStandardColormap *std_gray_map; /* standard grayscale colormap */
|
||||||
|
|
||||||
|
int ncolors; /* total number of colors we can use */
|
||||||
|
XColor *colors; /* internal colormap */
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned int use_shared_pixmap:1;
|
||||||
|
} flags;
|
||||||
|
} RContext;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct RColor {
|
||||||
|
unsigned char red;
|
||||||
|
unsigned char green;
|
||||||
|
unsigned char blue;
|
||||||
|
unsigned char alpha;
|
||||||
|
} RColor;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct RHSVColor {
|
||||||
|
unsigned short hue; /* 0-359 */
|
||||||
|
unsigned char saturation; /* 0-255 */
|
||||||
|
unsigned char value; /* 0-255 */
|
||||||
|
} RHSVColor;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct RPoint {
|
||||||
|
int x, y;
|
||||||
|
} RPoint;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct RSegment {
|
||||||
|
int x1, y1, x2, y2;
|
||||||
|
} RSegment;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* internal 24bit+alpha image representation
|
||||||
|
*/
|
||||||
|
typedef struct RImage {
|
||||||
|
unsigned width, height; /* size of the image */
|
||||||
|
RColor background; /* background color */
|
||||||
|
unsigned char *data[4]; /* image data (R,G,B,A) */
|
||||||
|
} RImage;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* internal wrapper for XImage. Used for shm abstraction
|
||||||
|
*/
|
||||||
|
typedef struct RXImage {
|
||||||
|
XImage *image;
|
||||||
|
|
||||||
|
/* Private data. Do not access */
|
||||||
|
#ifdef XSHM
|
||||||
|
XShmSegmentInfo info;
|
||||||
|
char is_shared;
|
||||||
|
#endif
|
||||||
|
} RXImage;
|
||||||
|
|
||||||
|
|
||||||
|
/* note that not all operations are supported in all functions */
|
||||||
|
enum {
|
||||||
|
RClearOperation, /* clear with 0 */
|
||||||
|
RCopyOperation,
|
||||||
|
RNormalOperation, /* same as combine */
|
||||||
|
RAddOperation,
|
||||||
|
RSubtractOperation
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* image display modes */
|
||||||
|
enum {
|
||||||
|
RDitheredRendering = 0,
|
||||||
|
RBestMatchRendering = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/* bw compat */
|
||||||
|
#define RM_DITHER RDitheredRendering
|
||||||
|
#define RM_MATCH RBestMatchRendering
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RAbsoluteCoordinates = 0,
|
||||||
|
RRelativeCoordinates = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RSunkenBevel = -1,
|
||||||
|
RRaisedBevel = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/* bw compat */
|
||||||
|
#define RBEV_SUNKEN RSunkenBevel
|
||||||
|
/* 1 pixel wide */
|
||||||
|
#define RBEV_RAISED RRaisedBevel
|
||||||
|
/* 1 pixel wide on top/left 2 on bottom/right */
|
||||||
|
#define RBEV_RAISED2 2
|
||||||
|
/* 2 pixel width */
|
||||||
|
#define RBEV_RAISED3 3
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RHorizontalGradient = 2,
|
||||||
|
RVerticalGradient = 3,
|
||||||
|
RDiagonalGradient = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
/* for backwards compatibility */
|
||||||
|
#define RGRD_HORIZONTAL RHorizontalGradient
|
||||||
|
#define RGRD_VERTICAL RVerticalGradient
|
||||||
|
#define RGRD_DIAGONAL RDiagonalGradient
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* error codes */
|
||||||
|
#define RERR_NONE 0
|
||||||
|
#define RERR_OPEN 1 /* cant open file */
|
||||||
|
#define RERR_READ 2 /* error reading from file */
|
||||||
|
#define RERR_WRITE 3 /* error writing to file */
|
||||||
|
#define RERR_NOMEMORY 4 /* out of memory */
|
||||||
|
#define RERR_NOCOLOR 5 /* out of color cells */
|
||||||
|
#define RERR_BADIMAGEFILE 6 /* image file is corrupted or invalid */
|
||||||
|
#define RERR_BADFORMAT 7 /* image file format is unknown */
|
||||||
|
#define RERR_BADINDEX 8 /* no such image index in file */
|
||||||
|
|
||||||
|
#define RERR_BADVISUALID 16 /* invalid visual ID requested for context */
|
||||||
|
|
||||||
|
#define RERR_XERROR 127 /* internal X error */
|
||||||
|
#define RERR_INTERNAL 128 /* should not happen */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns a NULL terminated array of strings containing the
|
||||||
|
* supported formats, such as: TIFF, XPM, PNG, JPEG, PPM, GIF
|
||||||
|
*/
|
||||||
|
char **RSupportedFileFormats(void);
|
||||||
|
|
||||||
|
void RFreeStringList(char **list);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Xlib contexts
|
||||||
|
*/
|
||||||
|
RContext *RCreateContext(Display * dpy, int screen_number,
|
||||||
|
RContextAttributes * attribs);
|
||||||
|
|
||||||
|
void RDestroyContext(RContext * context);
|
||||||
|
|
||||||
|
Bool RGetClosestXColor(RContext * context, RColor * color, XColor * retColor);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RImage creation
|
||||||
|
*/
|
||||||
|
RImage *RCreateImage(unsigned width, unsigned height, int alpha);
|
||||||
|
|
||||||
|
RImage *RCreateImageFromXImage(RContext * context, XImage * image, XImage * mask);
|
||||||
|
|
||||||
|
RImage *RCreateImageFromDrawable(RContext * context, Drawable drawable,
|
||||||
|
Pixmap mask);
|
||||||
|
|
||||||
|
RImage *RLoadImage(RContext * context, char *file, int index);
|
||||||
|
|
||||||
|
|
||||||
|
void RDestroyImage(RImage * image);
|
||||||
|
|
||||||
|
RImage *RGetImageFromXPMData(RContext * context, char **data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RImage storing
|
||||||
|
*/
|
||||||
|
Bool RSaveImage(RImage * image, char *filename, char *format);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Area manipulation
|
||||||
|
*/
|
||||||
|
RImage *RCloneImage(RImage * image);
|
||||||
|
|
||||||
|
RImage *RGetSubImage(RImage * image, int x, int y, unsigned width,
|
||||||
|
unsigned height);
|
||||||
|
|
||||||
|
void RCombineImageWithColor(RImage * image, RColor * color);
|
||||||
|
|
||||||
|
void RCombineImages(RImage * image, RImage * src);
|
||||||
|
|
||||||
|
void RCombineArea(RImage * image, RImage * src, int sx, int sy, unsigned width,
|
||||||
|
unsigned height, int dx, int dy);
|
||||||
|
|
||||||
|
void RCombineImagesWithOpaqueness(RImage * image, RImage * src, int opaqueness);
|
||||||
|
|
||||||
|
void RCombineAreaWithOpaqueness(RImage * image, RImage * src, int sx, int sy,
|
||||||
|
unsigned width, unsigned height, int dx, int dy,
|
||||||
|
int opaqueness);
|
||||||
|
|
||||||
|
RImage *RScaleImage(RImage * image, unsigned new_width, unsigned new_height);
|
||||||
|
|
||||||
|
RImage *RMakeTiledImage(RImage * tile, unsigned width, unsigned height);
|
||||||
|
|
||||||
|
RImage *RMakeCenteredImage(RImage * image, unsigned width, unsigned height,
|
||||||
|
RColor * color);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Drawing
|
||||||
|
*/
|
||||||
|
Bool RGetPixel(RImage * image, int x, int y, RColor * color);
|
||||||
|
|
||||||
|
void RPutPixel(RImage * image, int x, int y, RColor * color);
|
||||||
|
|
||||||
|
void ROperatePixel(RImage * image, int operation, int x, int y, RColor * color);
|
||||||
|
|
||||||
|
void RPutPixels(RImage * image, RPoint * points, int npoints, int mode,
|
||||||
|
RColor * color);
|
||||||
|
|
||||||
|
void ROperatePixels(RImage * image, int operation, RPoint * points,
|
||||||
|
int npoints, int mode, RColor * color);
|
||||||
|
|
||||||
|
int RDrawLine(RImage * image, int x0, int y0, int x1, int y1, RColor * color);
|
||||||
|
|
||||||
|
int ROperateLine(RImage * image, int operation, int x0, int y0, int x1, int y1,
|
||||||
|
RColor * color);
|
||||||
|
|
||||||
|
void RDrawLines(RImage * image, RPoint * points, int npoints, int mode,
|
||||||
|
RColor * color);
|
||||||
|
|
||||||
|
void ROperateLines(RImage * image, int operation, RPoint * points, int npoints,
|
||||||
|
int mode, RColor * color);
|
||||||
|
|
||||||
|
void RDrawSegments(RImage * image, RSegment * segs, int nsegs, RColor * color);
|
||||||
|
|
||||||
|
void ROperateSegments(RImage * image, int operation, RSegment * segs, int nsegs,
|
||||||
|
RColor * color);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Color convertion
|
||||||
|
*/
|
||||||
|
void RRGBtoHSV(RColor * color, RHSVColor * hsv);
|
||||||
|
void RHSVtoRGB(RHSVColor * hsv, RColor * rgb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Painting
|
||||||
|
*/
|
||||||
|
void RClearImage(RImage * image, RColor * color);
|
||||||
|
|
||||||
|
void RBevelImage(RImage * image, int bevel_type);
|
||||||
|
|
||||||
|
RImage *RRenderGradient(unsigned width, unsigned height, RColor * from,
|
||||||
|
RColor * to, int style);
|
||||||
|
|
||||||
|
|
||||||
|
RImage *RRenderMultiGradient(unsigned width, unsigned height, RColor ** colors,
|
||||||
|
int style);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convertion into X Pixmaps
|
||||||
|
*/
|
||||||
|
int RConvertImage(RContext * context, RImage * image, Pixmap * pixmap);
|
||||||
|
|
||||||
|
int RConvertImageMask(RContext * context, RImage * image, Pixmap * pixmap,
|
||||||
|
Pixmap * mask, int threshold);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* misc. utilities
|
||||||
|
*/
|
||||||
|
RXImage *RCreateXImage(RContext * context, int depth,
|
||||||
|
unsigned width, unsigned height);
|
||||||
|
|
||||||
|
void RDestroyXImage(RContext * context, RXImage * ximage);
|
||||||
|
|
||||||
|
void RPutXImage(RContext * context, Drawable d, GC gc, RXImage * ximage,
|
||||||
|
int src_x, int src_y, int dest_x, int dest_y,
|
||||||
|
unsigned width, unsigned height);
|
||||||
|
|
||||||
|
/* do not free the returned string! */
|
||||||
|
const char *RMessageForError(int errorCode);
|
||||||
|
|
||||||
|
int RBlurImage(RImage * image);
|
||||||
|
|
||||||
|
/****** Global Variables *******/
|
||||||
|
|
||||||
|
extern int RErrorCode;
|
||||||
|
|
||||||
|
#endif
|
80
wmglobe/src/zapnum.h
Normal file
80
wmglobe/src/zapnum.h
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/* WMGlobe 0.5.pre1 - All the Earth on a WMaker Icon
|
||||||
|
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
int zapnum[14][4] =
|
||||||
|
{
|
||||||
|
{90, 0, 10, 13},
|
||||||
|
{0, 0, 10, 13},
|
||||||
|
{10, 0, 10, 13},
|
||||||
|
{20, 0, 10, 13},
|
||||||
|
{30, 0, 10, 13},
|
||||||
|
{40, 0, 10, 13},
|
||||||
|
{50, 0, 10, 13},
|
||||||
|
{60, 0, 10, 13},
|
||||||
|
{70, 0, 10, 13},
|
||||||
|
{80, 0, 10, 13},
|
||||||
|
{100, 0, 10, 13},
|
||||||
|
{110, 0, 10, 13},
|
||||||
|
{100, 0, 5, 13},
|
||||||
|
{114, 0, 5, 13}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* int zapnum2[14][4] =
|
||||||
|
* {
|
||||||
|
* {72, 0, 8, 13},
|
||||||
|
* {0, 0, 8, 13},
|
||||||
|
* {8, 0, 8, 13},
|
||||||
|
* {16, 0, 8, 13},
|
||||||
|
* {24, 0, 8, 13},
|
||||||
|
* {32, 0, 8, 13},
|
||||||
|
* {40, 0, 8, 13},
|
||||||
|
* {48, 0, 8, 13},
|
||||||
|
* {56, 0, 8, 13},
|
||||||
|
* {64, 0, 8, 13},
|
||||||
|
* {80, 0, 8, 13},
|
||||||
|
* {88, 0, 8, 13},
|
||||||
|
* {80, 0, 6, 13},
|
||||||
|
* {92, 0, 6, 13}
|
||||||
|
* };
|
||||||
|
*/
|
||||||
|
|
||||||
|
int platd[4][2] =
|
||||||
|
{
|
||||||
|
{2, 12},
|
||||||
|
{6, 12},
|
||||||
|
{16, 12},
|
||||||
|
{26, 12}
|
||||||
|
};
|
||||||
|
int platm[2][2] =
|
||||||
|
{
|
||||||
|
{42, 12},
|
||||||
|
{52, 12}
|
||||||
|
};
|
||||||
|
int plongd[4][2] =
|
||||||
|
{
|
||||||
|
{2, 36},
|
||||||
|
{6, 36},
|
||||||
|
{16, 36},
|
||||||
|
{26, 36}
|
||||||
|
};
|
||||||
|
int plongm[2][2] =
|
||||||
|
{
|
||||||
|
{42, 36},
|
||||||
|
{52, 36}
|
||||||
|
};
|
19
wmglobe/src/zapnum.xpm
Normal file
19
wmglobe/src/zapnum.xpm
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * zapnum_xpm[] = {
|
||||||
|
"120 13 3 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
"+ c #CCCC6E",
|
||||||
|
"........................................................................................................................",
|
||||||
|
"...++++......++++......+++++.......+++....+++++++......+++...++++++++....+++++.....+++++.....+++++......................",
|
||||||
|
"..+++++....+++.+++...+++..++++....++++....+++++++....+++.....++++++++...++..+++...+++.+++...+++.+++.....................",
|
||||||
|
"....+++....+++..+++..+++...+++...+++++....++........+++......+.....+...+++...+++.+++...+++..++...++.....................",
|
||||||
|
"....+++....+++..+++..+++...+++..++.+++....++........++++++...+....++...+++...+++.+++...+++.+++...+++....................",
|
||||||
|
"....+++.........+++.......+++..++..+++....++++++...+++..+++.......+.....++++.++..+++...+++.+++...+++..............+++++.",
|
||||||
|
"....+++........+++.....+++++..++...+++........+++..+++...+++.....++......+++++...+++...+++.+++...+++..............+++++.",
|
||||||
|
"....+++.......+++.........++++++++++++++.......+++.+++...+++....++......++.++++...+++..+++.+++...+++....................",
|
||||||
|
"....+++......+++.....++....+++++++++++++..++...+++.+++...+++....++.....+++..++++...++++++..+++...+++....................",
|
||||||
|
"....+++.....+++...+..+++...+++.....+++...+++...+++.+++...+++...++......+++...+++......+++...++...++.....................",
|
||||||
|
"....+++....++++++++..+++..+++......+++...++++.+++...+++.+++....++.......+++..++......+++....+++.+++.....................",
|
||||||
|
"..+++++++..++++++++....+++++.......+++....+++++......+++++....++.........+++++.....+++.......+++++......................",
|
||||||
|
"..................................................................................++...................................."};
|
16
wmglobe/src/zaptxt.xpm
Normal file
16
wmglobe/src/zaptxt.xpm
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * zaptxt_xpm[] = {
|
||||||
|
"434 10 3 1",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
"+ c #CCCC6E",
|
||||||
|
"..............................................................................................................................................................................................................................................+..................................................................................++.++................++++++.+.+.+...++.++.....++++.++++..+......++.............+.................................",
|
||||||
|
".+++....++...+++...+++.....++.+++++...++..+++++..+++...+++....................................................................................................................................................................................+..++..............................................++....+.+....+.................++...++...............+++++++.+.+...++...++....++.....++..+......++...++++..++..+.................................",
|
||||||
|
"++.++..+++..++.++.++.++...+++.++.....++...++.++.++.++.++.++.........+...++++...+++..++++..+++++.+++++..+++..++.++.++++....+++.++.++.++....+...+.+..++..+++..++++...+++..++++...+++.++++++.++.++.++.++.++.++.++.++.++.++.+++++................+...++............................+.+..............+..+...+.+....+.........++++....++...++....++....+....++++++.+.+.+..++...++....++.....++...+.....++..++..++.++.+..................................",
|
||||||
|
"++.++...++.....++....++...+++.++....++.......++.++.++.++.++...+....+++..++.++.++.++.++.++.++....++....++.++.++.++..++......++.++.++.++....++.++.++.++.++.++.++.++.++.++.++.++.++.++..++...++.++.++.++.++.++.++.++.++.++....++.........++.....+...++.....+......................+.+.....++++.....+..+...+.+...+.........++..++..++.....++..+..+..+.+.+.+++++++.+.+...++...++....++.....++...+.....++......++....+..................................",
|
||||||
|
"++.++...++....++....++...++++.++++..++++.....++..+++..++.++...+...++.++.++.++.++....++.++.++....++....++....++.++..++......++.++++..++....+++++.+++++.++.++.++.++.++.++.++.++.++.....++...++.++.++.++.+++++.+++++.++.++...+++.........++....+....++...+.+.+..............+++..+++++..++....++....++....................++.+++..++.....++..+.+......+..++++++.+.+.+..++...++....++.....++....+....++.....++....+....+++............................",
|
||||||
|
"++.++...++....++.....++..+.++....++.++.++...++..++.++..++++.+++++.++.++.++++..++....++.++.++++..++++..+++++.+++++..++......++.+++...++....+++++.+++++.++.++.++++..++.++.++++...+++...++...++.++.++.++.+++++..+++...+++...+++................+....++....+++...+++...............+.+.++........++........................++.+++..++.....++...+..........+++++++.+.+..++.....++...++.....++....+....++....++.....+...++.++...........................",
|
||||||
|
"++.++...++...++......++.++.++....++.++.++...++..++.++....++...+...+++++.++.++.++....++.++.++....++....++.++.++.++..++...++.++.++++..++....+++++.+++++.++.++.++....++.++.+++......++..++...++.++.++.++.+++++.+++++..+++..+++................+.....++...+.+.+..............+++..+++++..++....++..........................++.++...++.....++..+.+.+.......++++++.+.+.+..++...++....++.....++.....+...++....++....+....++.++...........................",
|
||||||
|
"++.++...++...++...++.++.+++++.++.++.++.++..++...++.++...++....+...++.++.++.++.++.++.++.++.++....++....++.++.++.++..++...++.++.++.++.++....++.++.++.++.++.++.++....++.++.++++..++.++..++...++.++..+++..++.++.++.++..+++..++............++...+............+...........++.........+.+.....++++..........................+.++......++.....++..+..+........+++++++.+.+...++...++....++.....++.....+...++..........+....++.++...........................",
|
||||||
|
".+++....++..+++++..+++.....++..+++...+++...++....+++...++.........++.++.++++...+++..++++..+++++.++.....++++.++.++.++++...+++..++.++.+++++.++.++.++..+..+++..++.....+++..++.++..+++...++....+++....+...+...+.++.++..+++..+++++.........++..+......++.................++.........+.+..................................++..++++....++...++....++.+.......++++++.+.+.+..++...++....++.....++......+..++....++...+..++..+++............................",
|
||||||
|
".....................................................................................................................................................................++...................................................................+.........................................................................+............+...+................+++++++.+.+....++.++.....++++.++++......+..++.........+..++................................."};
|
242
wmglobe/wmglobe.1
Normal file
242
wmglobe/wmglobe.1
Normal file
|
@ -0,0 +1,242 @@
|
||||||
|
.TH WMGlobe 1 "fevrier 1999"
|
||||||
|
.SH NAME
|
||||||
|
WMGlobe - The Whole Earth spinning on you desktop...
|
||||||
|
as a dockable app for WindowMaker
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B wmglobe
|
||||||
|
.I "[-options]"
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
WMGlobe is a WindowMaker dock.app that displays the earth on an icon. It's
|
||||||
|
an adaptation of XGlobe to WMaker environnement. WMGlobe uses a map which is
|
||||||
|
rendered on a sphere by raytracing. Yes, for a 64x64 pixel result:-)
|
||||||
|
.SH "OPTIONS"
|
||||||
|
.TP
|
||||||
|
.B \-v
|
||||||
|
version. Currently, this should display :
|
||||||
|
|
||||||
|
WMGlobe v.0.5 6 fev 1999 <jerome.dumonteil@capway.com>
|
||||||
|
.TP
|
||||||
|
.B \-h
|
||||||
|
short help
|
||||||
|
.TP
|
||||||
|
.B \-zoom \fI zoom_value\fP
|
||||||
|
Value > 1 to magnify the view, value < 1 to lower. Default: 1.0
|
||||||
|
.TP
|
||||||
|
.B \-pos \fI latitude longitude\fP
|
||||||
|
Initial viewing fixed at this position, don't follow
|
||||||
|
the sun rotation. Accepted values in the form 45°12'36 or 45.21 or 45:12:36 .
|
||||||
|
Default: the initial position is "under" the sun, and
|
||||||
|
the point of view follows the sun.
|
||||||
|
.TP
|
||||||
|
.B \-rand
|
||||||
|
New random position at every refresh of screen.
|
||||||
|
.TP
|
||||||
|
.B \-map \fI map_file\fP
|
||||||
|
Map used for the rendering. Can be JPEG, GIG, XPM
|
||||||
|
PNM, TIFF but none BMP.
|
||||||
|
Default: use internal map of earth.
|
||||||
|
.TP
|
||||||
|
.B \-nimap \fI night_file\fP
|
||||||
|
Map used for the dark side of the earth. Must be of
|
||||||
|
the same width x height as the day side map.
|
||||||
|
Default: if the default internal day map is used, use
|
||||||
|
a default internal night file (see -nonimap option).
|
||||||
|
If a custom day map is provided, and no night map, the
|
||||||
|
dark side is computed via the -light option.
|
||||||
|
.TP
|
||||||
|
.B \-nonimap
|
||||||
|
Don't use the default night map.
|
||||||
|
.TP
|
||||||
|
.B \-delay \fI seconds\fP
|
||||||
|
Time in seconds between each calculation of a new
|
||||||
|
position. Limited to 0.04 at compile time (25 frames
|
||||||
|
per second should be enough). The sun position move
|
||||||
|
only once per minute, so if you use wmglobe without
|
||||||
|
-dlong or -accel option, the CPU cost of WMGlobe is
|
||||||
|
*very* low. The use of very low value for -delay plus
|
||||||
|
-dlong and -accel can be CPU costly (but very nice...).
|
||||||
|
Default: 1.0 sec.
|
||||||
|
.TP
|
||||||
|
.B \-dlat \fI delta_latitude\fP
|
||||||
|
Move the point of view by delta_lat degrees per second,
|
||||||
|
with a value of 6 the earth make a full rotation in
|
||||||
|
one minute. The value can be formated as -pos option.
|
||||||
|
Default: 0°0'0
|
||||||
|
.TP
|
||||||
|
.B \-dlong \fI delta_long\fP
|
||||||
|
Move the point of view by delta_long degrees per
|
||||||
|
second. With a value of -0°0'15" the earth make a full
|
||||||
|
rotation in 24 hours toward the west. By default,
|
||||||
|
-dlong and -dlat are null. If they are used, the view
|
||||||
|
follow their values. Going back to "follow sun" mode
|
||||||
|
in parameters screen put -dlat and -dlong to zero.
|
||||||
|
.TP
|
||||||
|
.B \-light \fI light_value\fP
|
||||||
|
Level of light of the dark side when there is no
|
||||||
|
night map, from 0 to 1.
|
||||||
|
Default: 0.25
|
||||||
|
.TP
|
||||||
|
.B \-dawn \fI dawn_value\fP
|
||||||
|
Level of continuity for dawn limit, from 0 to 1. With
|
||||||
|
a value of 1, the border line between night and day is
|
||||||
|
at maximum contrast.
|
||||||
|
Default: 0.2
|
||||||
|
.TP
|
||||||
|
.B \-bord \fI border_num\fP
|
||||||
|
0 1 or 2. There are 3 different borders for the icon.
|
||||||
|
Default: 0
|
||||||
|
.TP
|
||||||
|
.B \-accel \fI time_multi\fP
|
||||||
|
Time warp factor. With -accel 24, the sun make a full
|
||||||
|
rotation in one hour (or the earth, I'm not sure). Default: 1.0
|
||||||
|
.TP
|
||||||
|
.B \-time \fI seconds\fP
|
||||||
|
Time to display in seconds since 01-01-1970 (see the
|
||||||
|
date command). Necessary if you need to be sure that
|
||||||
|
WMGlobe is Y2K compliant without changing system time.
|
||||||
|
Negative values for dates before 1970 accepted.
|
||||||
|
Default: not set, use current time.
|
||||||
|
.TP
|
||||||
|
.B \-fun \fI dx dy\fP
|
||||||
|
Move the earth image by dx dy pixels in the icon. See
|
||||||
|
puzzle.sh to understand why.
|
||||||
|
.TP
|
||||||
|
.B \-oz
|
||||||
|
Start in "austral" mode (for "down under" people)
|
||||||
|
.TP
|
||||||
|
.B \-d \fI display\fP
|
||||||
|
Select another display
|
||||||
|
.TP
|
||||||
|
.B \-w \-shape
|
||||||
|
Useless, since it is set by default (WMaker dockable
|
||||||
|
application)
|
||||||
|
.SH "MOUSE OPTIONS"
|
||||||
|
.TP
|
||||||
|
.B left button
|
||||||
|
Change longitude while pressed, change longitude &
|
||||||
|
latitude if shift+left button.
|
||||||
|
.TP
|
||||||
|
.B middle button
|
||||||
|
Zoom in, shift + middle button: zoom out
|
||||||
|
.TP
|
||||||
|
.B right button
|
||||||
|
Displays 7 screens of parameters. On every screen, just
|
||||||
|
clic with left or right button on the figures to change
|
||||||
|
their value. The TIME screen shows an approximation
|
||||||
|
of date and time of the earth zone currently displayed,
|
||||||
|
using GMT time + longitude offset, it's close to the
|
||||||
|
real local time by one or two hours. Others options
|
||||||
|
don't need more help. Intuitive they said...
|
||||||
|
.SH "FILES"
|
||||||
|
.TP
|
||||||
|
.B MAPS
|
||||||
|
Like XGlobe, WMGlobe needs a longitude/latitude map to work. By default,
|
||||||
|
it uses a low quality built-in map of earth. But you will probably want
|
||||||
|
to use better ones.
|
||||||
|
You can get maps usable with WMGlobe on the net. See the links below.
|
||||||
|
|
||||||
|
using custom maps:
|
||||||
|
|
||||||
|
For the image to be mapped correctly, position 0°North 0°West must be in
|
||||||
|
the center of the image and the latitude must be linear from 90°N to 90°S.
|
||||||
|
When using a night map, make sure that day and night map have the same
|
||||||
|
dimensions.
|
||||||
|
.TP
|
||||||
|
.B Links: Where to find maps and similar softs
|
||||||
|
|
||||||
|
where to find the sources of wmglobe:
|
||||||
|
the web page of WMGlobe (made by Sylvestre Taburet):
|
||||||
|
|
||||||
|
<http://www.capway.com/dumonte1/wm/wmg.html>
|
||||||
|
|
||||||
|
|
||||||
|
where to find maps and similar softs:
|
||||||
|
|
||||||
|
Earth image by a cgi:
|
||||||
|
|
||||||
|
<http://www.fourmilab.ch/cgi-bin/uncgi/Earth>
|
||||||
|
|
||||||
|
two softs running under X:
|
||||||
|
|
||||||
|
XGlobe Homepage: (many links to map of earth)
|
||||||
|
|
||||||
|
<http://www.uni-karlsruhe.de/~uddn/xglobe>
|
||||||
|
|
||||||
|
|
||||||
|
Xearth Homepage:
|
||||||
|
|
||||||
|
<http://www.cs.colorado.edu/~tuna/xearth/>
|
||||||
|
|
||||||
|
By the way, you can use maps of Mars, Luna ... and text.
|
||||||
|
|
||||||
|
.SH "ENVIRONMENT"
|
||||||
|
.LP
|
||||||
|
WMGlobe uses the setlocale(3) function, so you LANG environment need to be ok.
|
||||||
|
|
||||||
|
You need WindowMaker 0.20.3 or 0.51.0 installed to use WMGlobe.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.LP
|
||||||
|
The Window Maker User Guide
|
||||||
|
|
||||||
|
The Window Maker FAQ
|
||||||
|
|
||||||
|
.SH "AUTHOR"
|
||||||
|
jerome dumonteil <jerome.dumonteil@capway.com>
|
||||||
|
|
||||||
|
Patches, bug reports, and suggestions are welcome.
|
||||||
|
|
||||||
|
.SH "CREDITS"
|
||||||
|
WMGlobe is Copyright (C) 1998,99 by Jerome Dumonteil and licensed through
|
||||||
|
the GNU General Public License.
|
||||||
|
Read the COPYING file for the complete GNU license.
|
||||||
|
|
||||||
|
Original idea, tests, logos:
|
||||||
|
|
||||||
|
Sylvestre Taburet <staburet@consort.fr>
|
||||||
|
|
||||||
|
The code in 'sunpos.cpp' is taken from Xearth by Kirk Lauritz Johnson.
|
||||||
|
|
||||||
|
/*
|
||||||
|
sunpos.c
|
||||||
|
kirk johnson
|
||||||
|
july 1993
|
||||||
|
|
||||||
|
code for calculating the position on the earth's surface for which
|
||||||
|
the sun is directly overhead (adapted from _practical astronomy
|
||||||
|
with your calculator, third edition_, peter duffett-smith,
|
||||||
|
cambridge university press, 1988.)
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1990, 1993, 1994, 1995 Kirk Lauritz Johnson
|
||||||
|
|
||||||
|
Parts of the source code (as marked) are:
|
||||||
|
Copyright (C) 1989, 1990, 1991 by Jim Frost
|
||||||
|
Copyright (C) 1992 by Jamie Zawinski <jwz@lucid.com>
|
||||||
|
|
||||||
|
Permission to use, copy, modify and freely distribute xearth for
|
||||||
|
non-commercial and not-for-profit purposes is hereby granted
|
||||||
|
without fee, provided that both the above copyright notice and this
|
||||||
|
permission notice appear in all copies and in supporting
|
||||||
|
documentation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
The rendering engine is taken from XGlobe by Thorsten Scheuermann
|
||||||
|
XGlobe Homepage: http://www.uni-karlsruhe.de/~uddn/xglobe
|
||||||
|
|
||||||
|
Raster graphics library by Alfredo K. Kojima, & stuff of Window Maker
|
||||||
|
<http://windowmaker.org> by A. K. Kojima, Dan Pascu, Matthew Hawkins & team
|
||||||
|
|
||||||
|
|
||||||
|
.SH "BUGS"
|
||||||
|
.LP
|
||||||
|
If you use the --enable-single-icon compile time option of WindowMaker,
|
||||||
|
you can not display more than one WMGlobe.
|
||||||
|
|
||||||
|
WMGlobe hopes that an overflow of a long integer dont generate an error
|
||||||
|
and that LONG_MAX +1 = LONG_MIN . This happens with high values of -accel
|
||||||
|
when the date go over year 2038. The expected result is wmglobe
|
||||||
|
continuing smoothly from 1901.
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
wmglobe/wmgmap.gif
Normal file
BIN
wmglobe/wmgmap.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 202 B |
Loading…
Reference in a new issue