chocobarlite: initial import.
This commit is contained in:
parent
5b14e38811
commit
dcf8f522c0
109 changed files with 16148 additions and 0 deletions
280
COPYING
Normal file
280
COPYING
Normal file
|
@ -0,0 +1,280 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright © 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
|
7
INSTALL
Normal file
7
INSTALL
Normal file
|
@ -0,0 +1,7 @@
|
|||
Dans le répertoire src/ taper :
|
||||
|
||||
make
|
||||
export CLASSPATH=${CLASSPATH}:/usr/share/java/mysql.jar:.:../bin:../lib:../lib/JSAP_1.03a.jar:../lib/java-getopt-1.0.10.jar
|
||||
|
||||
Pour l'information sur le contenu, les tests, etc. referrez-vous au fichier
|
||||
README.
|
61
Makefile
Normal file
61
Makefile
Normal file
|
@ -0,0 +1,61 @@
|
|||
### Make file du projet CBL
|
||||
### HEADER HERE
|
||||
###
|
||||
|
||||
JAVAC=javac
|
||||
JFLAGS=-d ../bin -classpath ../bin
|
||||
PRJNAME=ChocoBarLite
|
||||
GDATE:= $(shell date +"%Y-%m-%d_r%H%M")
|
||||
GFILENAME:= $(PRJNAME)-$(GDATE).tar.bz2
|
||||
PATH_GFILENAME:= ../$(GFILENAME)
|
||||
GFILESIZE:=
|
||||
LOCALDIR=$(shell pwd)
|
||||
LASTONSERVER = $(shell ssh glenux.ath.cx -l warbrain "ls -rt ~/Projet/Archives/$(PRJNAME)* | tail -n 1")
|
||||
#MAILS=warbrain@glenux.ath.cx
|
||||
|
||||
all: subdir
|
||||
|
||||
run:
|
||||
( cd src/ ; \
|
||||
$(MAKE) run )
|
||||
|
||||
subdir:
|
||||
( cd src/ ; \
|
||||
$(MAKE) )
|
||||
|
||||
doc:
|
||||
( cd src/ ; \
|
||||
$(MAKE) doc )
|
||||
|
||||
clean:
|
||||
$(MAKE) clean -C src/
|
||||
$(MAKE) clean -C doc/rapport/
|
||||
@rm -f *.class *~
|
||||
|
||||
package: clean createpackage sendtoarchives
|
||||
|
||||
#mail: clean createpackage sendpackage sendtoarchives
|
||||
|
||||
createpackage:
|
||||
@#mv lib ../lib$(GDATE)
|
||||
tar -cjvf $(PATH_GFILENAME) -C ../ $(PRJNAME)
|
||||
@##mv ../lib$(GDATE) lib
|
||||
|
||||
sendtoarchives:
|
||||
mv $(PATH_GFILENAME) ../Archives
|
||||
|
||||
#sendpackage:
|
||||
# (echo -e "\nCi joint le fichier:\n$(shell du -sh $(PATH_GFILENAME))" \
|
||||
# && echo -e "\nPour décompresser:" \
|
||||
# && echo -e "\n\ttar -xjvf $(GFILENAME)\n" \
|
||||
# && echo -e "\n(n'oubliez pas de supprimer l'ancien répertoire du même nom avant de décompresser)" \
|
||||
# && echo -e "\n\nHistorique des modifications :\n" \
|
||||
# && cat CHANGELOG ) \
|
||||
# | mutt $(MAILS) -a $(PATH_GFILENAME) -s "[$(PRJNAME)] $(GDATE)"
|
||||
|
||||
# Creer le fichier jar
|
||||
jar: all
|
||||
(cd bin && \
|
||||
jar cvfm $(PRJNAME).jar manifest . && \
|
||||
mv $(PRJNAME).jar ../ \
|
||||
)
|
132
README
Normal file
132
README
Normal file
|
@ -0,0 +1,132 @@
|
|||
|
||||
TESTS
|
||||
-----
|
||||
ATTENTION: Les tests sont effectués en donnant des paramètres des tests sur la
|
||||
ligne de commande, le répertoire tst/ comme demandé par l'énoncé
|
||||
n'existe donc PAS. Cépendant, quelques fichiers .txt sont fournis
|
||||
dans le répertoire io/ afin de pouvoir tester entrées/sorties du jeu.
|
||||
|
||||
Une fois que le projet est installé et compilé, dans le répertoire src/ taper
|
||||
cette ligne pour tester :
|
||||
|
||||
java ChocoBarLite
|
||||
|
||||
et cette ligne pour afficher l'aide :
|
||||
|
||||
java ChocoBarLite -help
|
||||
|
||||
CONTENU PROJET
|
||||
--------------
|
||||
Les fichiers très utiles sont :
|
||||
- INSTALL dans le répertoire racine du projet décrivant la procédure de
|
||||
compilation et de configuration
|
||||
- README dans le répertoire racine du projet décrivant ce projet en bref
|
||||
- doc.txt contenant le pseudo langange des algorithmes demandés dans le
|
||||
répertoire doc/rapport/
|
||||
- Makefile dans le répertoire src/
|
||||
- Fichiers .txt pour tester E/S dans le répertoire io/
|
||||
- Les sources du projet dans le répertoire src/
|
||||
- La documentation de la source dans le répertoire doc/doxydir/
|
||||
|
||||
L'arborescence complète des fichiers est figurée ci-dessous :
|
||||
.
|
||||
|-- COPYING
|
||||
|-- INSTALL
|
||||
|-- Makefile
|
||||
|-- README
|
||||
|-- doc
|
||||
| |-- Doxyfile
|
||||
| |-- Makefile
|
||||
| |-- doxydir
|
||||
| | `-- html
|
||||
| | |-- ...
|
||||
| | `-- (fichiers de documentation source)
|
||||
| |-- enonce
|
||||
| | `-- chocobar.ps.gz
|
||||
| `-- rapport
|
||||
| |-- Makefile
|
||||
| `-- doc.txt
|
||||
|-- io
|
||||
| |-- ChocoBar5X5.txt
|
||||
| |-- ChocoBar5X8.txt
|
||||
| |-- ChocoBar8X5.txt
|
||||
| |-- Random5X5.txt
|
||||
| |-- Random5X8.txt
|
||||
| |-- Random8X5.txt
|
||||
| |-- Winning5X5.txt
|
||||
| |-- Winning5X8.txt
|
||||
| `-- Winning8X5.txt
|
||||
|-- lib
|
||||
| |-- JSAP_1.03a.jar
|
||||
| `-- java-getopt-1.0.10.jar
|
||||
| `-- java-getopt-1.0.10.jar
|
||||
`-- src
|
||||
|-- ChocoBarLite
|
||||
|-- ChocoBarLite-bench
|
||||
|-- ChocoBarLite-jmp
|
||||
|-- ChocoBarLite-prof
|
||||
|-- ChocoBarLite.java
|
||||
|-- Makefile
|
||||
|-- TODO
|
||||
|-- chocobar
|
||||
| |-- GenericChocoGraph.java
|
||||
| |-- bpl
|
||||
| | |-- BreakPointList.java
|
||||
| | |-- CBLGlobal.java
|
||||
| | |-- ChocoBar.java
|
||||
| | |-- ChocoBarSet.java
|
||||
| | |-- ChocoBarSetNode.java
|
||||
| | |-- ChocoGraph.java
|
||||
| | |-- EdgeListModel.java
|
||||
| | |-- EdgeMatrixModel.java
|
||||
| | |-- EdgeModel.java
|
||||
| | |-- Graph.java
|
||||
| | |-- IntPoint.java
|
||||
| | |-- BreakPointList.java
|
||||
| | |-- CBLGlobal.java
|
||||
| | |-- ChocoBar.java
|
||||
| | |-- ChocoBarSet.java
|
||||
| | |-- ChocoBarSetNode.java
|
||||
| | |-- ChocoGraph.java
|
||||
| | |-- EdgeListModel.java
|
||||
| | |-- EdgeMatrixModel.java
|
||||
| | |-- EdgeModel.java
|
||||
| | |-- Graph.java
|
||||
| | |-- IntPoint.java
|
||||
| | `-- VerticeSet.java
|
||||
| `-- combi
|
||||
| |-- BitSet.java
|
||||
| |-- ChocoBar.java
|
||||
| |-- ChocoBarArray.java
|
||||
| |-- ChocoBarBigInt.java
|
||||
| |-- ChocoBarLong.java
|
||||
| |-- ChocoBarSet.java
|
||||
| |-- ChocoGraph.java
|
||||
| |-- EdgeBigIntModel.java
|
||||
| |-- EdgeBitSetModel.java
|
||||
| |-- EdgeListModel.java
|
||||
| |-- EdgeMatrixModel.java
|
||||
| |-- EdgeModel.java
|
||||
| |-- Graph.java
|
||||
| `-- VerticeSet.java
|
||||
|-- conf
|
||||
| `-- ChocoConfig.java
|
||||
|-- exception
|
||||
| |-- AlreadyBrokenPointException.java
|
||||
| |-- OutOfRangeBreakPointException.java
|
||||
| `-- OutOfRangeVerticeException.java
|
||||
|-- exemple1.txt
|
||||
|-- graph
|
||||
| |-- EdgeModel.java
|
||||
| |-- GenericGraph.java
|
||||
| |-- Vertice.java
|
||||
| `-- VerticeSet.java
|
||||
|-- jeu
|
||||
| |-- Simulation.java
|
||||
| `-- Strategy.java
|
||||
|-- tags
|
||||
|-- testGraph.txt
|
||||
|-- testStrategy.txt
|
||||
`-- utils
|
||||
`-- BitSet.java
|
||||
|
1161
doc/Doxyfile
Normal file
1161
doc/Doxyfile
Normal file
File diff suppressed because it is too large
Load diff
11
doc/Makefile
Normal file
11
doc/Makefile
Normal file
|
@ -0,0 +1,11 @@
|
|||
### Make file du projet CBL
|
||||
### HEADER HERE
|
||||
###
|
||||
|
||||
all: doxygen
|
||||
|
||||
doxygen:
|
||||
doxygen
|
||||
|
||||
clean:
|
||||
@rm -Rf doxydir
|
BIN
doc/enonce/chocobar.ps.gz
Normal file
BIN
doc/enonce/chocobar.ps.gz
Normal file
Binary file not shown.
5
doc/rapport/Makefile
Normal file
5
doc/rapport/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
|
||||
all:
|
||||
|
||||
clean:
|
||||
# do nothing, expect nothing
|
509
doc/rapport/doc.txt
Normal file
509
doc/rapport/doc.txt
Normal file
|
@ -0,0 +1,509 @@
|
|||
STRUCTURES DES DONNEES
|
||||
----------------------
|
||||
|
||||
Un GRAPHE est représenté par soit une liste d'adjacence soit une matrice
|
||||
d'adjacence. Une matrice d'adjacence est un tableau à 2 dimension contenant des
|
||||
booléens tandis qu'une liste d'adjacence est un tableau de hash dont chacun
|
||||
contenant comme clés les sommets atteints.
|
||||
|
||||
Un CHOCOBAR est représenté par plusieurs façons différentes afin de pouvoir
|
||||
comparer les méthodes plus efficaces d'une implémentation aux autres.
|
||||
a/ Par une liste des "points de ruptures".
|
||||
b/ Par un tableau d'entiers de 8 bits.
|
||||
c/ Par un entier de 64-bit.
|
||||
|
||||
Une STRATEGIE est un tableau d'entiers, un entier x indexé à la position i du
|
||||
tableau signifie que si le joueur concerné se trouve à la configuration i alors
|
||||
il doit choisir la configuration x comme son coup.
|
||||
|
||||
Une STRATEGIE GAGNANTE est une stratégie d'un joueur qui effectue le PREMIER
|
||||
coup et celle-ci garantit que quel que soit les états choisis par l'adversaire
|
||||
alors l'adversaire perdra.
|
||||
|
||||
REMARQUE SUR LES DIFFERENTES IMPLEMENTATIONS DE CHOCHOBAR
|
||||
---------------------------------------------------------
|
||||
|
||||
Il est évident que ces trois différentes implémentations ne distinguent que la
|
||||
manière de générer le graphe de jeu : vitesse de construction du graphe et
|
||||
espace occupé pour cette génération.
|
||||
|
||||
a/ Un POINT DE RUPTURE est une paire d'entiers représentant un point à partir du
|
||||
duquel tous les carrés à droite et en bas de ceci sont déjà mangés. Un état de
|
||||
jeu peut en effet contenir plusieurs point de ruptures.
|
||||
|
||||
L'espace occupé par un état de jeu est alors au pire = taille 2 entiers X nombre
|
||||
de colonnes de la barre de chocolat car une barre de chocolat ne peut pas avoir
|
||||
plus que (nombre de colonnes) point de ruptures.
|
||||
|
||||
Cette implémentation est réalisée par Glenn ROLLAND.
|
||||
|
||||
b/ Un TABLEAU DE CHAR. Un état de jeu est alors représenté par une liste
|
||||
d'entiers marquant les carrés mangés de chaque colonne de la barre de chocolat.
|
||||
Afin d'avoir un entier de 8 bits on utiliser le type char de Java.
|
||||
|
||||
Ceci dit, l'espace occupé par un état de jeu = nombre de colonnes de la barre de
|
||||
chocolat X taille d'un entier.
|
||||
|
||||
Cette approche est réalisée par INDRAWATI.
|
||||
|
||||
c/ Un ENTIER DE 64-BIT. De même principe qu'en (b) on stocke toujours le nombre
|
||||
de carrés mangés de chaque colonne mais au lieu d'utiliser un tableau alors on
|
||||
utilise un entier de 64 bits pour "cartographier" ces colonnes.
|
||||
|
||||
Cette approche est réalisée par INDRAWATI.
|
||||
|
||||
Dans ce cas, un état de jeu prend un espace de taille un entier de 64 bits.
|
||||
|
||||
Cette dernière implémentation a rendu possible la génération de configuration de
|
||||
jeu de taille assez grande puisque l'on a aucun espace perdu pour créer les
|
||||
états : pour une barre de taille (mxn) alors un "cartographie" un état par un
|
||||
tableau de n entiers en base(m+1). Ceci dit, la taille maximale de barre de
|
||||
chocolat que l'on peut calculer est de (mxn) telle que (m+1)^n <= 2^64.
|
||||
|
||||
On estime que cette taille est suffisante puisque lors des tests on a trouvé que
|
||||
de toute façon sans dépasser cette limitation on n'a pas assez d'espace de
|
||||
mémoire pour stocker notre graphe (avec liste d'adjacence ni matrice
|
||||
d'adjacence), on ne risque donc en aucun cas d'être bloqué à cause de la
|
||||
structure de données de ChocoBar.
|
||||
|
||||
GENERATION DE GRAPHE
|
||||
--------------------
|
||||
|
||||
Afin d'économiser l'espace de mémoire utilisé au cours du déroulement de
|
||||
programme, on supprime la liste des états une fois que le graphe du jeu aura été
|
||||
généré.
|
||||
|
||||
a/ Avec une liste de POINTS DE RUPTURES
|
||||
|
||||
L'algorithme a été implémenté par Glenn ROLLAND.
|
||||
|
||||
Il s'agit d'un algorithme récursif dans lequel on génère en une seule passe les
|
||||
états et le graphe. On commence par une ChocoBar vide, et on "mange"
|
||||
récursivement les points inférieurs droits jusqu'à atteindre le sommet
|
||||
supérieur gauche.
|
||||
|
||||
On définit dans la suite de cette section le type ChocoBar comme une liste de
|
||||
couples d'entiers. On considèrera de plus que les variables E et V sont
|
||||
globales.
|
||||
|
||||
D'autre part, dans le pseudo-code suivant, le chocobar et son index seront
|
||||
confondus, mais dans notre implémentation, le temps de calcul de l'index d'un
|
||||
chocobar donné est en O(min(m,n)). La récupération du chocobar correpondant à
|
||||
un index se fait en temps constant. Chaque ajout d'élément à l'ensemble V du
|
||||
graphe nécessite le calcul de l'index du chocobar. De même, chaque
|
||||
vérification d'existance d'un élément dans V nécessite ce calcul.
|
||||
|
||||
Cette implémentation nécessite de maintenir aussi bien une liste des sommets
|
||||
incidents que des sommets adjactents à un sommet donné pour avoir une
|
||||
complexité en temps petite.
|
||||
|
||||
|
||||
Pour commencer, voici quelques fonctions simples dont le détail ne sera pas donné:
|
||||
|
||||
chocobar.addBreakPoint(m,n)
|
||||
// fonction qui ajoute le breakpoint (m,n) à la liste des points (triés) du
|
||||
// chocobar en un temps O(min(m,n)), soit O(n)
|
||||
|
||||
chocobar.getBreakLine()
|
||||
// fonction qui renvoie la ligne frontiere entre la partie mangée et la
|
||||
// partie non-mangée de la tablette de chocolat. Les points de la liste
|
||||
// sont des carrés non-mangés et incluent les bordures inférieure et droite
|
||||
// de la tablette lorsque celle-ci est pleine. Elle se calcule
|
||||
// en O(m+n), ce qui est équivalent à O(n)
|
||||
|
||||
chocobar.equals(c)
|
||||
// fonction qui compare les deux listes de points de chocobar et c
|
||||
// Sa temps de calcul est min(m,n), soit une complexité de O(n)
|
||||
|
||||
Et ensuite les fonctions permettant la génération du graphe et des états:
|
||||
|
||||
global (V,E) <- (vide,vide)
|
||||
global etatInitial <- vide
|
||||
global etatFinal <- vide
|
||||
|
||||
//fonction d'initialisation de la génération du graphe
|
||||
debut genChoco(m: entier, n:entier)
|
||||
etatInitial <- ChocoBar(m, n)
|
||||
V <- etatInitial
|
||||
genChocoFromPoint(etatInitial,m-1,n-1)
|
||||
renvoyer configGraph
|
||||
fin genChoco
|
||||
|
||||
Comme on le constate, genChoco ne fait que l'initialisation du graphe
|
||||
avec l'état initial et aucun arc, suivi d'un appel à la fonction
|
||||
récursive genChocoFromPoint.
|
||||
La complexité de genChoco est donc égale à celle de O(genChocoFromPoint)
|
||||
plus une constante.
|
||||
|
||||
|
||||
//fonction qui construit une configuration de jeu à partir d'un état donné
|
||||
//en mangeant le carré de coordonnées (m, n)
|
||||
debut genChocoFromPoint(oldCBar: ChocoBar, m: entier, n: entier)
|
||||
currentCBar <- oldCBar
|
||||
currentCBar.addBreakPoint(m, n) //on mange le carré (m, n)
|
||||
si currentCBar = Exception "déja mangé" alors
|
||||
sortir
|
||||
fin si
|
||||
si currentCBar = Exception "invalide" alors
|
||||
sortir
|
||||
fin si
|
||||
si V inclus currentCBar alors
|
||||
E <- E U {(oldCBar,currentCBar)}
|
||||
retourner
|
||||
sinon
|
||||
V <- V U {currentCBar}
|
||||
si isFinalConfig(currentCBar) alors
|
||||
etatFinal <- currentCBar
|
||||
fin si
|
||||
constructArcsFromAncestorsTo(oldCBar,currentCBar) ***** expliquer *****
|
||||
frontline <- chocobar.getBreakLine()
|
||||
pour chaque p=(x,y) dans frontline, faire
|
||||
genChocoFromPoint(currentCBar,x,y)
|
||||
fin pour
|
||||
fin si
|
||||
fin genChocoFromPoint
|
||||
|
||||
Cette fonction va s'appeller récursivement |V| fois (pour chaque
|
||||
chocobar possible) au total. Chaque appel de la fonction coûte
|
||||
O(addBreakpoint)+ O(V inclus currentCBar) + O(isFinalConfig) +
|
||||
O(constructArcsFromAncestorsTo) + O(breakline).
|
||||
Or isFinalConfig est une fonction qui teste en temps constant
|
||||
si la configuration est la chocobar à 1 élément dans le coin
|
||||
supérieur gauche.
|
||||
|
||||
|
||||
// fonction qui dit si sonCB est une configuration accessible à
|
||||
// partir de fatherCB
|
||||
debut isNextOf(fatherCB,sonCB) : booleen
|
||||
pour chaque p=(i,j) appartenant à la liste de breakpoint de sonCB
|
||||
fatherCopy <- fatherCB
|
||||
fatherCopy.addBreakPoint(i,j)
|
||||
si fatherCopy = father alors
|
||||
retourner vrai
|
||||
sinon
|
||||
retourner faux
|
||||
fin si
|
||||
fin isNextOf
|
||||
|
||||
La vérification de l'accessibilité d'un état à partir d'un autre
|
||||
nécessite |sonCB| ajouts de breakpoints suivi de comparaisons de listes.
|
||||
Or |sonCB| = min(m,n), O(addBreakPoint)=O(n) et O(equals)=O(n).
|
||||
On a donc O(isNextOf) = O(n^3)
|
||||
|
||||
|
||||
// fonction qui remplit le graphe à partir d'une configuration vers
|
||||
// tous ses ancetres possibles...
|
||||
debut constructArcsFromAncestorsTo(fatherCB: ChocoBar, sonCB:ChocoBar)
|
||||
si isNextOf(fatherCB,sonCB) alors
|
||||
E <- E U {(fatherCB,sonCB)}
|
||||
pour tout ancetreCB appartenant à incident fatherCB dans V,
|
||||
faire
|
||||
constructArcsFromAncestorsTo(ancetreCB,sonCB)
|
||||
fin pour
|
||||
sinon
|
||||
retourner
|
||||
fin si
|
||||
fin constructArcsFromAncestorsTo
|
||||
|
||||
La somme du nombre d'ancetreCB trouvés sur tous les appels de
|
||||
constructArcsFromAncestorsTo est |V|, et pour chacun d'eux on appelle
|
||||
isNextOf. La complexité d'un appel (récursif) à cette fonction
|
||||
est donc de |V|*O(isNextOf), soit O( |V| * n^3 ).
|
||||
|
||||
|
||||
La complexité totale de la construction du graphe et des états est donc égale à
|
||||
O(genChocoFromPoint)
|
||||
= |V| * ( O(addBreakpoint)+ O(V inclus currentCBar) +
|
||||
O(isFinalConfig) + O(constructArcsFromAncestorsTo) + O(breakline) )
|
||||
= O( |V| * ( n + |V|*n^3 + n))
|
||||
= O( (n^3) * (|V|^2) + (|V|*n) )
|
||||
|
||||
|
||||
b/ Avec un tableau de ENTIER de 8BIT
|
||||
|
||||
L'algorithme a été implémenté par INDRAWATI.
|
||||
|
||||
On génère d'abord toutes les configurations possibles du jeu de ChocoBar de
|
||||
taille (m x n) avec m le nombre de lignes et n lenombre de colonnes : c'est
|
||||
une génération d'une suite d'entiers de longueur n en ordre lexicographique
|
||||
particulier.
|
||||
|
||||
genChoco(m: entier, n: entier)
|
||||
V <- genEtat(m, n)
|
||||
E <- vide
|
||||
pour i de 0 à longeur(V) faire
|
||||
pour j de i+1 à longeur(V) faire
|
||||
si estFils(V[j], V[i]) alors
|
||||
E <- E U {(i, j)}
|
||||
fin si
|
||||
fin pour
|
||||
fin pour
|
||||
renvoyer (V, E) //c'est notre graphe
|
||||
|
||||
genEtat(m: entier, n: entier)
|
||||
pour i de 0 à (n-1) faire
|
||||
init[i] <- 0
|
||||
final[i] <- m
|
||||
fin pour
|
||||
etatCourant <- init
|
||||
tabEtat[0] <- init
|
||||
i <- 1
|
||||
etatFinal <- final
|
||||
tant que etatCourant != etatFinal faire
|
||||
pour j de 0 à (n-1) faire
|
||||
gen[j] <- etatCourant[j]
|
||||
fin pour
|
||||
gen[n-1] <- gen[n-1] + 1
|
||||
si gen[n-1] > m alors
|
||||
retenue <- vrai
|
||||
fin si
|
||||
j <- (n-1)
|
||||
tant que (gen[j] > m) faire
|
||||
si j=0 alors
|
||||
arreter tant que
|
||||
fin si
|
||||
gen[j-1] <- gen[j-1] + 1
|
||||
j <- (j - 1)
|
||||
fin tant que
|
||||
si retenue est vrai alors
|
||||
pour cpt de j à (n-1) faire
|
||||
gen[cpt] <- gen[j]
|
||||
fin pour
|
||||
fin si
|
||||
etatCourant <- gen
|
||||
tabEtat[i] <- gen
|
||||
i <- i+1
|
||||
fin tant que
|
||||
tabEtat[i] <- etatFinal
|
||||
renvoyer tabEtat
|
||||
|
||||
estFils(fils: tableau d'entiers, pere: tableau d'entiers)
|
||||
eaten <- -1
|
||||
pour i de 0 à longeur(fils) faire
|
||||
si fils[i] < pere[i] alors
|
||||
renvoyer faux
|
||||
fin si
|
||||
si eaten = -1 alors
|
||||
si fils[i] = pere[i] alors
|
||||
continuer
|
||||
sinon
|
||||
eaten <- i
|
||||
fin si
|
||||
sinon si pere[i] != fils[i] et fils[i] != eaten alors
|
||||
renvoyer faux
|
||||
fin si
|
||||
fin pour
|
||||
si eaten != -1 alors
|
||||
renvoyer vrai // fils est bien un etat suivant du pere
|
||||
sinon
|
||||
renvoyer faux // pere identique au fils
|
||||
fin si
|
||||
|
||||
Soit la taille de la barre de chocolat du jeu est de m lignes et n colonnes
|
||||
et on souhaite générer tous les états possibles dont chacun nous coûte O(n) en
|
||||
temps. Ceci fera un total de O(n*|V|). De même pour la complexité en espace
|
||||
puisqu'un état est décrit par n entiers.
|
||||
|
||||
Pour vérifier si un état peut être atteint à partir d'un autre état donné alors
|
||||
on doit comparer les 2n entiers décrivant ces deux états. Une comparaison coûte
|
||||
donc O(n).
|
||||
|
||||
Etant donné que les états sont générés en ordre lexicographique alors on est sûr
|
||||
que les candidats des états adjacents à un état indexé par i sont ceux indexé
|
||||
par des entiers supérieur i. Le nombre de vérifications qu'il faut effectuer
|
||||
sont alors = somme des entiers de 1 à |V| = 1/2
|
||||
* |V| * (|V|+1). Chacune de ces vérifications coûte O(n), la construction des
|
||||
arêtes coûte en total O(n*(|V|^2)).
|
||||
|
||||
Tout cela conduit à un coût total en temps de génération de graphe en
|
||||
O(n*(|V|^2))+O(n*|V|).
|
||||
|
||||
ATTENTION: A la fin de génération de graphe on supprime la liste des
|
||||
configurations, il nous reste que l'espace occupé par la matrice d'adjacence ou
|
||||
la liste d'adjacence du graphe.
|
||||
|
||||
c/ Avec un ENTIER de 64BIT
|
||||
|
||||
C'est le même algo que pour le b/.
|
||||
|
||||
PARTIE DE JEU
|
||||
-------------
|
||||
|
||||
Cet algorithme a été concu par INDRAWATI.
|
||||
|
||||
// C'est une fonction de simulation qui affiche le déroulement de jeu
|
||||
// selon stratégie des deux joueurs
|
||||
simulation(G: graphe, SA: strategie de A, SB: strategie de B)
|
||||
courant <- etat initial de G
|
||||
final <- etat final de G
|
||||
tant que courant != final faire
|
||||
coupA <- SA[courant]
|
||||
afficher "A a bougé vers coupA"
|
||||
si coupA == final alors
|
||||
afficher "A a perdu"
|
||||
quitter
|
||||
fin si
|
||||
courant <- SB[coupA]
|
||||
afficher "B a bougé vers courant"
|
||||
fin tant que
|
||||
afficher "B a perdu"
|
||||
|
||||
En terme de complexité, ici on considère plutôt en temps puisque l'espace
|
||||
utilisé est statique : par définition de STRATEGIE il est égal au nombre des
|
||||
sommets du graphe, donc O(|V|).
|
||||
|
||||
En ce qui concerne de temps, au pire des cas on parcourt le chemin de longueur
|
||||
maximale de l'état intial vers l'état final. Ce chemin dépendra, à son tour, du
|
||||
graphe de jeu (peut-être donné par l'utilisateur, ce n'est donc pas
|
||||
déterministe), tout ce que l'on sait c'est que ce chemin < |V|.
|
||||
|
||||
TEST DE STRATEGIE
|
||||
-----------------
|
||||
|
||||
Cet algorithme a été écrit par INDRAWATI.
|
||||
|
||||
// C'est une fonction qui teste si S est une stratégie gagnante ou non
|
||||
isWinningStrategy(G: graphe, S: strategie)
|
||||
courant <- etat initial de G
|
||||
final <- etat final de G
|
||||
etatsATraiter <- {courant}
|
||||
etatsTraites <- vide
|
||||
tant que etatsATraiter != vide faire
|
||||
etat <- enfiler etatsATraiter
|
||||
si etat == final alors
|
||||
continuer
|
||||
fin si
|
||||
etatsTraites <- etatsTraites U {etat}
|
||||
coup <- S[etat]
|
||||
si coup == final
|
||||
renvoyer faux
|
||||
fin si
|
||||
advers <- les sommets adjacents à coup
|
||||
pour les sommets i contenus dans advers faire
|
||||
si i n'est pas contenu dans etatsTraites alors
|
||||
etatsATraiter <- etatsATraiter U {i}
|
||||
fin si
|
||||
fin pour
|
||||
fin tant que
|
||||
renvoyer vraie
|
||||
|
||||
En espace on sait qu'à tout moment un sommet est contenu soit dans l'ensemble
|
||||
etatsATraiter soit dans l'ensemble etatsTraites, l'espace occupé est alors egal
|
||||
au nombre des sommets du graphe. L'espace occupé est alors O(|E|).
|
||||
|
||||
En temps, on sait que l'on visite tous les coups possibles de l'adversaire et on
|
||||
ne visite qu'un coup quand c'est notre tour. Ceci dit, on ne visite qu'une
|
||||
partie des sommets du graphe. La complexité est alors inférieure à O(|V|).
|
||||
|
||||
REMARQUE : x->y
|
||||
x->z
|
||||
x->t
|
||||
On ne peut prédire combien d'arrêtes que l'on a à chaque sommet puisque le
|
||||
graphe peut être donné par l'utilisateur et le sommet choisi est également
|
||||
décidé par l'utilisateur.
|
||||
|
||||
CONSTRUCTION DE STRATEGIE GAGNANTE
|
||||
----------------------------------
|
||||
|
||||
Cet algorithme a été écrit par INDRAWATI.
|
||||
|
||||
L'approche choisie est de trouver le chemin gagnant le PLUS COURT partant de
|
||||
l'état initial vers l'état final. Ceci dit que la stratégie ne peut pas être
|
||||
appliquée à une simulation si le joueur qui lui est associée ne fait pas le
|
||||
PREMIER coup.
|
||||
|
||||
// C'est une fonction qui renvoie un tableau d'entiers (une stratégie gagnante)
|
||||
constructWinningStrategy(G: graphe)
|
||||
final <- etat final de G
|
||||
start <- etat initial de G
|
||||
sommetsATraiter <- vide
|
||||
pour i de 1 au ((nombre de sommets de G) - 1) faire
|
||||
S[i]=0
|
||||
sommetsATraiter <- sommetsATraiter U {sommet i}
|
||||
fin pour
|
||||
etatsGagnants <- {final}
|
||||
etatsPerdants <- vide
|
||||
tant que (S[start]==0) faire
|
||||
sommet <- tete de sommetsATraiter
|
||||
test_perdant <- withOnlyEdges(sommet, etatsGagnants, g)
|
||||
si test_perdant != -1 alors
|
||||
enfiler sommet de sommetsATraiter
|
||||
etatsPerdants <- etatsPerdants U {sommet}
|
||||
S[sommet] <- test_perdant
|
||||
nuvo <- les sommets ayant un arc vers le sommet sommet
|
||||
pour tout sommet i dans nuvo
|
||||
etatsGagnants <- etatsGagnants U {i}
|
||||
S[i] <- sommet
|
||||
fin pour
|
||||
pour tout sommet i dans sommetsATraiter faire
|
||||
si i est contenu dans nuvo
|
||||
enlever i de sommetsATraiter
|
||||
fin si
|
||||
fin pour
|
||||
fin si
|
||||
fin tant que
|
||||
renvoyer S
|
||||
|
||||
// C'est une fonction qui renvoie -1 si sommet src a au moins un sommet adjacent
|
||||
// qui n'est pas contenu dans dest
|
||||
withOnlyEdges(src: entier, dest: liste d'entiers, G: graphe)
|
||||
//si graphe est représenté par une matrice alors il faut parcourir
|
||||
//toute la ligne de src
|
||||
//si c'est une liste d'adjacence suffit de prendre la liste indexée par src
|
||||
adjacents <- {sommets adjacents à src}
|
||||
ret <- -1
|
||||
pour tout sommet i contenu dans adjacents faire
|
||||
si i n'est pas contenu dans dest alors
|
||||
renvoyer -1
|
||||
sinon si ret == -1 alors
|
||||
ret <- i
|
||||
fin si
|
||||
fin pour
|
||||
renvoyer ret
|
||||
|
||||
Par hypothèse du jeu de ChocoBar, on sait que le joueur qui commence est le
|
||||
gagnant et que l'on peut lui trouver une stratégie gagnante. Ceci veut dire que
|
||||
l'on arrivera à décider une suite des coups à partir de l'état initial vers
|
||||
l'état final en gagnant le jeu.
|
||||
|
||||
ATTENTION: Cet algo ne marche donc pas pour les graphes qui ne respectent pas
|
||||
les règles de ChocoBar.
|
||||
|
||||
On définit alors ETAT GAGNANT comme étant un état qui peut méner à un état
|
||||
perdant. En effet, si un joueur se trouve dans cet état alors il peut choisir
|
||||
son coup et logiquement il va choisir un état perdant pour le passer à son
|
||||
adversaire.
|
||||
|
||||
Un ETAT PERDANT, par contre, est l'état qui ne peut que mener aux états
|
||||
gagnants. C'est l'état dans lequel on souhaite placer l'adversaire afin de
|
||||
bloquer ses choix.
|
||||
|
||||
Donc, partant de l'état final de jeu, on sait que celui qui trouve cet état
|
||||
avant de décider de jouer est le gagnant, l'état final est donc un sommet
|
||||
gagnant. A chaque itération on essaie de trouver un ou plusieurs états perdants.
|
||||
Au pire des cas on ne trouve qu'un état perdant que l'on enlèvera de l'ensemble
|
||||
des états à traiter. On en enlèvera également les états gagnants obtenus à
|
||||
partir de cet état perdant. Ce "backtracking" est effectué jusqu'au début du
|
||||
graphe (état initial).
|
||||
|
||||
Naïvement on peut dire que l'on a, à chaque étape d'itération, au moins un état
|
||||
perdant et un état gagnant (car cet état perdant provient surement d'un autre
|
||||
coup) et d'un coup on enlève ces deux états (au pire) de l'ensemble restant à
|
||||
traiter et on doit faire donc 1/2 * (|V|) itérations dans le pire des cas. A
|
||||
chaque itération on visite tous les états non traités jusqu'à ce que l'on trouve
|
||||
un état perdant. Ceci dit qu'au maximal on effectue O(|V|^2 + |V|) visites.
|
||||
|
||||
Or, en réalité on s'arrête beaucoup plus tôt car dès que l'on puisse décider
|
||||
quel coup à choisir à partir de l'état intial alors on s'arrête car on a déjà
|
||||
trouvé le chemin gagnant le plus court partant du début de jeu. Ce chemin se
|
||||
composera uniquement par un ensemble d'arrêtes de la forme (etat_gagnant -> etat
|
||||
perdant).
|
||||
|
||||
Il existe des états non traités à la sortie de cet algo. Ce sont des états par
|
||||
lesquels on ne passera jamais car quand on a plusieurs choix (tous perdants)
|
||||
à partir d'un sommet gagnant alors on doit quand même en choisir qu'un seul
|
||||
(par définition de STRATEGIE).
|
||||
|
||||
En terme de l'espace occupé on en a besoin de O(|V|) : |V| pour stocker la
|
||||
stratégie sous forme d'un tableau et |V| pour stocker les états non-traités +
|
||||
les états traités (états perdants + états gagnants = tous les etats).
|
257
io/ChocoBar5X5.txt
Normal file
257
io/ChocoBar5X5.txt
Normal file
|
@ -0,0 +1,257 @@
|
|||
ChocoBar5X5
|
||||
252
|
||||
0
|
||||
9
|
||||
0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1
|
||||
0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1
|
||||
0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0
|
||||
0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0
|
||||
|
1292
io/ChocoBar5X8.txt
Normal file
1292
io/ChocoBar5X8.txt
Normal file
File diff suppressed because it is too large
Load diff
1292
io/ChocoBar8X5.txt
Normal file
1292
io/ChocoBar8X5.txt
Normal file
File diff suppressed because it is too large
Load diff
254
io/Random5X5.txt
Normal file
254
io/Random5X5.txt
Normal file
|
@ -0,0 +1,254 @@
|
|||
252
|
||||
133
|
||||
132
|
||||
237
|
||||
4
|
||||
188
|
||||
8
|
||||
60
|
||||
20
|
||||
10
|
||||
-1
|
||||
9
|
||||
10
|
||||
10
|
||||
9
|
||||
16
|
||||
9
|
||||
9
|
||||
16
|
||||
15
|
||||
21
|
||||
16
|
||||
12
|
||||
13
|
||||
14
|
||||
17
|
||||
13
|
||||
8
|
||||
18
|
||||
41
|
||||
8
|
||||
9
|
||||
16
|
||||
30
|
||||
9
|
||||
30
|
||||
31
|
||||
21
|
||||
13
|
||||
8
|
||||
35
|
||||
37
|
||||
8
|
||||
33
|
||||
48
|
||||
19
|
||||
31
|
||||
32
|
||||
22
|
||||
29
|
||||
24
|
||||
25
|
||||
49
|
||||
42
|
||||
43
|
||||
48
|
||||
46
|
||||
47
|
||||
41
|
||||
55
|
||||
61
|
||||
51
|
||||
55
|
||||
63
|
||||
28
|
||||
14
|
||||
30
|
||||
11
|
||||
32
|
||||
13
|
||||
72
|
||||
35
|
||||
65
|
||||
37
|
||||
23
|
||||
39
|
||||
13
|
||||
77
|
||||
75
|
||||
80
|
||||
80
|
||||
70
|
||||
67
|
||||
65
|
||||
85
|
||||
49
|
||||
50
|
||||
87
|
||||
85
|
||||
78
|
||||
80
|
||||
81
|
||||
85
|
||||
89
|
||||
58
|
||||
63
|
||||
26
|
||||
87
|
||||
114
|
||||
107
|
||||
65
|
||||
66
|
||||
100
|
||||
82
|
||||
73
|
||||
74
|
||||
75
|
||||
64
|
||||
77
|
||||
88
|
||||
89
|
||||
90
|
||||
105
|
||||
92
|
||||
107
|
||||
109
|
||||
95
|
||||
96
|
||||
118
|
||||
99
|
||||
120
|
||||
110
|
||||
91
|
||||
99
|
||||
113
|
||||
59
|
||||
122
|
||||
120
|
||||
62
|
||||
130
|
||||
119
|
||||
96
|
||||
132
|
||||
28
|
||||
64
|
||||
10
|
||||
9
|
||||
17
|
||||
135
|
||||
134
|
||||
135
|
||||
139
|
||||
134
|
||||
38
|
||||
12
|
||||
139
|
||||
133
|
||||
143
|
||||
43
|
||||
138
|
||||
139
|
||||
136
|
||||
82
|
||||
148
|
||||
84
|
||||
25
|
||||
152
|
||||
153
|
||||
53
|
||||
148
|
||||
90
|
||||
25
|
||||
155
|
||||
146
|
||||
158
|
||||
95
|
||||
160
|
||||
6
|
||||
173
|
||||
133
|
||||
135
|
||||
46
|
||||
47
|
||||
142
|
||||
143
|
||||
50
|
||||
106
|
||||
156
|
||||
157
|
||||
142
|
||||
55
|
||||
179
|
||||
179
|
||||
58
|
||||
163
|
||||
60
|
||||
146
|
||||
194
|
||||
177
|
||||
168
|
||||
179
|
||||
189
|
||||
192
|
||||
162
|
||||
183
|
||||
60
|
||||
165
|
||||
198
|
||||
183
|
||||
188
|
||||
61
|
||||
211
|
||||
206
|
||||
134
|
||||
169
|
||||
140
|
||||
203
|
||||
208
|
||||
136
|
||||
137
|
||||
155
|
||||
176
|
||||
216
|
||||
214
|
||||
159
|
||||
144
|
||||
213
|
||||
146
|
||||
201
|
||||
164
|
||||
146
|
||||
186
|
||||
157
|
||||
202
|
||||
213
|
||||
203
|
||||
202
|
||||
162
|
||||
221
|
||||
194
|
||||
226
|
||||
131
|
||||
163
|
||||
218
|
||||
226
|
||||
235
|
||||
237
|
||||
237
|
||||
223
|
||||
224
|
||||
225
|
||||
210
|
||||
242
|
||||
243
|
||||
229
|
||||
230
|
||||
246
|
||||
242
|
||||
240
|
||||
251
|
||||
236
|
||||
239
|
||||
240
|
||||
|
1289
io/Random5X8.txt
Normal file
1289
io/Random5X8.txt
Normal file
File diff suppressed because it is too large
Load diff
1289
io/Random8X5.txt
Normal file
1289
io/Random8X5.txt
Normal file
File diff suppressed because it is too large
Load diff
254
io/Winning5X5.txt
Normal file
254
io/Winning5X5.txt
Normal file
|
@ -0,0 +1,254 @@
|
|||
252
|
||||
133
|
||||
133
|
||||
133
|
||||
133
|
||||
133
|
||||
119
|
||||
59
|
||||
26
|
||||
10
|
||||
-1
|
||||
9
|
||||
10
|
||||
10
|
||||
10
|
||||
16
|
||||
10
|
||||
15
|
||||
16
|
||||
16
|
||||
21
|
||||
16
|
||||
17
|
||||
21
|
||||
25
|
||||
21
|
||||
13
|
||||
19
|
||||
25
|
||||
42
|
||||
32
|
||||
10
|
||||
16
|
||||
17
|
||||
32
|
||||
35
|
||||
30
|
||||
35
|
||||
35
|
||||
35
|
||||
35
|
||||
35
|
||||
42
|
||||
13
|
||||
48
|
||||
47
|
||||
35
|
||||
32
|
||||
45
|
||||
45
|
||||
32
|
||||
47
|
||||
48
|
||||
47
|
||||
55
|
||||
55
|
||||
45
|
||||
55
|
||||
55
|
||||
55
|
||||
53
|
||||
55
|
||||
55
|
||||
80
|
||||
74
|
||||
68
|
||||
10
|
||||
16
|
||||
32
|
||||
13
|
||||
64
|
||||
35
|
||||
21
|
||||
68
|
||||
74
|
||||
70
|
||||
74
|
||||
74
|
||||
74
|
||||
80
|
||||
80
|
||||
45
|
||||
80
|
||||
80
|
||||
80
|
||||
80
|
||||
80
|
||||
26
|
||||
68
|
||||
93
|
||||
80
|
||||
80
|
||||
80
|
||||
93
|
||||
90
|
||||
59
|
||||
26
|
||||
93
|
||||
0
|
||||
106
|
||||
101
|
||||
80
|
||||
100
|
||||
101
|
||||
48
|
||||
101
|
||||
68
|
||||
64
|
||||
68
|
||||
0
|
||||
111
|
||||
101
|
||||
100
|
||||
106
|
||||
111
|
||||
59
|
||||
106
|
||||
111
|
||||
126
|
||||
119
|
||||
100
|
||||
101
|
||||
111
|
||||
119
|
||||
93
|
||||
126
|
||||
126
|
||||
107
|
||||
0
|
||||
119
|
||||
119
|
||||
126
|
||||
133
|
||||
133
|
||||
64
|
||||
10
|
||||
16
|
||||
32
|
||||
68
|
||||
133
|
||||
35
|
||||
21
|
||||
0
|
||||
133
|
||||
74
|
||||
25
|
||||
133
|
||||
42
|
||||
133
|
||||
133
|
||||
80
|
||||
21
|
||||
47
|
||||
133
|
||||
0
|
||||
25
|
||||
133
|
||||
0
|
||||
0
|
||||
0
|
||||
55
|
||||
25
|
||||
26
|
||||
93
|
||||
59
|
||||
26
|
||||
0
|
||||
0
|
||||
133
|
||||
133
|
||||
0
|
||||
101
|
||||
47
|
||||
133
|
||||
0
|
||||
0
|
||||
133
|
||||
0
|
||||
0
|
||||
0
|
||||
55
|
||||
111
|
||||
0
|
||||
0
|
||||
59
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
119
|
||||
55
|
||||
0
|
||||
0
|
||||
0
|
||||
59
|
||||
0
|
||||
126
|
||||
0
|
||||
59
|
||||
0
|
||||
0
|
||||
0
|
||||
133
|
||||
133
|
||||
0
|
||||
0
|
||||
0
|
||||
133
|
||||
0
|
||||
0
|
||||
133
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
|
1289
io/Winning5X8.txt
Normal file
1289
io/Winning5X8.txt
Normal file
File diff suppressed because it is too large
Load diff
1289
io/Winning8X5.txt
Normal file
1289
io/Winning8X5.txt
Normal file
File diff suppressed because it is too large
Load diff
BIN
lib/JSAP_1.03a.jar
Normal file
BIN
lib/JSAP_1.03a.jar
Normal file
Binary file not shown.
BIN
lib/java-getopt-1.0.10.jar
Normal file
BIN
lib/java-getopt-1.0.10.jar
Normal file
Binary file not shown.
1
src/.cvsignore
Normal file
1
src/.cvsignore
Normal file
|
@ -0,0 +1 @@
|
|||
*.class
|
1
src/ChocoBarLite
Executable file
1
src/ChocoBarLite
Executable file
|
@ -0,0 +1 @@
|
|||
make run JVMOPTS="$*"
|
3
src/ChocoBarLite-bench
Executable file
3
src/ChocoBarLite-bench
Executable file
|
@ -0,0 +1,3 @@
|
|||
for i in 1 2 3; do
|
||||
time make run JVMOPTS="$*" > dump.$1
|
||||
done
|
1
src/ChocoBarLite-jmp
Executable file
1
src/ChocoBarLite-jmp
Executable file
|
@ -0,0 +1 @@
|
|||
time make jmp JVMOPTS="$*"
|
1
src/ChocoBarLite-prof
Executable file
1
src/ChocoBarLite-prof
Executable file
|
@ -0,0 +1 @@
|
|||
time make prof JVMOPTS="$*"
|
BIN
src/ChocoBarLite.class
Normal file
BIN
src/ChocoBarLite.class
Normal file
Binary file not shown.
241
src/ChocoBarLite.java
Normal file
241
src/ChocoBarLite.java
Normal file
|
@ -0,0 +1,241 @@
|
|||
import java.io.*;
|
||||
import java.text.*; // streamtokenizer
|
||||
|
||||
import java.lang.ClassNotFoundException;
|
||||
import java.lang.InstantiationException;
|
||||
import java.lang.IllegalAccessException;
|
||||
|
||||
import chocobar.GenericChocoGraph;
|
||||
import graph.GenericGraph;
|
||||
import conf.ChocoConfig;
|
||||
import jeu.Strategy;
|
||||
import jeu.Simulation;
|
||||
|
||||
/* command line parsing */
|
||||
import com.martiansoftware.jsap.*;
|
||||
import com.martiansoftware.jsap.stringparsers.*;
|
||||
|
||||
|
||||
public final class ChocoBarLite
|
||||
{
|
||||
/**
|
||||
* Fonction de test de représentation de graphe
|
||||
**/
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
JSAP jsap = new JSAP();
|
||||
|
||||
FlaggedOption opt;
|
||||
Switch sw;
|
||||
|
||||
sw = new Switch("graphgen") // true = génération du graphe à partir de la taill vérif
|
||||
.setShortFlag('g') // false = on prend le graphe du fichier en entrée
|
||||
.setLongFlag("graph");
|
||||
sw.setHelp("Générer le graphe sans fichier d'entrée.");
|
||||
jsap.registerParameter(sw);
|
||||
|
||||
sw = new Switch("strategy") // true = on gere la stratégie
|
||||
.setShortFlag('s') // false = on ne gère pas la stratégie
|
||||
.setLongFlag("strategy");
|
||||
sw.setHelp("Génération des stratégies. (il faut obligatoirement activer la génération de graphe avec ou sans fichiers)");
|
||||
jsap.registerParameter(sw);
|
||||
|
||||
sw = new Switch("simulate") // true = on gere la simulation
|
||||
.setShortFlag('m') // false = on ne gère pas la stratégie
|
||||
.setLongFlag("simulate");
|
||||
sw.setHelp("Gestion de la partie simulation. (implique -s)");
|
||||
jsap.registerParameter(sw);
|
||||
|
||||
sw = new Switch("verbose") // true = mode verbeux
|
||||
.setShortFlag('v') // false = normal
|
||||
.setLongFlag("verbose");
|
||||
sw.setHelp("Mode verbeux");
|
||||
jsap.registerParameter(sw);
|
||||
|
||||
opt= new FlaggedOption("cbmodel") // type de graphe
|
||||
.setStringParser(new StringStringParser())
|
||||
.setDefault("bpl.ChocoBar")
|
||||
.setRequired(false)
|
||||
.setLongFlag("cbmodel");
|
||||
opt.setHelp("Modèle de ChocoBar bpl.ChocoBar, combi.ChocoBarLong, combi.ChocoBarBigInt, combi.ChocoBarArray. (défaut: bpl.ChocoBar)");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
opt= new FlaggedOption("cbstyle") // type de graphe
|
||||
.setStringParser(new StringStringParser())
|
||||
.setDefault("bpl")
|
||||
.setRequired(false)
|
||||
.setLongFlag("cbstyle");
|
||||
opt.setHelp("Style de ChocoBar : bpl, combi. (défaut: combi)");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
opt= new FlaggedOption("edgemodel") // type de graphe
|
||||
.setStringParser(new StringStringParser())
|
||||
.setDefault("EdgeBigIntModel")
|
||||
.setRequired(false)
|
||||
.setLongFlag("edgemodel");
|
||||
opt.setHelp("Modèle d'Arc (edge) : EdgeBigIntModel, EdgeBitSetModel, EdgeListModel, EdgeMatrixModel.");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
|
||||
opt = new FlaggedOption("width") // largeur du chocobar
|
||||
.setStringParser(new IntegerStringParser())
|
||||
.setDefault("6")
|
||||
.setRequired(false)
|
||||
.setShortFlag('w')
|
||||
.setLongFlag("width");
|
||||
opt.setHelp("Largeur de la ChocoBar. (défaut 6)");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
opt = new FlaggedOption("height") // hauteur du chocobar
|
||||
.setStringParser(new IntegerStringParser())
|
||||
.setDefault("6")
|
||||
.setRequired(false)
|
||||
.setShortFlag('h')
|
||||
.setLongFlag("height");
|
||||
opt.setHelp("Hauteur de la ChocoBar. (défaut 6)");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
opt= new FlaggedOption("ginput") // fichier de graphe en entrée
|
||||
.setStringParser(new StringStringParser())
|
||||
.setDefault("")
|
||||
.setRequired(false)
|
||||
.setShortFlag('G')
|
||||
.setLongFlag("gpinput");
|
||||
opt.setHelp("Fichier de graphe en entrée.");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
|
||||
opt= new FlaggedOption("strategyA") // fichier de graphe en entrée
|
||||
.setStringParser(new StringStringParser())
|
||||
.setDefault("")
|
||||
.setRequired(false)
|
||||
.setShortFlag('A')
|
||||
.setLongFlag("strategyA");
|
||||
opt.setHelp("Fichier de stratégie pour le joueur A. (Elle sera générée au besoin sinon)");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
opt= new FlaggedOption("strategyB") // fichier de graphe en entrée
|
||||
.setStringParser(new StringStringParser())
|
||||
.setDefault("")
|
||||
.setRequired(false)
|
||||
.setShortFlag('B')
|
||||
.setLongFlag("strategyB");
|
||||
opt.setHelp("Fichier de stratégie pour le joueur B. (Elle sera générée au besoin sinon)");
|
||||
jsap.registerParameter(opt);
|
||||
|
||||
sw = new Switch("random") // La stratégie est aléatoire
|
||||
.setShortFlag('r')
|
||||
.setLongFlag("random");
|
||||
sw.setHelp("En cas de génération, le joueur A aura une statégie aléatoire. (Par défault elle est gagnante");
|
||||
jsap.registerParameter(sw);
|
||||
|
||||
JSAPResult config = jsap.parse(args);
|
||||
if (!config.success()) {
|
||||
System.err.println();
|
||||
for (java.util.Iterator errs = config.getErrorMessageIterator();
|
||||
errs.hasNext();) {
|
||||
System.err.println("Error: " + errs.next());
|
||||
}
|
||||
System.err.print("Usage: ChocoBarLite ");
|
||||
System.err.println(jsap.getUsage());
|
||||
System.err.println();
|
||||
// show full help as well
|
||||
System.err.println(jsap.getHelp());
|
||||
System.err.println();
|
||||
System.exit(1);
|
||||
} else {
|
||||
/* la ligne de commande est valide, on initialise donc les valeurs */
|
||||
ChocoConfig.size = config.getInt("width");
|
||||
ChocoConfig.height = config.getInt("height");
|
||||
ChocoConfig.chocoBarModel = config.getString("cbmodel");
|
||||
ChocoConfig.chocoBarStyle = config.getString("cbstyle");
|
||||
ChocoConfig.edgeModel = config.getString("edgemodel");
|
||||
|
||||
GenericChocoGraph c=null;
|
||||
try {
|
||||
// Recherche du bon ChocoGraph
|
||||
Class cCG = Class.forName("chocobar."+ChocoConfig.chocoBarStyle+".ChocoGraph");
|
||||
c = (GenericChocoGraph) cCG.newInstance();
|
||||
} catch (Exception e){
|
||||
System.err.println("ERREUR: Le modèle de graphe '"+ChocoConfig.chocoBarStyle+"' est inconnu.");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
try {
|
||||
GenericGraph g=null;
|
||||
if (config.getBoolean("graphgen")){
|
||||
g = c.genChoco(true);
|
||||
} else {
|
||||
if (!config.getString("ginput").equals("")){ // on vérifie si la chaine n'est pas vide...
|
||||
// On instancie le bon Graph
|
||||
Class cCG = Class.forName("chocobar."+ChocoConfig.chocoBarStyle+".Graph");
|
||||
g = (GenericGraph) cCG.newInstance();
|
||||
g.loadFromFile(config.getString("ginput"));
|
||||
}
|
||||
}
|
||||
if (g!=null){
|
||||
System.out.println("Fin de calcul du graphe");
|
||||
System.out.println(g.toDot());
|
||||
|
||||
Strategy a=null;
|
||||
Strategy b=null;
|
||||
if (config.getBoolean("strategy") || config.getBoolean("simulate")) {
|
||||
// On a demandé à gérer la partie stratégie
|
||||
|
||||
// Création de la stratégie de A
|
||||
a = new Strategy();
|
||||
|
||||
// A a-t-il une stratégie définie ?
|
||||
if ( config.getString("strategyA").equals("") ) {
|
||||
// Non. La stratégie de A est-elle aléatoire ?
|
||||
if (config.getBoolean("random")) {
|
||||
a.constructRandomStrategy(g);
|
||||
} else {
|
||||
a.constructWinningStrategy(g);
|
||||
}
|
||||
} else {
|
||||
// Oui, on lit donc la stratégie du fichier
|
||||
a.constructFromFile(config.getString("strategyA"));
|
||||
}
|
||||
|
||||
// Création de la stratégie de B
|
||||
b = new Strategy();
|
||||
|
||||
// B a-t-il une stratégie définie ?
|
||||
if ( config.getString("strategyB").equals("") ) {
|
||||
// B a forcément une statégie aléatoire
|
||||
b.constructRandomStrategy(g);
|
||||
} else {
|
||||
// Oui, on lit donc la stratégie du fichier
|
||||
b.constructFromFile(config.getString("strategyB"));
|
||||
}
|
||||
|
||||
// On affiche la stratégie de A
|
||||
a.display();
|
||||
}
|
||||
|
||||
if (config.getBoolean("simulate")) {
|
||||
// On a demandé à gérer la partie simulate
|
||||
// A et B ont déjà une stratégie (-m implique -s)
|
||||
Simulation.simulate(a, b, g);
|
||||
}
|
||||
} else {
|
||||
System.err.println("ERREUR: Aucun graphe généré. Impossible d'aller plus loin");
|
||||
System.err.println();
|
||||
System.err.print("Usage: ChocoBarLite ");
|
||||
System.err.println(jsap.getUsage());
|
||||
System.err.println();
|
||||
// show full help as well
|
||||
System.err.println(jsap.getHelp());
|
||||
System.err.println();
|
||||
System.exit(1);
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
64
src/Makefile
Normal file
64
src/Makefile
Normal file
|
@ -0,0 +1,64 @@
|
|||
### HEADER HERE
|
||||
## /ens/sighirea/Algo2/projet/...
|
||||
|
||||
# @CLASSPATH=$(CLASSPATH) $(JAVAC) $(JCFLAGS) $<
|
||||
|
||||
JAVAC=javac
|
||||
JAVADOC=javadoc -nonavbar
|
||||
JAVA=java
|
||||
#ORACLE_CLASSPATH:=../lib/rt.jar:../lib/classes12.zip:../lib/nls_charset12.zip
|
||||
USER_CLASSPATH:=$$CLASSPATH:/usr/share/java/mysql.jar:.:../bin:../lib:../lib/JSAP_1.03a.jar:../lib/java-getopt-1.0.10.jar
|
||||
|
||||
# Java Compiler Flags
|
||||
JCFLAGS+=-g -deprecation -O
|
||||
#-target 1.4
|
||||
|
||||
# JVM Flags
|
||||
JVM_MEM=-Xmx1g
|
||||
JVM_DEBUG+=-verbose:gc
|
||||
JVM_OPTIMIZE+=-server
|
||||
JVMFLAGS+=$(JVM_MEM) $(JVM_DEBUG) $(JVM_OPTIMIZE)
|
||||
|
||||
PRJNAME=ChocoBarLite
|
||||
GDATE := $(shell date +"-%Y-%m-%d_r%H")
|
||||
GFILENAME := ../$(PRJNAME)$(GDATE).tar.bz2
|
||||
LOCALDIR = $(shell pwd)
|
||||
#LINUX_THREADING+=#LD_ASSUME_KERNEL=2.4.1
|
||||
|
||||
JAVAFILES := $(shell ls *.java */*.java */*/*.java)
|
||||
CLASSFILES := $(patsubst %.java,%.class,$(JAVAFILES))
|
||||
|
||||
all: ctags build
|
||||
|
||||
doc:
|
||||
$(JAVADOC) -d ../doc/html $(JAVAFILES)
|
||||
|
||||
build : $(CLASSFILES)
|
||||
|
||||
clean:
|
||||
@echo -e "Cleaning..."
|
||||
@rm -vf *~ *.class */*.class */*/*.class
|
||||
|
||||
ctags:
|
||||
@echo -e "Generating CTAGS"
|
||||
@ctags -R
|
||||
|
||||
%.class : %.java
|
||||
@echo -e "JAVAC\t$<"
|
||||
@CLASSPATH=$(USER_CLASSPATH) $(JAVAC) $(JCFLAGS) $<
|
||||
|
||||
jmp:
|
||||
@echo -e "Profiling $(PRJNAME)..."
|
||||
@($(LINUX_THREADING) CLASSPATH=$(USER_CLASSPATH) $(JAVA) -Xrunjmp:filter=+package:,-package:java.util $(JVMFLAGS) $(PRJNAME) $(JVMOPTS) )
|
||||
|
||||
prof:
|
||||
@echo -e "Profiling $(PRJNAME)..."
|
||||
@($(LINUX_THREADING) CLASSPATH=$(USER_CLASSPATH) $(JAVA) -Xprof $(JVMFLAGS) $(PRJNAME) $(JVMOPTS))
|
||||
|
||||
|
||||
run:
|
||||
@echo -e "Running $(PRJNAME)..."
|
||||
@($(LINUX_THREADING) CLASSPATH=$(USER_CLASSPATH) $(JAVA) $(JVMFLAGS) $(PRJNAME) $(JVMOPTS))
|
||||
|
||||
################################################
|
||||
## DEPENDS ##
|
BIN
src/chocobar/GenericChocoGraph.class
Normal file
BIN
src/chocobar/GenericChocoGraph.class
Normal file
Binary file not shown.
8
src/chocobar/GenericChocoGraph.java
Normal file
8
src/chocobar/GenericChocoGraph.java
Normal file
|
@ -0,0 +1,8 @@
|
|||
package chocobar;
|
||||
|
||||
import graph.GenericGraph;
|
||||
|
||||
public interface GenericChocoGraph
|
||||
{
|
||||
public GenericGraph genChoco(boolean isList);
|
||||
}
|
BIN
src/chocobar/bpl/BreakPointList.class
Normal file
BIN
src/chocobar/bpl/BreakPointList.class
Normal file
Binary file not shown.
136
src/chocobar/bpl/BreakPointList.java
Normal file
136
src/chocobar/bpl/BreakPointList.java
Normal file
|
@ -0,0 +1,136 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class BreakPointList extends Vector{
|
||||
/**
|
||||
* Constructeur par defaut
|
||||
**/
|
||||
public BreakPointList(){
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur a partir d'un autre objet de meme type
|
||||
**/
|
||||
public BreakPointList(BreakPointList old){
|
||||
super();
|
||||
for (int i=0;i<old.size();i++){
|
||||
super.add(old.elementAt(i));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si le carre (x, y) est encore plein
|
||||
* ou deja troue
|
||||
**/
|
||||
//PROFILED
|
||||
public boolean isBroken(IntPoint current){
|
||||
int cX=current.getX();
|
||||
int cY=current.getY();
|
||||
IntPoint p=null;
|
||||
for(int i=0;i<this.size();i++){
|
||||
p=(IntPoint)super.elementAt(i);
|
||||
if ((p.getX()<=cX) && (p.getY()<=cY)){ return true; }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui ajoute un breakpoint a cet objet si possible
|
||||
**/
|
||||
public void add(IntPoint current){
|
||||
IntPoint p;
|
||||
Iterator i=this.iterator();
|
||||
|
||||
int cX=current.getX();
|
||||
int cY=current.getY();
|
||||
int pX=0; int pY=0;
|
||||
while (i.hasNext()){
|
||||
p=(IntPoint)i.next();
|
||||
pX=p.getX(); pY=p.getY();
|
||||
if ( ((cX<pX)&&(cY<=pY) )
|
||||
|| ((cX<=pX && (cY<pY)))){
|
||||
// on "mange" l'ancien point
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
// we sort new point before insertion depending on the y coord.
|
||||
int comp_idx;
|
||||
int this_size=this.size();
|
||||
if (this_size==0){
|
||||
super.add(current);
|
||||
} else {
|
||||
boolean done=false; // pour savoir si on doit inserer a la fin
|
||||
IntPoint comp=null;
|
||||
i=this.iterator();
|
||||
while(i.hasNext()){
|
||||
comp=(IntPoint)i.next();
|
||||
if (comp.getY() < cY){
|
||||
// current is lower than cur, we have to insert it
|
||||
// before indefOf(cur).
|
||||
comp_idx=this.indexOf(comp);
|
||||
super.insertElementAt(current,comp_idx);
|
||||
done=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!done){
|
||||
super.insertElementAt(current, this_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a string corresponding to the current BreakPointList
|
||||
**/
|
||||
public String toString(){
|
||||
IntPoint p;
|
||||
StringBuffer s=new StringBuffer();
|
||||
s.append("[");
|
||||
Iterator i=this.iterator();
|
||||
while (i.hasNext()){
|
||||
p=(IntPoint)i.next();
|
||||
s.append("(");
|
||||
s.append(p);
|
||||
s.append(") ");
|
||||
}
|
||||
s.append("]");
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the equality between two BreakPointLists
|
||||
**/
|
||||
public boolean equals(BreakPointList comp){
|
||||
if (comp==null){
|
||||
return false;
|
||||
// everybody is null
|
||||
} else {
|
||||
int bpsize=this.size();
|
||||
if (bpsize==comp.size()){
|
||||
IntPoint p=null;
|
||||
IntPoint q=null;
|
||||
for (int i=0;i<bpsize;i++){
|
||||
p=(IntPoint)this.elementAt(i);
|
||||
q=(IntPoint)comp.elementAt(i);
|
||||
if (!p.equals(q)){ return false; }
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
// breakpoint lists do not have the same size...
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Distance between two dinstinct breakpoint lists.
|
||||
**/
|
||||
/*
|
||||
public int distance(BreakPointList other){
|
||||
// TODO (using the code of onePlus if possible)!
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
}
|
BIN
src/chocobar/bpl/CBLGlobal.class
Normal file
BIN
src/chocobar/bpl/CBLGlobal.class
Normal file
Binary file not shown.
10
src/chocobar/bpl/CBLGlobal.java
Normal file
10
src/chocobar/bpl/CBLGlobal.java
Normal file
|
@ -0,0 +1,10 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
class CBLGlobal{
|
||||
public static boolean isVerbose=true;
|
||||
public static void debugMsg(String msg){
|
||||
if (CBLGlobal.isVerbose){
|
||||
System.out.println(msg);
|
||||
}
|
||||
}
|
||||
}
|
BIN
src/chocobar/bpl/ChocoBar.class
Normal file
BIN
src/chocobar/bpl/ChocoBar.class
Normal file
Binary file not shown.
266
src/chocobar/bpl/ChocoBar.java
Normal file
266
src/chocobar/bpl/ChocoBar.java
Normal file
|
@ -0,0 +1,266 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
// JDK imports
|
||||
import java.util.*;
|
||||
|
||||
import graph.Vertice;
|
||||
import exception.*;
|
||||
|
||||
class ChocoBar implements Vertice, Cloneable {
|
||||
private int width;
|
||||
private int height;
|
||||
public BreakPointList brkPtLst;
|
||||
|
||||
/**
|
||||
* Constructeur d'une barre de choco ayant x carres en largeur
|
||||
* et y carres en hauteur, toute neuve.
|
||||
**/
|
||||
public ChocoBar(int x,int y){
|
||||
this.width=x;
|
||||
this.height=y;
|
||||
this.brkPtLst=new BreakPointList();
|
||||
}
|
||||
|
||||
public ChocoBar(int x, int y, BreakPointList oldBP){
|
||||
this(x,y);
|
||||
this.brkPtLst=new BreakPointList(oldBP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the hash int of the current configuration
|
||||
*/
|
||||
public int getHash(){
|
||||
int hash=0;
|
||||
int hoffset=0;
|
||||
IntPoint pt=null;
|
||||
int ptcounter=0;
|
||||
for (int x=0;x<this.width;x++){
|
||||
if (this.brkPtLst.size()>0){
|
||||
pt=(IntPoint)this.brkPtLst.elementAt(ptcounter);
|
||||
if (x==pt.getX()){
|
||||
if (ptcounter<this.brkPtLst.size()-1){
|
||||
ptcounter++;
|
||||
}
|
||||
hoffset=this.height-pt.getY();
|
||||
}
|
||||
}
|
||||
System.out.print(hoffset+" ");
|
||||
hash=hash*this.height+hoffset;
|
||||
}
|
||||
System.out.println(" = "+hash);
|
||||
return hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur d'une ChocoBar à partir d'une ancienne barre
|
||||
**/
|
||||
public ChocoBar(ChocoBar old){
|
||||
this(0,0);
|
||||
try{
|
||||
if (old==null){
|
||||
throw new Exception();
|
||||
} else {
|
||||
this.width=old.width;
|
||||
this.height=old.height;
|
||||
this.brkPtLst=new BreakPointList(old.brkPtLst);
|
||||
}
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
System.exit(-3);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui affiche sur STDOUT cette barre de choco
|
||||
**/
|
||||
public void display(){
|
||||
boolean[][] chocobar= new boolean[width][height];
|
||||
System.out.print(" ");
|
||||
for (int w=0;w<this.width;w++){ // affichage de l'indice x
|
||||
if (w<100){ System.out.print(" "); }
|
||||
if (w<10){ System.out.print(" "); }
|
||||
System.out.print(w);
|
||||
}
|
||||
System.out.println("");
|
||||
for (int h=0;h<this.height;h++){ // affichage de l'indice y
|
||||
if (h<100){ System.out.print(" "); }
|
||||
if (h<10){ System.out.print(" "); }
|
||||
System.out.print(h+". ");
|
||||
for (int w=0;w<this.width;w++){
|
||||
if (this.brkPtLst.isBroken(new IntPoint(w, h))){
|
||||
System.out.print(" _ ");
|
||||
} else {
|
||||
System.out.print(" X ");
|
||||
}
|
||||
}
|
||||
System.out.println("");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new breakpoint at position newBP
|
||||
**/
|
||||
public void addBreakPoint(IntPoint newBP)
|
||||
throws OutOfRangeBreakPointException, AlreadyBrokenPointException
|
||||
{
|
||||
this.addBreakPoint(newBP.getX(),newBP.getY());
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new breakpoint at position (x,y)
|
||||
**/
|
||||
public void addBreakPoint(int x, int y)
|
||||
throws OutOfRangeBreakPointException, AlreadyBrokenPointException
|
||||
{
|
||||
if ((x<0) || (x>=this.width)
|
||||
|| (y<0) || (y>=this.height)){
|
||||
throw (new OutOfRangeBreakPointException());
|
||||
}
|
||||
IntPoint current=new IntPoint(x,y);
|
||||
if (this.brkPtLst.isBroken(current)){
|
||||
throw (new AlreadyBrokenPointException());
|
||||
}
|
||||
this.brkPtLst.add(current);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si la barre passee en argument
|
||||
* contient la meme config que cet objet
|
||||
**/
|
||||
public boolean equals(ChocoBar comp){
|
||||
boolean eq=true;
|
||||
|
||||
if ((this.width != comp.width)||(this.height != comp.height)){
|
||||
eq=false;
|
||||
} else {
|
||||
eq=this.brkPtLst.equals(comp.brkPtLst);
|
||||
}
|
||||
return eq;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si cet objet est une config
|
||||
* suivante de la config passee en parametre
|
||||
* cplx: O(|brkPtLst|)
|
||||
**/
|
||||
public boolean isNextOf(ChocoBar parent){
|
||||
Iterator pointToEat=this.brkPtLst.iterator();
|
||||
ChocoBar parentCopy=null;
|
||||
BreakPointList parentBPCopy=null;
|
||||
IntPoint currentEatPoint;
|
||||
while(pointToEat.hasNext()){
|
||||
currentEatPoint=(IntPoint)pointToEat.next();
|
||||
// we make a copy of parent
|
||||
parentBPCopy=new BreakPointList(parent.brkPtLst);
|
||||
// we eat the copy with each break current chocobar
|
||||
parentBPCopy.add(currentEatPoint);
|
||||
// one of the resulting chocobars should be the same.
|
||||
if (this.brkPtLst.equals(parentBPCopy)){ return true; }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie true si cette barre de choco
|
||||
* est la derniere config possible
|
||||
**/
|
||||
public boolean isFinalConfig(){
|
||||
if (this.brkPtLst.size() != 1){
|
||||
return false;
|
||||
} else {
|
||||
if (this.brkPtLst.contains(new IntPoint(0, 0)))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui calcule les points de frontiere
|
||||
* des carrees non mangés
|
||||
**/
|
||||
public Vector getBreakLine(){
|
||||
Vector frontline=new Vector();
|
||||
|
||||
if ((brkPtLst==null) || (brkPtLst.size()<1)){
|
||||
// on a une barre toute neuve, seul carre
|
||||
// a manger est (width-1, height-1)
|
||||
frontline.add(new IntPoint(this.width-1, this.height-1));
|
||||
} else {
|
||||
IntPoint firstPt;
|
||||
IntPoint secondPt;
|
||||
|
||||
// draw vertical line before first point
|
||||
firstPt=(IntPoint)this.brkPtLst.elementAt(0);
|
||||
if (firstPt.getX()<0){
|
||||
// do nothing, the point is on the left border
|
||||
} else {
|
||||
for (int y=this.height-1;y>=firstPt.getY();y--){
|
||||
frontline.add(
|
||||
new IntPoint(firstPt.getX()-1,y)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// loop with two points
|
||||
for (int i=0;i<this.brkPtLst.size()-1;i++){
|
||||
firstPt=(IntPoint)this.brkPtLst.elementAt(i);
|
||||
secondPt=(IntPoint)this.brkPtLst.elementAt(i+1);
|
||||
// horizontal line between...
|
||||
for (int x=firstPt.getX()-1;
|
||||
x<secondPt.getX()-1;
|
||||
x++){
|
||||
frontline.add(
|
||||
new IntPoint(x,firstPt.getY()-1)
|
||||
);
|
||||
}
|
||||
// then the vertical one
|
||||
for (int y=firstPt.getY()-1;
|
||||
y>=secondPt.getY();
|
||||
y--){
|
||||
frontline.add(
|
||||
new IntPoint(secondPt.getX()-1,y)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// draw horizontal line after last point
|
||||
secondPt=(IntPoint)this.brkPtLst.elementAt(this.brkPtLst.size()-1);
|
||||
if (secondPt.getY()<1){
|
||||
// do nothing, the point is on the top border
|
||||
} else {
|
||||
int hshift=-1;
|
||||
if ((secondPt.getX()+hshift)<0){ hshift=0; }
|
||||
for (int x=secondPt.getX()+hshift;x<this.width;x++){
|
||||
frontline.add(
|
||||
new IntPoint(x,secondPt.getY()-1)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return frontline;
|
||||
}
|
||||
|
||||
public int getColor(){
|
||||
//TODO: fill;
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setColor(int c){
|
||||
//TODO:fill
|
||||
}
|
||||
|
||||
public String getLabel(){
|
||||
//TODO:fill
|
||||
return new String("");
|
||||
}
|
||||
|
||||
public void setLabel(String s){
|
||||
//TODO:fill
|
||||
}
|
||||
|
||||
public BreakPointList getBreakPointList(){
|
||||
return this.brkPtLst;
|
||||
}
|
||||
}
|
||||
|
BIN
src/chocobar/bpl/ChocoBarSet.class
Normal file
BIN
src/chocobar/bpl/ChocoBarSet.class
Normal file
Binary file not shown.
155
src/chocobar/bpl/ChocoBarSet.java
Normal file
155
src/chocobar/bpl/ChocoBarSet.java
Normal file
|
@ -0,0 +1,155 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.util.Vector;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
|
||||
import graph.Vertice;
|
||||
|
||||
public class ChocoBarSet implements VerticeSet {
|
||||
private int size;
|
||||
private ChocoBarSetNode CBSroot;
|
||||
private ChocoBar prevSearch;
|
||||
private ChocoBar prevResultCB;
|
||||
private boolean prevResultContains;
|
||||
private int prevResultId;
|
||||
private Vector assoc;
|
||||
private boolean assocTainted;
|
||||
|
||||
public int size(){
|
||||
return this.size;
|
||||
}
|
||||
|
||||
public ChocoBarSet(){
|
||||
this.size=0;
|
||||
this.assoc=null;
|
||||
this.assocTainted=true;
|
||||
this.CBSroot=new ChocoBarSetNode();
|
||||
}
|
||||
|
||||
public int add(Vertice vCB){
|
||||
ChocoBar extCB=(ChocoBar)vCB;
|
||||
int addId=this.size;
|
||||
this.size=this.size+1;
|
||||
ChocoBarSetNode addedCBSN=this.CBSroot.add(extCB,0,addId);
|
||||
if (this.assocTainted){
|
||||
this.buildAssoc();
|
||||
} else {
|
||||
this.assoc.add(addedCBSN);
|
||||
}
|
||||
if (this.prevSearch==vCB){
|
||||
this.prevSearch=null;
|
||||
}
|
||||
return addId;
|
||||
}
|
||||
|
||||
public void remove(Vertice vCB){
|
||||
ChocoBar extCB=(ChocoBar)vCB;
|
||||
int extId=this.getIdOf(extCB);
|
||||
// TODO: supprimer l'element extCB/extId
|
||||
for (int i=extId+1;i<this.assoc.size();i++){
|
||||
ChocoBarSetNode cbsn=(ChocoBarSetNode)this.assoc.elementAt(i);
|
||||
cbsn.setId(cbsn.getId()-1);
|
||||
}
|
||||
// décaler de -1 tous les Id suppérieurs
|
||||
this.assocTainted=true;
|
||||
}
|
||||
|
||||
public int getIdOf(Vertice vCB){
|
||||
ChocoBar extCB=(ChocoBar)vCB;
|
||||
if (prevSearch==extCB){
|
||||
// we already made something about this
|
||||
//System.out.println("Using prev value");
|
||||
return this.prevResultId;
|
||||
} else {
|
||||
this.updateSearchValues(extCB);
|
||||
return this.prevResultId;
|
||||
}
|
||||
}
|
||||
|
||||
private void updateSearchValues(ChocoBar extCB){
|
||||
//System.out.println("Looking for :");
|
||||
//extCB.display();
|
||||
ChocoBarSetNode foundCBSN=this.CBSroot.getSimilar(extCB,0);
|
||||
this.prevSearch=extCB;
|
||||
if (foundCBSN==null){
|
||||
//System.out.println("Not Found!");
|
||||
this.prevResultCB=null;
|
||||
this.prevResultId=-1;
|
||||
this.prevResultContains=false;
|
||||
} else {
|
||||
this.prevResultCB=foundCBSN.getChocoBar();
|
||||
//System.out.println("Found:");
|
||||
//this.prevResultCB.display();
|
||||
this.prevResultId=foundCBSN.getId();
|
||||
this.prevResultContains=true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean contains(Vertice vCB){
|
||||
ChocoBar extCB=(ChocoBar)vCB;
|
||||
if (prevSearch==extCB){
|
||||
// we already made something about this
|
||||
//System.out.println("Using prev value");
|
||||
return this.prevResultContains;
|
||||
} else {
|
||||
this.updateSearchValues(extCB);
|
||||
return this.prevResultContains;
|
||||
}
|
||||
}
|
||||
|
||||
public Vertice getSimilar(Vertice vCB){
|
||||
ChocoBar extCB=(ChocoBar)vCB;
|
||||
if (prevSearch==extCB){
|
||||
// we already made something about this
|
||||
//System.out.println("Using prev value");
|
||||
return (Vertice)this.prevResultCB;
|
||||
} else {
|
||||
this.updateSearchValues(extCB);
|
||||
return (Vertice)this.prevResultCB;
|
||||
}
|
||||
}
|
||||
|
||||
private void buildAssoc(){
|
||||
System.out.println("Building assoc for "+this.size);
|
||||
Vector newAssoc=new Vector(this.size+1);
|
||||
synchronized(newAssoc){
|
||||
for (int i=0;i<this.size;i++){newAssoc.add(null); }
|
||||
LinkedList fifo=new LinkedList();
|
||||
fifo.addFirst(this.CBSroot);
|
||||
ChocoBarSetNode curCBSN=null;
|
||||
ChocoBarSetNode nextCBSN=null;
|
||||
while(fifo.size()>0){
|
||||
curCBSN=(ChocoBarSetNode)fifo.removeFirst();
|
||||
if (curCBSN.getId()<0){
|
||||
// content of CBSN is not initialized
|
||||
} else {
|
||||
newAssoc.setElementAt(curCBSN,curCBSN.getId());
|
||||
}
|
||||
Collection c=curCBSN.getSubTree().values();
|
||||
Iterator i=c.iterator();
|
||||
while(i.hasNext()){
|
||||
nextCBSN=(ChocoBarSetNode)i.next();
|
||||
fifo.addFirst(nextCBSN);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
this.assoc=newAssoc;
|
||||
this.assocTainted=false;
|
||||
}
|
||||
|
||||
public Vertice elementAt(int eIdx){
|
||||
if (this.assocTainted){
|
||||
//tout reconstruire
|
||||
this.buildAssoc();
|
||||
return this.elementAt(eIdx);
|
||||
} else {
|
||||
// renvoyer l'element eIdx de this.assoc
|
||||
ChocoBarSetNode cbsn=(ChocoBarSetNode)this.assoc.elementAt(eIdx);
|
||||
return cbsn.getChocoBar();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
BIN
src/chocobar/bpl/ChocoBarSetNode.class
Normal file
BIN
src/chocobar/bpl/ChocoBarSetNode.class
Normal file
Binary file not shown.
59
src/chocobar/bpl/ChocoBarSetNode.java
Normal file
59
src/chocobar/bpl/ChocoBarSetNode.java
Normal file
|
@ -0,0 +1,59 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class ChocoBarSetNode {
|
||||
private ChocoBar chocobar;
|
||||
private int id;
|
||||
private HashMap subtree;
|
||||
|
||||
public ChocoBarSetNode(){
|
||||
this.chocobar=null;
|
||||
this.id=-1;
|
||||
this.subtree=new HashMap();
|
||||
}
|
||||
public ChocoBarSetNode add(ChocoBar extCB,int pos,int nid){
|
||||
if (pos==extCB.brkPtLst.size()){
|
||||
//ca se passe dans l'etat courant
|
||||
this.id=nid;
|
||||
this.chocobar=extCB;
|
||||
return this;
|
||||
} else {
|
||||
//ca se passe dans le fils..
|
||||
IntPoint bp=(IntPoint)extCB.brkPtLst.elementAt(pos);
|
||||
if (this.subtree.containsKey(bp)){
|
||||
ChocoBarSetNode subnode=(ChocoBarSetNode)this.subtree.get(bp);
|
||||
return subnode.add(extCB,pos+1,nid);
|
||||
} else {
|
||||
ChocoBarSetNode ncbs=new ChocoBarSetNode();
|
||||
this.subtree.put(bp,ncbs);
|
||||
return ncbs.add(extCB,pos+1,nid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ChocoBarSetNode getSimilar(ChocoBar extCB, int pos){
|
||||
if (pos==extCB.brkPtLst.size()){
|
||||
//c'est l'état courant
|
||||
if (this.chocobar==null){
|
||||
return null;
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
} else {
|
||||
//ca se passe dans le fils..
|
||||
IntPoint bp=(IntPoint)extCB.brkPtLst.elementAt(pos);
|
||||
if (this.subtree.containsKey(bp)){
|
||||
ChocoBarSetNode subnode=(ChocoBarSetNode)this.subtree.get(bp);
|
||||
return subnode.getSimilar(extCB,pos+1);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setId(int nid){ this.id=nid; }
|
||||
public int getId(){ return this.id; }
|
||||
public ChocoBar getChocoBar(){ return this.chocobar; }
|
||||
public HashMap getSubTree(){ return this.subtree; }
|
||||
}
|
BIN
src/chocobar/bpl/ChocoGraph.class
Normal file
BIN
src/chocobar/bpl/ChocoGraph.class
Normal file
Binary file not shown.
156
src/chocobar/bpl/ChocoGraph.java
Normal file
156
src/chocobar/bpl/ChocoGraph.java
Normal file
|
@ -0,0 +1,156 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import exception.*;
|
||||
import chocobar.GenericChocoGraph;
|
||||
import graph.GenericGraph;
|
||||
import graph.Vertice;
|
||||
import conf.ChocoConfig;
|
||||
|
||||
public class ChocoGraph implements GenericChocoGraph
|
||||
{
|
||||
private int width;
|
||||
private int height;
|
||||
Graph configGraph;
|
||||
private Vertice lastExistingVertice;
|
||||
private int gccount;
|
||||
|
||||
/**
|
||||
* Constructeur d'un graphe de jeu de Chocobar avec les barres
|
||||
* de taille (width X height)
|
||||
**/
|
||||
public ChocoGraph(){
|
||||
this.gccount=0;
|
||||
this.width=ChocoConfig.size;
|
||||
this.height=ChocoConfig.height;
|
||||
this.configGraph=null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie s'il existe deja un ChocoBar
|
||||
* de même configuration que celle passee en param
|
||||
* dans cet objet
|
||||
**/
|
||||
private void genChocoFromPoint(ChocoBar oldCBar,int x, int y){
|
||||
// creer une config : ajouter breakpoint (x, y)
|
||||
ChocoBar currentCBar=new ChocoBar(oldCBar);
|
||||
try {
|
||||
try{
|
||||
currentCBar.addBreakPoint(x, y);
|
||||
} catch (OutOfRangeBreakPointException e1){ return; }
|
||||
} catch (AlreadyBrokenPointException e2){
|
||||
// on doit pas y arriver ici
|
||||
}
|
||||
//System.out.print("Does the following bar exists? ");
|
||||
ChocoBarSet cbs=(ChocoBarSet)this.configGraph.getVerticeModel();
|
||||
int fatherIdx=this.configGraph.indexOfVertice(oldCBar);
|
||||
if (cbs.contains(currentCBar)){
|
||||
// on ajoute le du oldCbar (pere) vers
|
||||
// cette config (fils)
|
||||
// le pere est le dernier ajouté
|
||||
int sonIdx=this.configGraph.indexOfVertice(currentCBar);
|
||||
try{
|
||||
this.configGraph.addEdge(fatherIdx,sonIdx);
|
||||
} catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
// cette config existe deja donc finir
|
||||
return;
|
||||
} else {
|
||||
// c'est une nouvelle config
|
||||
// ajouter cette config au graphe,
|
||||
// par defaut, nouveaux arcs sont aussi rajoutes
|
||||
this.configGraph.addVertice(currentCBar);
|
||||
int sonIdx=this.configGraph.indexOfVertice(currentCBar);
|
||||
if (currentCBar.isFinalConfig()){
|
||||
this.configGraph.setFinalState(sonIdx);
|
||||
}
|
||||
constructArcsFromFatherAncestorsTo(fatherIdx,sonIdx);
|
||||
/*
|
||||
try {
|
||||
this.constructArcsTo(currentCBar);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
*/
|
||||
|
||||
// trouver des arcs vers ce nouveau vertice
|
||||
//int verticeId=this.configGraph.indexOfVertice(currentCBar);
|
||||
|
||||
// generer les config suivantes a partir d'une liste
|
||||
// des points frontieres
|
||||
Vector frontline=currentCBar.getBreakLine();
|
||||
Iterator i=frontline.iterator();
|
||||
while (i.hasNext()){
|
||||
IntPoint currentP=(IntPoint)i.next();
|
||||
genChocoFromPoint(currentCBar,(int)currentP.getX(),(int)currentP.getY());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Generation du graphe de jeu : creation de la racine
|
||||
**/
|
||||
public GenericGraph genChoco(boolean isList){
|
||||
// creation du noeud racine avec une barre toute neuve
|
||||
ChocoBar rootCBar=new ChocoBar(this.width,this.height);
|
||||
System.out.println("Root ChocoBar:");
|
||||
rootCBar.display();
|
||||
this.configGraph=new Graph(new ChocoBarSet(),isList);
|
||||
this.configGraph.setInitialState(0);
|
||||
//System.out.println(this.configGraph.toDot());
|
||||
this.configGraph.addVertice(rootCBar);
|
||||
|
||||
// on génère le graphe a partir de la racine
|
||||
this.genChocoFromPoint(rootCBar,this.width-1,this.height-1);
|
||||
|
||||
return this.configGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction de generation d'arc des sommets ascendants vers
|
||||
* un nouveau sommet sonIdx
|
||||
**/
|
||||
public void constructArcsFromFatherAncestorsTo(int fatherIdx,int sonIdx){
|
||||
ChocoBar fatherCB=(ChocoBar)this.configGraph.getVertice(fatherIdx);
|
||||
ChocoBar sonCB=(ChocoBar)this.configGraph.getVertice(sonIdx);
|
||||
Collection grandFathersIdx=null;
|
||||
// verifier si c'est bien un successeur
|
||||
if (sonCB.isNextOf(fatherCB)){
|
||||
try{ this.configGraph.addEdge(fatherIdx,sonIdx);}
|
||||
catch (Exception e){ e.printStackTrace(); System.exit(-10); }
|
||||
try{ grandFathersIdx=this.configGraph.getIncident(fatherIdx);}
|
||||
catch (Exception e){ e.printStackTrace(); System.exit(-10); }
|
||||
if (grandFathersIdx!=null){ //condition d'arret
|
||||
Iterator i=grandFathersIdx.iterator();
|
||||
while(i.hasNext()){
|
||||
int grandFatherIdx=((Integer)i.next()).intValue();
|
||||
constructArcsFromFatherAncestorsTo(grandFatherIdx,sonIdx);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie le graph de cet objet
|
||||
**/
|
||||
public Graph getGraph(){
|
||||
return (this.configGraph);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui affiche tous les ChocoBar dans ce graphe
|
||||
**/
|
||||
public void displayAll(){
|
||||
int cpt=0;
|
||||
ChocoBarSet cbs=(ChocoBarSet)this.configGraph.getVerticeModel();
|
||||
for (int i=0;i<cbs.size();i++){
|
||||
System.out.println("Vertice no : "+cpt);
|
||||
cpt++;
|
||||
ChocoBar cb=(ChocoBar)cbs.elementAt(i);
|
||||
cb.display();
|
||||
}
|
||||
}
|
||||
}
|
BIN
src/chocobar/bpl/EdgeListModel.class
Normal file
BIN
src/chocobar/bpl/EdgeListModel.class
Normal file
Binary file not shown.
248
src/chocobar/bpl/EdgeListModel.java
Normal file
248
src/chocobar/bpl/EdgeListModel.java
Normal file
|
@ -0,0 +1,248 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.util.*; // listes
|
||||
|
||||
import exception.*;
|
||||
|
||||
class EdgeListModel implements EdgeModel {
|
||||
private HashMap[] adjacent;
|
||||
private HashMap[] incident;
|
||||
private int cardV;
|
||||
|
||||
/**
|
||||
* Constructeur par defaut
|
||||
**/
|
||||
public EdgeListModel(){
|
||||
this(10);
|
||||
this.cardV=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur d'un modele de graphe avec nbVertices sommets
|
||||
**/
|
||||
public EdgeListModel(int nbVertices){
|
||||
if (nbVertices>=0){
|
||||
this.cardV=nbVertices;
|
||||
this.adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||
this.incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie le nombre de sommets de cette liste
|
||||
* d'adjacence
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.cardV;
|
||||
}
|
||||
|
||||
/** Fonction qui réinitialise à la taille donnée.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
cardV=size;
|
||||
adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||
incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc de srcV vers dstV
|
||||
**/
|
||||
public void addEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
{
|
||||
// on vérifie que les arcs ajoutés joignent des
|
||||
// sommets existants dans le graphe
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
} else {
|
||||
if (this.adjacent[srcV]==null){
|
||||
this.adjacent[srcV]=new HashMap();
|
||||
}
|
||||
if (this.incident[dstV]==null){
|
||||
this.incident[dstV]=new HashMap();
|
||||
}
|
||||
HashMap srcList=this.adjacent[srcV];
|
||||
HashMap dstList=this.incident[dstV];
|
||||
Integer d=new Integer(dstV);
|
||||
Integer s=new Integer(srcV);
|
||||
if (!srcList.containsKey(d)){srcList.put(d,null);}
|
||||
if (!dstList.containsKey(s)){dstList.put(s,null);}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie s'il existe un arc
|
||||
* de srcV vers dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV,int dstV){
|
||||
if (this.adjacent[srcV]==null){
|
||||
return false;
|
||||
}
|
||||
//works too with incident...
|
||||
HashMap srcAdj=this.adjacent[srcV];
|
||||
if (srcAdj.containsKey(new Integer(dstV))){ return true; }
|
||||
else { return false; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int src, Vector dst){
|
||||
HashMap srcAdj=this.adjacent[src];
|
||||
int taille=srcAdj.size();
|
||||
int adj=-1;
|
||||
Object[] adjacents=srcAdj.keySet().toArray();
|
||||
|
||||
if (taille>dst.size()){
|
||||
//y a des sommets qui ne sont pas dans le tableau
|
||||
return -1;
|
||||
} else {
|
||||
for (int i=0; i<taille; i++){
|
||||
if (!dst.contains(adjacents[i])){
|
||||
return -1;
|
||||
} else {
|
||||
if (adj==-1){
|
||||
adj=((Integer)adjacents[i]).intValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return adj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||
**/
|
||||
public int getSourceVertice(){
|
||||
int i = -1;
|
||||
if ((this.cardV != 0)&&(this.incident != null)){
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.incident[j]==null){
|
||||
i=j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalVertice(){
|
||||
int i = -1;
|
||||
if ((this.cardV != 0)&&(this.adjacent != null)){
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[j]==null){
|
||||
i=j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public Collection getAdjacent(int srcV){
|
||||
HashMap adj= this.adjacent[srcV];
|
||||
if (adj==null){ return null; }
|
||||
else { return adj.keySet(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie le premier sommet adjacent a srcV
|
||||
**/
|
||||
public int getFirstAdjacentVertice(int srcV){
|
||||
Iterator i=this.adjacent[srcV].keySet().iterator();
|
||||
return ((Integer)i.next()).intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste de sommets ayant un arc vers
|
||||
* sommet dstV
|
||||
**/
|
||||
public Collection getIncident(int dstV){
|
||||
HashMap inc= this.incident[dstV];
|
||||
if (inc==null){ return null; }
|
||||
else { return inc.keySet(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui enleve tous les arcs du graphe
|
||||
**/
|
||||
public void clear(){
|
||||
for (int i=0; i<cardV; i++){
|
||||
this.adjacent[i].clear();
|
||||
this.incident[i].clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute tous les arcs possibles du graphe
|
||||
**/
|
||||
public void fill(){
|
||||
for (int src=0; src<cardV; src++){
|
||||
for (int dst=0; dst<cardV; dst++){
|
||||
if (src==dst) {
|
||||
continue;
|
||||
} else {
|
||||
if (this.adjacent[src]==null){
|
||||
this.adjacent[src]=new HashMap();
|
||||
}
|
||||
if (this.incident[dst]==null){
|
||||
this.adjacent[dst]=new HashMap();
|
||||
}
|
||||
HashMap srcList=this.adjacent[src];
|
||||
HashMap dstList=this.incident[dst];
|
||||
srcList.put(new Integer(dst),null);
|
||||
dstList.put(new Integer(src),null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un vertice a la fin de table d'adjacence
|
||||
* Liste d'adjacence de ce nouveau vertice est encore VIDE
|
||||
**/
|
||||
public void addVertice(){
|
||||
// Verify that we have enough free space
|
||||
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||
System.out.println("ADDVERTICE: duplicating size: "+ this.cardV+"/"+this.adjacent.length+"...");
|
||||
int extra=2*this.adjacent.length;
|
||||
HashMap[] adjCopy = new HashMap[this.adjacent.length + extra];
|
||||
HashMap[] incCopy = new HashMap[this.adjacent.length + extra];
|
||||
System.arraycopy(this.adjacent,0,adjCopy,0,this.adjacent.length);
|
||||
System.arraycopy(this.incident,0,incCopy,0,this.incident.length);
|
||||
this.adjacent=adjCopy;
|
||||
this.incident=incCopy;
|
||||
System.out.println("ADDVERTICE: duplicating done.");
|
||||
}
|
||||
this.cardV++;
|
||||
}
|
||||
|
||||
public void removeVerticeAt(int index)
|
||||
throws OutOfRangeVerticeException{
|
||||
//TODO: écrire!!!
|
||||
/*
|
||||
if (index >= this.cardV){
|
||||
throw (new OutOfRangeVerticeException());
|
||||
} else {
|
||||
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
BIN
src/chocobar/bpl/EdgeMatrixModel.class
Normal file
BIN
src/chocobar/bpl/EdgeMatrixModel.class
Normal file
Binary file not shown.
248
src/chocobar/bpl/EdgeMatrixModel.java
Normal file
248
src/chocobar/bpl/EdgeMatrixModel.java
Normal file
|
@ -0,0 +1,248 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.util.*; // listes
|
||||
|
||||
import exception.*;
|
||||
|
||||
public class EdgeMatrixModel implements EdgeModel {
|
||||
private int cardV;
|
||||
private boolean[][] adjacent;
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
**/
|
||||
public EdgeMatrixModel() {
|
||||
this(10);
|
||||
this.cardV=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor with card (number of vertices) as a parameter
|
||||
**/
|
||||
public EdgeMatrixModel(int card) {
|
||||
this.cardV=card;
|
||||
this.adjacent=new boolean[this.cardV][this.cardV];
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.cardV;
|
||||
}
|
||||
|
||||
/** Fonction qui réinitialise à la taille donnée.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
cardV=size;
|
||||
adjacent=new boolean[size][size];
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc partant du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public void addEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||
// rajoute un arc n'importe quoi
|
||||
{
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
adjacent[srcV][dstV]=true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV,int dstV){
|
||||
return adjacent[srcV][dstV];
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int srcV, Vector dstV){
|
||||
int j=0;
|
||||
int adj=-1;
|
||||
|
||||
for (int i=0; i<cardV; i++){
|
||||
if (adjacent[srcV][i]){
|
||||
if (!dstV.contains(new Integer(i))){
|
||||
return -1;
|
||||
}
|
||||
if (adj==-1)
|
||||
adj=i;
|
||||
}
|
||||
}
|
||||
return adj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getSourceVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[j][i]){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!this.adjacent[i][j]){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[j][i]){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=i+1; j<this.cardV; j++){
|
||||
if (this.adjacent[i][j]){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[i][j]){
|
||||
return -1; }
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!this.adjacent[j][i]){
|
||||
return -1; }
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||
**/
|
||||
public Collection getAdjacent(int srcV){
|
||||
LinkedList res=new LinkedList();
|
||||
for (int i=0; i<cardV; i++){
|
||||
if (adjacent[srcV][i])
|
||||
res.add(new Integer(i));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste d'incidence du sommet dstV
|
||||
**/
|
||||
public Collection getIncident(int dstV){
|
||||
Vector incident=new Vector();
|
||||
for (int i=0; i<cardV; i++){
|
||||
if (isEdge(i, dstV))
|
||||
incident.add(new Integer(i));
|
||||
}
|
||||
return incident;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui efface tous les arcs du graphe
|
||||
**/
|
||||
public void clear(){
|
||||
// we remove edges between every vertice
|
||||
for (int i=0; i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
this.adjacent[i][j]=false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui cree tous les arcs possibles du graphe
|
||||
**/
|
||||
public void fill(){
|
||||
// we add edges between every vertice
|
||||
for (int i=0; i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
this.adjacent[i][j]=true;
|
||||
}
|
||||
}
|
||||
// but a vertice cannot have an edge to itself
|
||||
for (int i=0;i<this.cardV;i++){
|
||||
this.adjacent[i][i]=false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||
* les arcs sont encore VIDE
|
||||
**/
|
||||
public void addVertice(){
|
||||
// Verify that we have enough free space
|
||||
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||
int nuvolen=this.adjacent.length * 2;
|
||||
boolean[][] copie = new boolean[nuvolen][nuvolen];
|
||||
for (int i=0; i<this.cardV; i++){
|
||||
// on copie juste les anciennes valeurs
|
||||
// les nouvelles cases etant initialisee a 0
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
copie[i][j]=adjacent[i][j];
|
||||
}
|
||||
}
|
||||
this.adjacent=copie;
|
||||
}
|
||||
this.cardV++;
|
||||
}
|
||||
|
||||
public void removeVerticeAt(int rmIdx)
|
||||
throws OutOfRangeVerticeException{
|
||||
if ((rmIdx<0) || (rmIdx>=this.cardV)){
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
// create a new array (cardV-1) * (cardV-1)
|
||||
boolean[][] neoAdj= new boolean[this.cardV-1][this.cardV-1];
|
||||
|
||||
// fill the new array zith the values of the previous
|
||||
// adjacency matrix
|
||||
int ni=0;
|
||||
int nj=0;
|
||||
|
||||
for (int i=0;i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
if ((i!=rmIdx) || (j!=rmIdx)){
|
||||
if (i<rmIdx){ni=i; }
|
||||
if (i>rmIdx){ni=i-1; }
|
||||
if (j<rmIdx){nj=j; }
|
||||
if (j>rmIdx){nj=j-1; }
|
||||
neoAdj[ni][nj]=this.adjacent[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
// associate the new adjacency matrix to the class
|
||||
this.cardV=this.cardV-1;
|
||||
this.adjacent=neoAdj;
|
||||
}
|
||||
|
||||
}
|
BIN
src/chocobar/bpl/EdgeModel.class
Normal file
BIN
src/chocobar/bpl/EdgeModel.class
Normal file
Binary file not shown.
24
src/chocobar/bpl/EdgeModel.java
Normal file
24
src/chocobar/bpl/EdgeModel.java
Normal file
|
@ -0,0 +1,24 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.util.Collection; // listes
|
||||
import java.util.Vector;
|
||||
|
||||
import exception.*;
|
||||
|
||||
public interface EdgeModel {
|
||||
public int getCardV();
|
||||
public void addEdge(int srcV,int dstV) throws OutOfRangeVerticeException;
|
||||
public boolean isEdge(int srcV,int dstV);
|
||||
public int setSize(int size);
|
||||
public int withOnlyEdges(int srcV, Vector dstV);
|
||||
public Collection getAdjacent(int srcV);
|
||||
public Collection getIncident(int dstV);
|
||||
public int getSourceVertice(); //racine du graphe
|
||||
public int getFinalVertice(); //sommet final (un seul) du graphe
|
||||
public void clear(); //no edges
|
||||
public void fill(); //edges to everywhere
|
||||
|
||||
public void addVertice(); // add vertice at the end
|
||||
public void removeVerticeAt(int index) throws OutOfRangeVerticeException;
|
||||
}
|
||||
|
BIN
src/chocobar/bpl/Graph.class
Normal file
BIN
src/chocobar/bpl/Graph.class
Normal file
Binary file not shown.
410
src/chocobar/bpl/Graph.java
Normal file
410
src/chocobar/bpl/Graph.java
Normal file
|
@ -0,0 +1,410 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*; // listes
|
||||
import java.text.*; // streamtokenizer
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import exception.*;
|
||||
import graph.GenericGraph;
|
||||
import graph.Vertice;
|
||||
import conf.ChocoConfig;
|
||||
|
||||
public class Graph implements GenericGraph {
|
||||
private EdgeModel edgeModel;
|
||||
private boolean isListModel;
|
||||
private String name;
|
||||
private VerticeSet verticeModel;
|
||||
private int initialState;
|
||||
private int finalState;
|
||||
//private Vector verticeTab;
|
||||
|
||||
/**
|
||||
* Constructeur par defaut. On ne l'utilisera que lorsque l'on va
|
||||
* initialiser via un fichier, on peut donc faire quelque consessions
|
||||
**/
|
||||
public Graph()
|
||||
{
|
||||
this.verticeModel=null;
|
||||
this.name=null;
|
||||
this.isListModel=false;
|
||||
this.initialState=-1;
|
||||
this.finalState=-1;
|
||||
}
|
||||
|
||||
public Graph(VerticeSet vmodel){
|
||||
this.verticeModel=vmodel;
|
||||
this.name=null;
|
||||
this.isListModel=false;
|
||||
this.initialState=-1;
|
||||
this.finalState=-1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur d'un graphe non-initalise avec une liste
|
||||
* d'adjacence
|
||||
**/
|
||||
public Graph(VerticeSet vmodel,boolean isList){
|
||||
this(vmodel);
|
||||
this.isListModel=isList;
|
||||
if (isList){
|
||||
this.edgeModel=new EdgeListModel();
|
||||
} else {
|
||||
this.edgeModel=new EdgeMatrixModel();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur d'un graphe non-initialise avec cardV sommets
|
||||
**/
|
||||
public Graph (VerticeSet vmodel,boolean isList, int cardV){
|
||||
this(vmodel);
|
||||
this.isListModel=isList;
|
||||
if (isList){
|
||||
this.edgeModel=new EdgeListModel(cardV);
|
||||
} else {
|
||||
this.edgeModel=new EdgeMatrixModel(cardV);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur d'un graphe initialise a partir
|
||||
* du fichier filename
|
||||
**/
|
||||
public Graph(VerticeSet vmodel,boolean isList, String filename)
|
||||
throws ParseException, IOException, FileNotFoundException
|
||||
{
|
||||
this(vmodel,isList,0);
|
||||
this.loadFromFile(filename);
|
||||
}
|
||||
|
||||
/** Initialize the Graph.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
try {
|
||||
Class cEM = Class.forName(ChocoConfig.edgeModel);
|
||||
this.edgeModel = (EdgeModel) cEM.newInstance();
|
||||
this.edgeModel.setSize(size);
|
||||
} catch (Exception e) {
|
||||
this.edgeModel = null;
|
||||
e.printStackTrace();
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui met la valeur du sommet source du graphe
|
||||
**/
|
||||
public void setInitialState(int init){
|
||||
this.initialState=init;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui met la valeur du sommet puis (final) du graphe
|
||||
**/
|
||||
public void setFinalState(int init){
|
||||
this.finalState=init;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un vertice passe en parametre
|
||||
* dans le vecteur (collection) de vertices de ce graphe
|
||||
**/
|
||||
|
||||
public void addVertice(Vertice e){
|
||||
this.verticeModel.add(e);
|
||||
//int idv2=this.verticeModel.getIdOf(e);
|
||||
//System.out.println("Added new vertice "+idv+" / "+idv2);
|
||||
// apply modification on the edge model
|
||||
this.edgeModel.addVertice();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc de x vers y
|
||||
**/
|
||||
public void addEdge(int x, int y) throws OutOfRangeVerticeException {
|
||||
this.edgeModel.addEdge(x, y);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie l'indice du vertice passe
|
||||
* en parametre dans le vecteur des vertices de ce graphe
|
||||
**/
|
||||
public int indexOfVertice(Vertice e){
|
||||
return this.verticeModel.getIdOf(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui enleve un vertice passe en parametre
|
||||
* de la collection de vertices de ce graphe
|
||||
**/
|
||||
public void removeVertice(Vertice e)
|
||||
{
|
||||
int idx=this.indexOfVertice(e);
|
||||
try {
|
||||
this.edgeModel.removeVerticeAt(idx);
|
||||
} catch (OutOfRangeVerticeException ex){
|
||||
// normally, this is impossible...
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui enleve un vertice a l'indice specifiee
|
||||
**/
|
||||
/*
|
||||
public void removeVertice(int idx)
|
||||
throws OutOfRangeVerticeException {
|
||||
if ((idx<0) || (idx>= this.verticeTab.size())){
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
this.verticeTab.removeElementAt(idx);
|
||||
//apply modification on the edge model
|
||||
this.edgeModel.removeVerticeAt(idx);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Fonction d'initialisation du graphe a partir d'un fichier
|
||||
**/
|
||||
public void loadFromFile(String filename)
|
||||
throws ParseException, IOException, FileNotFoundException
|
||||
{
|
||||
int verticeNb;
|
||||
FileReader fi=new FileReader(filename);
|
||||
StreamTokenizer si=new StreamTokenizer(fi);
|
||||
si.eolIsSignificant(false);
|
||||
si.lowerCaseMode(false);
|
||||
si.parseNumbers();
|
||||
|
||||
/* parse the name of the graph */
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_WORD){
|
||||
this.name=new String(si.sval);
|
||||
} else {
|
||||
throw new ParseException("Bad graph name",0);
|
||||
}
|
||||
|
||||
/* Parse number of vertices */
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||
verticeNb=(int)si.nval;
|
||||
if (this.isListModel){
|
||||
this.edgeModel=new EdgeListModel(verticeNb);
|
||||
} else {
|
||||
this.edgeModel=new EdgeMatrixModel(verticeNb);
|
||||
}
|
||||
} else {
|
||||
throw new ParseException("Bad graph size",0);
|
||||
}
|
||||
|
||||
/* Parse source vertice */
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||
setInitialState((int)si.nval);
|
||||
} else {
|
||||
throw new ParseException("Bad graph size",0);
|
||||
}
|
||||
|
||||
/* Parse final vertice */
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||
setFinalState((int)si.nval);
|
||||
} else {
|
||||
throw new ParseException("Bad graph size",0);
|
||||
}
|
||||
|
||||
/* Parse matrix */
|
||||
for (int i=0; i<verticeNb;i++){
|
||||
for (int j=0; j<verticeNb; j++){
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||
if (si.nval==0) {
|
||||
// do nothing
|
||||
} else {
|
||||
// add an edge to the graph
|
||||
try {
|
||||
this.edgeModel.addEdge(i,j);
|
||||
} catch (OutOfRangeVerticeException e){
|
||||
throw new ParseException("Unknown vertice used",0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
throw new ParseException("Bad graph matrix",0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of vertices of the Graph
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.edgeModel.getCardV();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie les sommets du graphe
|
||||
**/
|
||||
public VerticeSet getVerticeModel(){
|
||||
return this.verticeModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the vertice at index vertIdx
|
||||
* range verification is done by verticetab...
|
||||
**/
|
||||
public Vertice getVertice(int vertIdx) {
|
||||
return ((Vertice)this.verticeModel.elementAt(vertIdx));
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie l'existence de l'arc
|
||||
* du sommet srcV vers dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV, int dstV){
|
||||
return this.edgeModel.isEdge(srcV, dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie l'indice du vertice racine du graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getInitialState(){
|
||||
return this.initialState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie l'indice du vertice final du graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalState(){
|
||||
return this.finalState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||
**/
|
||||
public Collection getAdjacent(int srcV)
|
||||
throws OutOfRangeVerticeException
|
||||
{
|
||||
if ((srcV<0) || (srcV >= edgeModel.getCardV())){
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
return this.edgeModel.getAdjacent(srcV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int src, Vector dst){
|
||||
return this.edgeModel.withOnlyEdges(src, dst);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste d'incidence du sommet srcV
|
||||
**/
|
||||
public Collection getIncident(int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
{
|
||||
if ((dstV<0) || (dstV >= edgeModel.getCardV())){
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
return this.edgeModel.getIncident(dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie representation (sous forme de String)
|
||||
* du graphe en format .txt
|
||||
**/
|
||||
public String toTxt(){
|
||||
StringBuffer output;
|
||||
if (this.verticeModel != null)
|
||||
output=new StringBuffer(4*this.edgeModel.getCardV());
|
||||
else
|
||||
output=new StringBuffer(80);
|
||||
String endl=System.getProperty("line.separator");
|
||||
if ((this.name) != null){
|
||||
output.append(this.name+endl);
|
||||
} else {
|
||||
output.append("noName"+endl);
|
||||
}
|
||||
if (this.edgeModel==null){
|
||||
output.append("0"+endl);
|
||||
} else {
|
||||
int taille=this.edgeModel.getCardV();
|
||||
output.append(""+taille+endl);
|
||||
output.append(""+initialState+endl);
|
||||
output.append(""+finalState+endl);
|
||||
for (int i=0;i<taille;i++){
|
||||
for (int j=0; j<taille; j++){
|
||||
if (this.edgeModel.isEdge(i,j)){
|
||||
output.append("1 ");
|
||||
} else {
|
||||
output.append("0 ");
|
||||
}
|
||||
}
|
||||
output.append(endl);
|
||||
}
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie representation (sous forme de String)
|
||||
* du graphe en format .dot
|
||||
**/
|
||||
public String toDot(){
|
||||
StringBuffer output;
|
||||
String tempName;
|
||||
String endl=System.getProperty("line.separator");
|
||||
|
||||
if (this.name==null){
|
||||
tempName="noName";
|
||||
} else {
|
||||
tempName=this.name;
|
||||
}
|
||||
output=new StringBuffer("digraph "+tempName+" {"+endl);
|
||||
if (this.edgeModel==null) {
|
||||
output.append("}"+endl);
|
||||
} else {
|
||||
output=new StringBuffer("digraph "+this.name+" {");
|
||||
output=output.append(endl);
|
||||
|
||||
// Pour l'instant label vaut le sommet d'ou l'arc part
|
||||
int taille=this.edgeModel.getCardV();
|
||||
for (int i=0; i<taille; i++){
|
||||
Collection adj=this.edgeModel.getAdjacent(i);
|
||||
output.append(i);
|
||||
output.append(" [label=");
|
||||
output.append(i);
|
||||
output.append("];");
|
||||
output.append(endl);
|
||||
//output.append(adj);
|
||||
if (adj!=null){
|
||||
Iterator j=adj.iterator();
|
||||
while(j.hasNext()){
|
||||
output.append(" ");
|
||||
output.append(i);
|
||||
output.append(" -> ");
|
||||
output.append((Integer)j.next());
|
||||
output.append(" ;");
|
||||
output.append(endl);
|
||||
}
|
||||
}
|
||||
}
|
||||
output=output.append("}"+endl);
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
BIN
src/chocobar/bpl/IntPoint.class
Normal file
BIN
src/chocobar/bpl/IntPoint.class
Normal file
Binary file not shown.
67
src/chocobar/bpl/IntPoint.java
Normal file
67
src/chocobar/bpl/IntPoint.java
Normal file
|
@ -0,0 +1,67 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
public class IntPoint implements Comparable {
|
||||
int x;
|
||||
int y;
|
||||
int hash=-1;
|
||||
|
||||
/**
|
||||
* Constructeur d'un IntPoint a partir de deux entiers
|
||||
**/
|
||||
public IntPoint(int x, int y){
|
||||
this.x=x;
|
||||
this.y=y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la valeur de x de cet objet
|
||||
**/
|
||||
public int getX(){
|
||||
return this.x;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la valeur de y de cet objet
|
||||
**/
|
||||
public int getY(){
|
||||
return this.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la representation de cet objet en
|
||||
* String
|
||||
**/
|
||||
public String toString(){
|
||||
return (new String(x+", "+y));
|
||||
}
|
||||
|
||||
public int hashCode(){
|
||||
// on numérote les couples (p,q) dans l'ordre des diagonales
|
||||
// cf cours denombrabilité...
|
||||
if (this.hash<0){
|
||||
int s=this.x+this.y;
|
||||
this.hash=(s)*(s+1)+this.y+this.y;
|
||||
}
|
||||
return this.hash;
|
||||
}
|
||||
|
||||
public boolean equals(Object o){
|
||||
if(!(o instanceof IntPoint)) { return false; }
|
||||
IntPoint p=(IntPoint)o;
|
||||
return ((this.x==p.x)&&(this.y==p.y));
|
||||
}
|
||||
|
||||
public int compareTo(Object o){
|
||||
if(!(o instanceof IntPoint)) { throw new ClassCastException(); }
|
||||
IntPoint p=(IntPoint)o;
|
||||
int comp=0;
|
||||
if (this.equals(p)){
|
||||
return 0;
|
||||
} else {
|
||||
if ((this.x<=p.x) && (this.y<=p.y)){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
BIN
src/chocobar/bpl/VerticeSet.class
Normal file
BIN
src/chocobar/bpl/VerticeSet.class
Normal file
Binary file not shown.
13
src/chocobar/bpl/VerticeSet.java
Normal file
13
src/chocobar/bpl/VerticeSet.java
Normal file
|
@ -0,0 +1,13 @@
|
|||
package chocobar.bpl;
|
||||
|
||||
import graph.Vertice;
|
||||
|
||||
public interface VerticeSet {
|
||||
public int add(Vertice v);
|
||||
public boolean contains(Vertice v);
|
||||
public Vertice elementAt(int idx);
|
||||
public int getIdOf(Vertice v);
|
||||
public void remove(Vertice v);
|
||||
public Vertice getSimilar(Vertice extCB);
|
||||
public int size();
|
||||
}
|
BIN
src/chocobar/combi/BitSet.class
Normal file
BIN
src/chocobar/combi/BitSet.class
Normal file
Binary file not shown.
79
src/chocobar/combi/BitSet.java
Normal file
79
src/chocobar/combi/BitSet.java
Normal file
|
@ -0,0 +1,79 @@
|
|||
package chocobar.combi;
|
||||
|
||||
/**
|
||||
* Classe pour faire un bitset.
|
||||
*/
|
||||
|
||||
public final class BitSet
|
||||
{
|
||||
// On utilise un long, pour maximiser la place utile
|
||||
// TODO - Pour l'instant on utilise qu'un seul bitfield
|
||||
private long bits[];
|
||||
|
||||
public BitSet(long l)
|
||||
{
|
||||
bits = new long[1];
|
||||
|
||||
// Init
|
||||
bits[0] = l;
|
||||
}
|
||||
|
||||
public BitSet(long l, long s)
|
||||
{
|
||||
System.out.println("BitSet("+l+","+s+")");
|
||||
int size = (int)(s / 64) + 1;
|
||||
|
||||
bits = new long[size];
|
||||
bits[0] = l;
|
||||
for (int i=1; (i<size); i++) {
|
||||
bits[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public BitSet(long[] l)
|
||||
{
|
||||
int size = l.length;
|
||||
|
||||
bits = new long[size];
|
||||
|
||||
for (int i=0; (i<size); i++) {
|
||||
bits[i] = l[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Getter & Setter for bits
|
||||
public boolean testBit(int i)
|
||||
{
|
||||
// sizeof(long) = 64
|
||||
int n = i / 64;
|
||||
int o = i % 64;
|
||||
|
||||
// BitMask
|
||||
long m = ((long) 1) << o;
|
||||
return ((bits[n] & m) == 0);
|
||||
}
|
||||
|
||||
// Getter & Setter for bits
|
||||
public void setBit(long i)
|
||||
{
|
||||
// sizeof(long) = 64
|
||||
long n = i / 64;
|
||||
long o = i % 64;
|
||||
|
||||
// BitMask
|
||||
long m = ((long) 1) << o;
|
||||
bits[(int)n] |= m;
|
||||
}
|
||||
|
||||
// Getter & Setter for bits
|
||||
public void clearBit(long i)
|
||||
{
|
||||
// sizeof(long) = 64
|
||||
long n = i / 64;
|
||||
long o = i % 64;
|
||||
|
||||
// BitMask
|
||||
long m = ((long) 1) << o;
|
||||
bits[(int)n] &= ~m;
|
||||
}
|
||||
}
|
BIN
src/chocobar/combi/ChocoBar.class
Normal file
BIN
src/chocobar/combi/ChocoBar.class
Normal file
Binary file not shown.
81
src/chocobar/combi/ChocoBar.java
Normal file
81
src/chocobar/combi/ChocoBar.java
Normal file
|
@ -0,0 +1,81 @@
|
|||
package chocobar.combi;
|
||||
|
||||
/** class Abstraite pour les ChocoBars.
|
||||
*/
|
||||
|
||||
import graph.Vertice;
|
||||
|
||||
abstract class ChocoBar implements Vertice {
|
||||
/* On utilise des variables statiques car elles sont
|
||||
* forcément partagées par tous les ChocoBar
|
||||
*/
|
||||
protected static int size;
|
||||
protected static int height;
|
||||
|
||||
/**
|
||||
* Affichage de la barre de choco en graphique.
|
||||
**/
|
||||
public String toMap()
|
||||
{
|
||||
String s = "";
|
||||
for (int j=0; (j<height); j++) {
|
||||
for (int i=0; (i<size); i++) {
|
||||
s += (isBroken(i,j) ? "_" : "X");
|
||||
}
|
||||
s += "\n";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Affichage de la barre de choco en ligne.
|
||||
**/
|
||||
public abstract String toLine();
|
||||
|
||||
/**
|
||||
* Méthode par défaut
|
||||
*/
|
||||
public String toString()
|
||||
{
|
||||
return toLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le carre (x, y) est déjà mangé.
|
||||
**/
|
||||
protected abstract boolean isBroken(int cX, int cY);
|
||||
|
||||
/**
|
||||
* Comparaison de barres.
|
||||
**/
|
||||
public abstract boolean equals(ChocoBar comp);
|
||||
|
||||
/**
|
||||
* Recherche si l'on peut être un fils de la ChocoBar.
|
||||
*/
|
||||
public abstract boolean isNextOf(ChocoBar parent);
|
||||
|
||||
/** Calcul du nombre de combinaisons.
|
||||
* Cette fonction est récursive pour calculer le nombre de combinaisons.
|
||||
* C'est correct en attendant une formule mathématique plus rapide.
|
||||
*/
|
||||
protected static int nbChocoBars(int n, int m)
|
||||
{
|
||||
if (n == 1) {
|
||||
return (m + 1);
|
||||
}
|
||||
|
||||
int nb = 0;
|
||||
for (int i=m; (i>=0); i--) {
|
||||
nb += nbChocoBars(n - 1, i);
|
||||
}
|
||||
|
||||
return nb;
|
||||
}
|
||||
|
||||
// Implémentation de Vertice
|
||||
public void setLabel(String l) { }
|
||||
public String getLabel() { return "null"; }
|
||||
public void setColor(int c) { }
|
||||
public int getColor() { return 0; }
|
||||
}
|
BIN
src/chocobar/combi/ChocoBarArray.class
Normal file
BIN
src/chocobar/combi/ChocoBarArray.class
Normal file
Binary file not shown.
201
src/chocobar/combi/ChocoBarArray.java
Normal file
201
src/chocobar/combi/ChocoBarArray.java
Normal file
|
@ -0,0 +1,201 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
import conf.ChocoConfig;
|
||||
|
||||
class ChocoBarArray extends ChocoBar {
|
||||
char points[];
|
||||
|
||||
/**
|
||||
* Constructeur d'une barre de choco ayant x carres en largeur
|
||||
* et y carres en hauteur, toute neuve.
|
||||
**/
|
||||
private ChocoBarArray()
|
||||
{
|
||||
points = new char[size];
|
||||
for (int i=0; (i<size); i++) {
|
||||
points[i] = (char) height;
|
||||
}
|
||||
}
|
||||
|
||||
/** Constructeur par copie.
|
||||
*/
|
||||
private ChocoBarArray(ChocoBarArray old)
|
||||
{
|
||||
points = new char[size];
|
||||
for (int i=0; (i<size); i++) {
|
||||
points[i] = old.points[i];
|
||||
}
|
||||
}
|
||||
|
||||
/** Constructeur par initialisation
|
||||
*/
|
||||
private ChocoBarArray(char p[])
|
||||
{
|
||||
points = new char[size];
|
||||
for (int i=0; (i<size); i++) {
|
||||
points[i] = p[i];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Affichage de la barre de choco en ligne.
|
||||
**/
|
||||
public String toLine()
|
||||
{
|
||||
String s = "";
|
||||
for (int i=0; (i<size); i++) {
|
||||
s += (int)points[i] + " ";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return toLine();
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le carre (x, y) est déjà mangé.
|
||||
**/
|
||||
protected boolean isBroken(int cX, int cY)
|
||||
{
|
||||
// We are inside what's defined
|
||||
return ((height - cY) <= points[cX]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Comparaison de barres.
|
||||
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||
**/
|
||||
public boolean equals(ChocoBar comp) { return equals((ChocoBarArray) comp); }
|
||||
public boolean equals(ChocoBarArray comp)
|
||||
{
|
||||
// If the other bar is null we're not equal, since
|
||||
// we're obviously not null ;-)
|
||||
if (comp==null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// not the same size, isn't the same
|
||||
if (comp.size != size || comp.height != height) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// We don't have a choice now... doing it the hard way
|
||||
for (int i=0; (i<size); i++) {
|
||||
if (comp.points[i] != points[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// If we arrive here... it's the same !
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Recherche si l'on peut être un fils de la ChocoBar.
|
||||
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||
*/
|
||||
public boolean isNextOf(ChocoBar parent) { return isNextOf((ChocoBarArray) parent); }
|
||||
public boolean isNextOf(ChocoBarArray parent)
|
||||
{
|
||||
int eaten = -1;
|
||||
for (int i=0; (i<size); i++) {
|
||||
// Si le parent est plus mangé que le fils, c'est toujours non !
|
||||
if (parent.points[i] > points[i]) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (eaten == -1) {
|
||||
if (parent.points[i] != points[i]) {
|
||||
// On a mangé ce carré, les carrés suivants doivent donc être
|
||||
// identiquent à celui-ci ou à celui du père
|
||||
eaten = points[i];
|
||||
// On a traité ce carré, on passe au suivant
|
||||
continue;
|
||||
}
|
||||
// Le carré est identique, suivant !
|
||||
continue;
|
||||
}
|
||||
|
||||
// On a mangé le carré précédent, ils doivent donc être
|
||||
// identiques au point précédents, ou à celui que l'on vient de
|
||||
// manger
|
||||
if (parent.points[i] != points[i] && points[i] != eaten) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Si on arrive ici, c'est que tout c'est bien passé, a-t-on un carré
|
||||
// mangé ?
|
||||
return (eaten != -1);
|
||||
}
|
||||
|
||||
/** Usine pour construire une liste de ChocoBar.
|
||||
* Cette usine contruit une liste exhaustive et ordonnée de ChocoBar.
|
||||
*/
|
||||
public static ChocoBar[] genChocoBars(int x, int y)
|
||||
{
|
||||
// On mets à jour les variables statiques de taille
|
||||
ChocoBarArray.size = x;
|
||||
ChocoBarArray.height = y;
|
||||
|
||||
// Calcul du nombre de chocobars différentes existantes
|
||||
int nbChocobars = nbChocoBars(x, y);
|
||||
|
||||
// Hop, on réserve le tableau de résultat...
|
||||
ChocoBar[] chocoBars = new ChocoBar[nbChocobars];
|
||||
|
||||
// Il est temps de remplir le tableau !
|
||||
|
||||
// Création du tableau pour stocker les valeurs
|
||||
char[] points = new char[x];
|
||||
|
||||
boolean fin = false;
|
||||
int cbIdx = 0;
|
||||
while (!fin) {
|
||||
// Affectation
|
||||
chocoBars[cbIdx] = new ChocoBarArray(points);
|
||||
cbIdx++;
|
||||
|
||||
// Calcul du suivant :
|
||||
|
||||
// On incrémente ...
|
||||
int idx = x-1;
|
||||
points[idx] ++;
|
||||
|
||||
// ... et on gère la retenue
|
||||
boolean overflow = (points[idx] > y);
|
||||
while (points[idx] > y) {
|
||||
if (idx == 0) {
|
||||
fin = true;
|
||||
break;
|
||||
}
|
||||
points[idx-1] ++;
|
||||
idx--;
|
||||
}
|
||||
// On répercute la modif vers la droite s'il y a eu overflow
|
||||
if (overflow) {
|
||||
for (int i=idx; (i<x); i++) {
|
||||
points[i] = points[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return chocoBars;
|
||||
}
|
||||
|
||||
public static ChocoBar[] genChocoBars(Integer x, Integer y)
|
||||
{
|
||||
return genChocoBars(x.intValue(), y.intValue());
|
||||
}
|
||||
|
||||
|
||||
// Implémentation de Vertice
|
||||
|
||||
public void setLabel(String l) { }
|
||||
public String getLabel() { return "null"; }
|
||||
public void setColor(int c) { }
|
||||
public int getColor() { return 0; }
|
||||
}
|
BIN
src/chocobar/combi/ChocoBarBigInt.class
Normal file
BIN
src/chocobar/combi/ChocoBarBigInt.class
Normal file
Binary file not shown.
163
src/chocobar/combi/ChocoBarBigInt.java
Normal file
163
src/chocobar/combi/ChocoBarBigInt.java
Normal file
|
@ -0,0 +1,163 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
class ChocoBarBigInt extends ChocoBar {
|
||||
static private BigInteger[] powers;
|
||||
private BigInteger points;
|
||||
|
||||
/**
|
||||
* Constructeur d'une barre de choco.
|
||||
* Elle a x carres en largeur et y carres en hauteur, et est toute neuve.
|
||||
**/
|
||||
private ChocoBarBigInt()
|
||||
{
|
||||
points = new BigInteger("0");
|
||||
}
|
||||
|
||||
/** Constructeur par copie.
|
||||
*/
|
||||
private ChocoBarBigInt(ChocoBarBigInt old)
|
||||
{
|
||||
points = old.points;
|
||||
}
|
||||
|
||||
/** Constructeur par initialisation.
|
||||
*/
|
||||
private ChocoBarBigInt(BigInteger bi)
|
||||
{
|
||||
points = bi;
|
||||
}
|
||||
|
||||
/** Constructeur par initialisation.
|
||||
*/
|
||||
private ChocoBarBigInt(char c[])
|
||||
{
|
||||
points = new BigInteger("0");
|
||||
for (int i=0; (i<size); i++) {
|
||||
points.add(powers[i].multiply(new BigInteger("" + (int)c[i])));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Affichage de la barre de choco en ligne.
|
||||
**/
|
||||
public String toLine()
|
||||
{
|
||||
String s = "";
|
||||
BigInteger bi = points;
|
||||
for (int i=0; (i<size); i++) {
|
||||
s += get(i) + " ";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
private int get(int x)
|
||||
{
|
||||
BigInteger rest = points.pow(x);
|
||||
BigInteger value = (rest.mod(ChocoBarBigInt.powers[x+1])).divide(powers[x]);
|
||||
return value.intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le carre (x, y) est déjà mangé.
|
||||
**/
|
||||
protected boolean isBroken(int cX, int cY)
|
||||
{
|
||||
return ((height - cY) <= get(cX));
|
||||
}
|
||||
|
||||
/**
|
||||
* Comparaison de barres.
|
||||
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||
**/
|
||||
public boolean equals(ChocoBar comp) { return equals((ChocoBarBigInt) comp); }
|
||||
public boolean equals(ChocoBarBigInt comp)
|
||||
{
|
||||
return points.equals(comp.points);
|
||||
}
|
||||
|
||||
/** Recherche si l'on peut être un fils de la ChocoBar.
|
||||
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||
*/
|
||||
public boolean isNextOf(ChocoBar parent) { return isNextOf((ChocoBarBigInt) parent); }
|
||||
public boolean isNextOf(ChocoBarBigInt parent)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Usine pour construire une liste de ChocoBar.
|
||||
* Cette usine contruit une liste exhaustive et ordonnée de ChocoBar.
|
||||
*/
|
||||
public static ChocoBar[] genChocoBars(int x, int y)
|
||||
{
|
||||
// On mets à jour les variables statiques de taille
|
||||
ChocoBarBigInt.size = x;
|
||||
ChocoBarBigInt.height = y;
|
||||
// Précalcul des puissances
|
||||
ChocoBarBigInt.powers = new BigInteger[x+1];
|
||||
BigInteger bi = new BigInteger("1");
|
||||
for (int i=0; (i<=x); i++) {
|
||||
ChocoBarBigInt.powers[i] = bi;
|
||||
bi = bi.multiply(new BigInteger("" + y));
|
||||
}
|
||||
|
||||
// Calcul du nombre de chocobars différentes existantes
|
||||
int nbChocobars = nbChocoBars(x, y);
|
||||
|
||||
// Hop, on réserve le tableau de résultat...
|
||||
ChocoBar[] chocoBars = new ChocoBar[nbChocobars];
|
||||
|
||||
// Il est temps de remplir le tableau !
|
||||
|
||||
// Création du tableau pour stocker les valeurs
|
||||
char[] points = new char[x];
|
||||
|
||||
|
||||
boolean fin = false;
|
||||
int cbIdx = 0;
|
||||
while (!fin) {
|
||||
// Affectation
|
||||
chocoBars[cbIdx] = new ChocoBarBigInt(points);
|
||||
cbIdx++;
|
||||
|
||||
// Calcul du suivant :
|
||||
|
||||
// On incrémente ...
|
||||
int idx = x-1;
|
||||
points[idx] ++;
|
||||
|
||||
// ... et on gère la retenue
|
||||
boolean overflow = (points[idx] > y);
|
||||
while (points[idx] > y) {
|
||||
if (idx == 0) {
|
||||
fin = true;
|
||||
break;
|
||||
}
|
||||
points[idx-1] ++;
|
||||
idx--;
|
||||
}
|
||||
// On répercute la modif vers la droite s'il y a eu overflow
|
||||
if (overflow) {
|
||||
for (int i=idx; (i<x); i++) {
|
||||
points[i] = points[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return chocoBars;
|
||||
}
|
||||
|
||||
public static ChocoBar[] genChocoBars(Integer x, Integer y)
|
||||
{
|
||||
return genChocoBars(x.intValue(), y.intValue());
|
||||
}
|
||||
|
||||
|
||||
// Implémentation de Vertice
|
||||
|
||||
public void setLabel(String l) { }
|
||||
public String getLabel() { return "null"; }
|
||||
public void setColor(int c) { }
|
||||
public int getColor() { return 0; }
|
||||
}
|
BIN
src/chocobar/combi/ChocoBarLong.class
Normal file
BIN
src/chocobar/combi/ChocoBarLong.class
Normal file
Binary file not shown.
223
src/chocobar/combi/ChocoBarLong.java
Normal file
223
src/chocobar/combi/ChocoBarLong.java
Normal file
|
@ -0,0 +1,223 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.lang.Long;
|
||||
|
||||
class ChocoBarLong extends ChocoBar {
|
||||
/// Précalcul des puissances.
|
||||
static private long[] powers;
|
||||
|
||||
/// Représente la ChocoBar
|
||||
private long points;
|
||||
|
||||
/**
|
||||
* Constructeur d'une barre de choco.
|
||||
* Elle a x carres en largeur et y carres en hauteur, et est toute neuve.
|
||||
**/
|
||||
private ChocoBarLong()
|
||||
{
|
||||
points = 0;
|
||||
}
|
||||
|
||||
/** Constructeur par copie.
|
||||
*/
|
||||
private ChocoBarLong(ChocoBarLong old)
|
||||
{
|
||||
points = old.points;
|
||||
}
|
||||
|
||||
/** Constructeur par initialisation.
|
||||
*/
|
||||
private ChocoBarLong(long bi)
|
||||
{
|
||||
points = bi;
|
||||
}
|
||||
|
||||
/** Constructeur par initialisation.
|
||||
*/
|
||||
private ChocoBarLong(int c[])
|
||||
{
|
||||
points = 0;
|
||||
for (int i=0; (i<size); i++) {
|
||||
points += powers[i] * c[size-i-1];
|
||||
}
|
||||
// XXX - DEBUG
|
||||
// System.out.println(
|
||||
// "ChocoBarLong(" + toLine(c) + ")"
|
||||
// + " = " + toLine()
|
||||
// + " = " + toNumber()
|
||||
// );
|
||||
// XXX - DEBUG
|
||||
}
|
||||
|
||||
/**
|
||||
* Affichage de la barre de choco en nombre.
|
||||
**/
|
||||
public String toNumber()
|
||||
{
|
||||
String s = (new Long(points)).toString();
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Affichage de la barre de choco en ligne.
|
||||
**/
|
||||
public String toLine()
|
||||
{
|
||||
String s = "";
|
||||
for (int i=0; (i<size); i++) {
|
||||
s += get(i) + " ";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Affichage de la barre de choco en ligne.
|
||||
**/
|
||||
private static String toLine(int c[])
|
||||
{
|
||||
String s = "";
|
||||
for (int i=0; (i<size); i++) {
|
||||
s += c[i] + " ";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
private int get(int x)
|
||||
{
|
||||
int i = (size - 1) - x;
|
||||
long value = (points % powers[i+1]) / powers[i];
|
||||
return (int) value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifie si le carre (x, y) est déjà mangé.
|
||||
**/
|
||||
protected boolean isBroken(int cX, int cY)
|
||||
{
|
||||
return ((height - cY) <= get(cX));
|
||||
}
|
||||
|
||||
/**
|
||||
* Comparaison de barres.
|
||||
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||
**/
|
||||
public boolean equals(ChocoBar comp) { return equals((ChocoBarLong) comp); }
|
||||
public boolean equals(ChocoBarLong comp)
|
||||
{
|
||||
return points == comp.points;
|
||||
}
|
||||
|
||||
/** Recherche si l'on peut être un fils de la ChocoBar.
|
||||
* La conversion entre type de ChocoBar n'est pas implémentée
|
||||
*/
|
||||
public boolean isNextOf(ChocoBar parent) { return isNextOf((ChocoBarLong) parent); }
|
||||
public boolean isNextOf(ChocoBarLong parent)
|
||||
{
|
||||
// TODO - Il faudrait améliorer cet algo, en fonction des données que
|
||||
// Long peut nous offrir
|
||||
int eaten = -1;
|
||||
for (int i=0; (i<size); i++) {
|
||||
// Si le parent est plus mangé que le fils, c'est toujours non !
|
||||
if (parent.get(i) > get(i)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (eaten == -1) {
|
||||
if (parent.get(i) != get(i)) {
|
||||
// On a mangé ce carré, les carrés suivants doivent donc être
|
||||
// identiquent à celui-ci ou à celui du père
|
||||
eaten = get(i);
|
||||
// On a traité ce carré, on passe au suivant
|
||||
continue;
|
||||
}
|
||||
// Le carré est identique, suivant !
|
||||
continue;
|
||||
}
|
||||
|
||||
// On a mangé le carré précédent, ils doivent donc être
|
||||
// identiques au point précédents, ou à celui que l'on vient de
|
||||
// manger
|
||||
if (parent.get(i) != get(i) && get(i) != eaten) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Si on arrive ici, c'est que tout c'est bien passé, a-t-on un carré
|
||||
// mangé ?
|
||||
return (eaten != -1);
|
||||
}
|
||||
|
||||
/** Usine pour construire une liste de ChocoBar.
|
||||
* Cette usine contruit une liste exhaustive et ordonnée de ChocoBar.
|
||||
*/
|
||||
public static ChocoBar[] genChocoBars(int x, int y)
|
||||
{
|
||||
// On mets à jour les variables statiques de taille
|
||||
ChocoBarLong.size = x;
|
||||
ChocoBarLong.height = y;
|
||||
// Précalcul des puissances
|
||||
long pows = 1;
|
||||
ChocoBarLong.powers = new long[x+1];
|
||||
for (int i=0; (i<=x); i++) {
|
||||
ChocoBarLong.powers[i] = pows;
|
||||
pows *= y + 1;
|
||||
}
|
||||
|
||||
// Calcul du nombre de chocobars différentes existantes
|
||||
int nbChocobars = nbChocoBars(x, y);
|
||||
|
||||
// Hop, on réserve le tableau de résultat...
|
||||
ChocoBar[] chocoBars = new ChocoBar[nbChocobars];
|
||||
|
||||
// Il est temps de remplir le tableau !
|
||||
|
||||
// Création du tableau pour stocker les valeurs
|
||||
int[] points = new int[x];
|
||||
|
||||
boolean fin = false;
|
||||
int cbIdx = 0;
|
||||
while (!fin) {
|
||||
// Affectation
|
||||
chocoBars[cbIdx] = new ChocoBarLong(points);
|
||||
cbIdx++;
|
||||
|
||||
// Calcul du suivant :
|
||||
|
||||
// On incrémente ...
|
||||
int idx = x-1;
|
||||
points[idx] ++;
|
||||
|
||||
// ... et on gère la retenue
|
||||
boolean overflow = (points[idx] > y);
|
||||
while (points[idx] > y) {
|
||||
if (idx == 0) {
|
||||
fin = true;
|
||||
break;
|
||||
}
|
||||
points[idx-1] ++;
|
||||
idx--;
|
||||
}
|
||||
// On répercute la modif vers la droite s'il y a eu overflow
|
||||
if (overflow) {
|
||||
for (int i=idx; (i<x); i++) {
|
||||
points[i] = points[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return chocoBars;
|
||||
}
|
||||
|
||||
public static ChocoBar[] genChocoBars(Integer x, Integer y)
|
||||
{
|
||||
return genChocoBars(x.intValue(), y.intValue());
|
||||
}
|
||||
|
||||
|
||||
// Implémentation de Vertice
|
||||
|
||||
public void setLabel(String l) { }
|
||||
public String getLabel() { return "null"; }
|
||||
public void setColor(int c) { }
|
||||
public int getColor() { return 0; }
|
||||
}
|
BIN
src/chocobar/combi/ChocoBarSet.class
Normal file
BIN
src/chocobar/combi/ChocoBarSet.class
Normal file
Binary file not shown.
57
src/chocobar/combi/ChocoBarSet.java
Normal file
57
src/chocobar/combi/ChocoBarSet.java
Normal file
|
@ -0,0 +1,57 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import graph.Vertice;
|
||||
|
||||
/**
|
||||
* Classe pour encapsuler le Vertices.
|
||||
*/
|
||||
final class ChocoBarSet implements VerticeSet
|
||||
{
|
||||
ChocoBar[] cbList;
|
||||
int size;
|
||||
|
||||
/**
|
||||
* Constructeur
|
||||
*/
|
||||
ChocoBarSet(ChocoBar[] cl)
|
||||
{
|
||||
cbList = cl;
|
||||
size = cl.length;
|
||||
}
|
||||
|
||||
public ChocoBar item(int idx)
|
||||
{
|
||||
return cbList[idx];
|
||||
}
|
||||
|
||||
// Implémentation de VerticeSet
|
||||
public Vertice elementAt(int idx)
|
||||
{
|
||||
return cbList[idx];
|
||||
}
|
||||
|
||||
/** Recherche de l'id d'un vertice.
|
||||
* Renvoie -1 si on ne le trouve pas
|
||||
*/
|
||||
public int getIdOf(Vertice v)
|
||||
{
|
||||
// On parcoure tout le tableau
|
||||
for (int i=0; (i<size); i++) {
|
||||
if (v.equals(cbList[i])) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
// On ne l'a pas trouvé, on retourne -1
|
||||
return -1;
|
||||
}
|
||||
|
||||
public boolean contains(Vertice v)
|
||||
{
|
||||
return (getIdOf(v) != -1);
|
||||
}
|
||||
|
||||
public int size()
|
||||
{
|
||||
return this.size;
|
||||
}
|
||||
}
|
BIN
src/chocobar/combi/ChocoGraph.class
Normal file
BIN
src/chocobar/combi/ChocoGraph.class
Normal file
Binary file not shown.
92
src/chocobar/combi/ChocoGraph.java
Normal file
92
src/chocobar/combi/ChocoGraph.java
Normal file
|
@ -0,0 +1,92 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.util.*;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.ClassNotFoundException;
|
||||
import java.lang.NoSuchMethodException;
|
||||
import java.lang.IllegalAccessException;
|
||||
|
||||
import chocobar.GenericChocoGraph;
|
||||
import graph.GenericGraph;
|
||||
import conf.ChocoConfig;
|
||||
|
||||
public class ChocoGraph implements GenericChocoGraph
|
||||
{
|
||||
static int width;
|
||||
static int height;
|
||||
Graph configGraph;
|
||||
|
||||
/**
|
||||
* Constructeur d'un graphe de jeu de Chocobar avec les barres
|
||||
* de taille (width * height)
|
||||
**/
|
||||
public ChocoGraph()
|
||||
{
|
||||
this.width=ChocoConfig.size;
|
||||
this.height=ChocoConfig.height;
|
||||
this.configGraph=null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generation du graphe de jeu.
|
||||
**/
|
||||
public GenericGraph genChoco(boolean isList)
|
||||
{
|
||||
// Création des Vectors
|
||||
ChocoBar[] cBars;
|
||||
|
||||
try {
|
||||
// Recherche du bon ChocoBar
|
||||
Class cCBM = Class.forName("chocobar."+ChocoConfig.chocoBarModel);
|
||||
Class[] paramsType = {Class.forName("java.lang.Integer"), Class.forName("java.lang.Integer")};
|
||||
|
||||
Method genChocoBars = cCBM.getMethod("genChocoBars", paramsType);
|
||||
Object[] paramsValue = {new Integer(width), new Integer(height)};
|
||||
cBars = (chocobar.combi.ChocoBar[]) genChocoBars.invoke(null, paramsValue);
|
||||
|
||||
ChocoBarSet cbs = new ChocoBarSet(cBars);
|
||||
|
||||
// Création de l'objet Graph
|
||||
configGraph = new Graph();
|
||||
configGraph.setSize(cbs.size());
|
||||
|
||||
// Création des Noeuds
|
||||
// On sait que les noeud fils sont forcément *après* les noeuds pères.
|
||||
for (int i=0; (i<cbs.size()); i++) {
|
||||
for (int j=i+1; (j<cbs.size()); j++) {
|
||||
if (cbs.item(j).isNextOf(cbs.item(i))) {
|
||||
// le j-ieme est le fils du i-eme
|
||||
configGraph.addEdge(i,j);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
/*
|
||||
} catch (ClassNotFoundException e) {
|
||||
} catch (NoSuchMethodException e) {
|
||||
} catch (IllegalAccessException e) {
|
||||
*/
|
||||
}
|
||||
|
||||
return configGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie le graph de cet objet
|
||||
**/
|
||||
public Graph getGraph()
|
||||
{
|
||||
return this.configGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui affiche tous les ChocoBar dans ce graphe
|
||||
**/
|
||||
public void displayAll(){
|
||||
System.out.println("ChocoGraph:displayAll()");
|
||||
}
|
||||
|
||||
/** Usine pour la construction du graph.
|
||||
*/
|
||||
}
|
BIN
src/chocobar/combi/EdgeBigIntModel.class
Normal file
BIN
src/chocobar/combi/EdgeBigIntModel.class
Normal file
Binary file not shown.
228
src/chocobar/combi/EdgeBigIntModel.java
Normal file
228
src/chocobar/combi/EdgeBigIntModel.java
Normal file
|
@ -0,0 +1,228 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.util.*; // listes
|
||||
import java.math.BigInteger;
|
||||
|
||||
import exception.*;
|
||||
|
||||
public class EdgeBigIntModel implements EdgeModel {
|
||||
private int cardV;
|
||||
|
||||
// Bit Array of (x, y) -> (x * cardV + y)
|
||||
private BigInteger adjacent;
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
**/
|
||||
public EdgeBigIntModel() {
|
||||
this(10);
|
||||
this.cardV=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor with card (number of vertices) as a parameter
|
||||
**/
|
||||
public EdgeBigIntModel(int card) {
|
||||
this.cardV=card;
|
||||
this.adjacent=new BigInteger("0");
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.cardV;
|
||||
}
|
||||
|
||||
/** Fonction qui réinitialise à la taille donnée.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
cardV=size;
|
||||
adjacent=new BigInteger("0");
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc partant du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public void addEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||
// rajoute un arc n'importe quoi
|
||||
{
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
adjacent.setBit(srcV * cardV + dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc partant du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public void delEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||
// rajoute un arc n'importe quoi
|
||||
{
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
adjacent.clearBit(srcV * cardV + dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV,int dstV){
|
||||
return adjacent.testBit(srcV * cardV + dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int src, Vector dst){
|
||||
Collection srcAdj = getAdjacent(src);
|
||||
int taille = srcAdj.size();
|
||||
int adj=-1;
|
||||
Object[] adjacents=srcAdj.toArray();
|
||||
|
||||
if (taille>dst.size()){
|
||||
//y a des sommets qui ne sont pas dans le tableau
|
||||
return -1;
|
||||
} else {
|
||||
for (int i=0; i<taille; i++){
|
||||
if (!dst.contains(adjacents[i])){
|
||||
return -1;
|
||||
} else {
|
||||
if (adj==-1){
|
||||
adj=((Integer)adjacents[i]).intValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return adj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getSourceVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (isEdge(j, i)){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!isEdge(i, j)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (isEdge(j, i)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=i+1; j<this.cardV; j++){
|
||||
if (isEdge(i, j)){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (isEdge(i, j)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!isEdge(j, i)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||
**/
|
||||
public Collection getAdjacent(int srcV){
|
||||
LinkedList res=new LinkedList();
|
||||
for (int i=0; i<cardV; i++){
|
||||
if (isEdge(srcV, i))
|
||||
res.add(new Integer(i));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public Collection getIncident(int dstV){
|
||||
//TODO: écrire la méthode !!!
|
||||
return new Vector();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui efface tous les arcs du graphe
|
||||
**/
|
||||
public void clear()
|
||||
{
|
||||
adjacent = new BigInteger("0");
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui cree tous les arcs possibles du graphe
|
||||
**/
|
||||
public void fill(){
|
||||
// we add edges between every vertice
|
||||
for (int i=0; i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
try { addEdge(i, j); } catch (OutOfRangeVerticeException e) { }
|
||||
}
|
||||
}
|
||||
// but a vertice cannot have an edge to itself
|
||||
for (int i=0;i<this.cardV;i++){
|
||||
try { delEdge(i, i); } catch (OutOfRangeVerticeException e) { }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||
* les arcs sont encore VIDE
|
||||
**/
|
||||
public void addVertice()
|
||||
{
|
||||
}
|
||||
|
||||
public void removeVerticeAt(int rmIdx)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
BIN
src/chocobar/combi/EdgeBitSetModel.class
Normal file
BIN
src/chocobar/combi/EdgeBitSetModel.class
Normal file
Binary file not shown.
227
src/chocobar/combi/EdgeBitSetModel.java
Normal file
227
src/chocobar/combi/EdgeBitSetModel.java
Normal file
|
@ -0,0 +1,227 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.util.*; // listes
|
||||
|
||||
import exception.*;
|
||||
|
||||
public class EdgeBitSetModel implements EdgeModel {
|
||||
private int cardV;
|
||||
|
||||
// Bit Array of (x, y) -> (x * cardV + y)
|
||||
private BitSet adjacent;
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
**/
|
||||
public EdgeBitSetModel() {
|
||||
this(10);
|
||||
this.cardV=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor with card (number of vertices) as a parameter
|
||||
**/
|
||||
public EdgeBitSetModel(int card) {
|
||||
this.cardV=card;
|
||||
this.adjacent=new BitSet(0, (long)card * card);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.cardV;
|
||||
}
|
||||
|
||||
/** Fonction qui réinitialise à la taille donnée.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
cardV=size;
|
||||
adjacent=new BitSet(0, (long)size * size);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc partant du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public void addEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||
// rajoute un arc n'importe quoi
|
||||
{
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
adjacent.setBit(srcV * cardV + dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc partant du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public void delEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||
// rajoute un arc n'importe quoi
|
||||
{
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
adjacent.clearBit(srcV * cardV + dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV,int dstV){
|
||||
return adjacent.testBit(srcV * cardV + dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int src, Vector dst){
|
||||
Collection srcAdj = getAdjacent(src);
|
||||
int taille = srcAdj.size();
|
||||
int adj=-1;
|
||||
Object[] adjacents=srcAdj.toArray();
|
||||
|
||||
if (taille>dst.size()){
|
||||
//y a des sommets qui ne sont pas dans le tableau
|
||||
return -1;
|
||||
} else {
|
||||
for (int i=0; i<taille; i++){
|
||||
if (!dst.contains(adjacents[i])){
|
||||
return -1;
|
||||
} else {
|
||||
if (adj==-1){
|
||||
adj=((Integer)adjacents[i]).intValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return adj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getSourceVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (isEdge(j, i)){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!isEdge(i, j)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (isEdge(j, i)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=i+1; j<this.cardV; j++){
|
||||
if (isEdge(i, j)){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (isEdge(i, j)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!isEdge(j, i)){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||
**/
|
||||
public Collection getAdjacent(int srcV){
|
||||
LinkedList res=new LinkedList();
|
||||
for (int i=0; i<cardV; i++){
|
||||
if (isEdge(srcV, i))
|
||||
res.add(new Integer(i));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public Collection getIncident(int dstV){
|
||||
//TODO: écrire la méthode !!!
|
||||
return new Vector();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui efface tous les arcs du graphe
|
||||
**/
|
||||
public void clear()
|
||||
{
|
||||
adjacent = new BitSet(0, (long)cardV * cardV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui cree tous les arcs possibles du graphe
|
||||
**/
|
||||
public void fill(){
|
||||
// we add edges between every vertice
|
||||
for (int i=0; i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
try { addEdge(i, j); } catch (OutOfRangeVerticeException e) { }
|
||||
}
|
||||
}
|
||||
// but a vertice cannot have an edge to itself
|
||||
for (int i=0;i<this.cardV;i++){
|
||||
try { delEdge(i, i); } catch (OutOfRangeVerticeException e) { }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||
* les arcs sont encore VIDE
|
||||
**/
|
||||
public void addVertice()
|
||||
{
|
||||
}
|
||||
|
||||
public void removeVerticeAt(int rmIdx)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
BIN
src/chocobar/combi/EdgeListModel.class
Normal file
BIN
src/chocobar/combi/EdgeListModel.class
Normal file
Binary file not shown.
248
src/chocobar/combi/EdgeListModel.java
Normal file
248
src/chocobar/combi/EdgeListModel.java
Normal file
|
@ -0,0 +1,248 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.util.*; // listes
|
||||
|
||||
import exception.*;
|
||||
|
||||
class EdgeListModel implements EdgeModel {
|
||||
private HashMap[] adjacent;
|
||||
private HashMap[] incident;
|
||||
private int cardV;
|
||||
|
||||
/**
|
||||
* Constructeur par defaut
|
||||
**/
|
||||
public EdgeListModel(){
|
||||
this(10);
|
||||
this.cardV=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur d'un modele de graphe avec nbVertices sommets
|
||||
**/
|
||||
public EdgeListModel(int nbVertices){
|
||||
if (nbVertices>=0){
|
||||
this.cardV=nbVertices;
|
||||
this.adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||
this.incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie le nombre de sommets de cette liste
|
||||
* d'adjacence
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.cardV;
|
||||
}
|
||||
|
||||
/** Fonction qui réinitialise à la taille donnée.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
cardV=size;
|
||||
adjacent=new HashMap[this.cardV+(this.cardV/3)];
|
||||
incident=new HashMap[this.cardV+(this.cardV/3)];
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc de srcV vers dstV
|
||||
**/
|
||||
public void addEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
{
|
||||
// on vérifie que les arcs ajoutés joignent des
|
||||
// sommets existants dans le graphe
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
} else {
|
||||
if (this.adjacent[srcV]==null){
|
||||
this.adjacent[srcV]=new HashMap();
|
||||
}
|
||||
if (this.incident[dstV]==null){
|
||||
this.incident[dstV]=new HashMap();
|
||||
}
|
||||
HashMap srcList=this.adjacent[srcV];
|
||||
HashMap dstList=this.incident[dstV];
|
||||
Integer d=new Integer(dstV);
|
||||
Integer s=new Integer(srcV);
|
||||
if (!srcList.containsKey(d)){srcList.put(d,null);}
|
||||
if (!dstList.containsKey(s)){dstList.put(s,null);}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie s'il existe un arc
|
||||
* de srcV vers dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV,int dstV){
|
||||
if (this.adjacent[srcV]==null){
|
||||
return false;
|
||||
}
|
||||
//works too with incident...
|
||||
HashMap srcAdj=this.adjacent[srcV];
|
||||
if (srcAdj.containsKey(new Integer(dstV))){ return true; }
|
||||
else { return false; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int src, Vector dst){
|
||||
HashMap srcAdj=this.adjacent[src];
|
||||
int taille=srcAdj.size();
|
||||
int adj=-1;
|
||||
Object[] adjacents=srcAdj.keySet().toArray();
|
||||
|
||||
if (taille>dst.size()){
|
||||
//y a des sommets qui ne sont pas dans le tableau
|
||||
return -1;
|
||||
} else {
|
||||
for (int i=0; i<taille; i++){
|
||||
if (!dst.contains(adjacents[i])){
|
||||
return -1;
|
||||
} else {
|
||||
if (adj==-1){
|
||||
adj=((Integer)adjacents[i]).intValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return adj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||
**/
|
||||
public int getSourceVertice(){
|
||||
int i = -1;
|
||||
if ((this.cardV != 0)&&(this.incident != null)){
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.incident[j]==null){
|
||||
i=j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalVertice(){
|
||||
int i = -1;
|
||||
if ((this.cardV != 0)&&(this.adjacent != null)){
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[j]==null){
|
||||
i=j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public Collection getAdjacent(int srcV){
|
||||
HashMap adj= this.adjacent[srcV];
|
||||
if (adj==null){ return null; }
|
||||
else { return adj.keySet(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie le premier sommet adjacent a srcV
|
||||
**/
|
||||
public int getFirstAdjacentVertice(int srcV){
|
||||
Iterator i=this.adjacent[srcV].keySet().iterator();
|
||||
return ((Integer)i.next()).intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste de sommets ayant un arc vers
|
||||
* sommet dstV
|
||||
**/
|
||||
public Collection getIncident(int dstV){
|
||||
HashMap inc= this.incident[dstV];
|
||||
if (inc==null){ return null; }
|
||||
else { return inc.keySet(); }
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui enleve tous les arcs du graphe
|
||||
**/
|
||||
public void clear(){
|
||||
for (int i=0; i<cardV; i++){
|
||||
this.adjacent[i].clear();
|
||||
this.incident[i].clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute tous les arcs possibles du graphe
|
||||
**/
|
||||
public void fill(){
|
||||
for (int src=0; src<cardV; src++){
|
||||
for (int dst=0; dst<cardV; dst++){
|
||||
if (src==dst) {
|
||||
continue;
|
||||
} else {
|
||||
if (this.adjacent[src]==null){
|
||||
this.adjacent[src]=new HashMap();
|
||||
}
|
||||
if (this.incident[dst]==null){
|
||||
this.adjacent[dst]=new HashMap();
|
||||
}
|
||||
HashMap srcList=this.adjacent[src];
|
||||
HashMap dstList=this.incident[dst];
|
||||
srcList.put(new Integer(dst),null);
|
||||
dstList.put(new Integer(src),null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un vertice a la fin de table d'adjacence
|
||||
* Liste d'adjacence de ce nouveau vertice est encore VIDE
|
||||
**/
|
||||
public void addVertice(){
|
||||
// Verify that we have enough free space
|
||||
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||
System.out.println("ADDVERTICE: duplicating size: "+ this.cardV+"/"+this.adjacent.length+"...");
|
||||
int extra=2*this.adjacent.length;
|
||||
HashMap[] adjCopy = new HashMap[this.adjacent.length + extra];
|
||||
HashMap[] incCopy = new HashMap[this.adjacent.length + extra];
|
||||
System.arraycopy(this.adjacent,0,adjCopy,0,this.adjacent.length);
|
||||
System.arraycopy(this.incident,0,incCopy,0,this.incident.length);
|
||||
this.adjacent=adjCopy;
|
||||
this.incident=incCopy;
|
||||
System.out.println("ADDVERTICE: duplicating done.");
|
||||
}
|
||||
this.cardV++;
|
||||
}
|
||||
|
||||
public void removeVerticeAt(int index)
|
||||
throws OutOfRangeVerticeException{
|
||||
//TODO: écrire!!!
|
||||
/*
|
||||
if (index >= this.cardV){
|
||||
throw (new OutOfRangeVerticeException());
|
||||
} else {
|
||||
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
BIN
src/chocobar/combi/EdgeMatrixModel.class
Normal file
BIN
src/chocobar/combi/EdgeMatrixModel.class
Normal file
Binary file not shown.
251
src/chocobar/combi/EdgeMatrixModel.java
Normal file
251
src/chocobar/combi/EdgeMatrixModel.java
Normal file
|
@ -0,0 +1,251 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.util.*; // listes
|
||||
|
||||
import exception.*;
|
||||
|
||||
public class EdgeMatrixModel implements EdgeModel {
|
||||
private int cardV;
|
||||
private boolean[][] adjacent;
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
**/
|
||||
public EdgeMatrixModel() {
|
||||
this(10);
|
||||
this.cardV=0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor with card (number of vertices) as a parameter
|
||||
**/
|
||||
public EdgeMatrixModel(int card) {
|
||||
this.cardV=card;
|
||||
this.adjacent=new boolean[this.cardV][this.cardV];
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la dimension de cette matrice d'adjance
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.cardV;
|
||||
}
|
||||
|
||||
/** Fonction qui réinitialise à la taille donnée.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
cardV=size;
|
||||
adjacent=new boolean[size][size];
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un arc partant du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public void addEdge(int srcV,int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
// plustard qu'on parse un graphe et rajoute des arcs sans
|
||||
// passer par l'initialisation, il faut detecter le cas qu'on
|
||||
// rajoute un arc n'importe quoi
|
||||
{
|
||||
if ((srcV<0) ||(dstV<0)
|
||||
||(srcV>=cardV) || (dstV>=cardV)) {
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
adjacent[srcV][dstV]=true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie l'existence d'un arc du sommet srcV
|
||||
* vers sommet dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV,int dstV){
|
||||
return adjacent[srcV][dstV];
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int src, Vector dst){
|
||||
Collection srcAdj = getAdjacent(src);
|
||||
int taille = srcAdj.size();
|
||||
int adj=-1;
|
||||
Object[] adjacents=srcAdj.toArray();
|
||||
|
||||
if (taille>dst.size()){
|
||||
//y a des sommets qui ne sont pas dans le tableau
|
||||
return -1;
|
||||
} else {
|
||||
for (int i=0; i<taille; i++){
|
||||
if (!dst.contains(adjacents[i])){
|
||||
return -1;
|
||||
} else {
|
||||
if (adj==-1){
|
||||
adj=((Integer)adjacents[i]).intValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return adj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la source (sommet racine) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getSourceVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[j][i]){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!this.adjacent[i][j]){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[j][i]){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la puis (sommet final) de ce graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalVertice(){
|
||||
int i = -1;
|
||||
|
||||
if (this.cardV != 0){
|
||||
i=0;
|
||||
for (int j=i+1; j<this.cardV; j++){
|
||||
if (this.adjacent[i][j]){
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (this.adjacent[i][j]){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
if (!this.adjacent[j][i]){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie une liste d'adjacence du sommet srcV
|
||||
**/
|
||||
public Collection getAdjacent(int srcV){
|
||||
LinkedList res=new LinkedList();
|
||||
for (int i=0; i<cardV; i++){
|
||||
if (adjacent[srcV][i])
|
||||
res.add(new Integer(i));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public Collection getIncident(int dstV){
|
||||
//TODO: écrire la méthode !!!
|
||||
return new Vector();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui efface tous les arcs du graphe
|
||||
**/
|
||||
public void clear(){
|
||||
// we remove edges between every vertice
|
||||
for (int i=0; i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
this.adjacent[i][j]=false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui cree tous les arcs possibles du graphe
|
||||
**/
|
||||
public void fill(){
|
||||
// we add edges between every vertice
|
||||
for (int i=0; i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
this.adjacent[i][j]=true;
|
||||
}
|
||||
}
|
||||
// but a vertice cannot have an edge to itself
|
||||
for (int i=0;i<this.cardV;i++){
|
||||
this.adjacent[i][i]=false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui rajoute un vertice (sommet) a la liste des arcs du graphe
|
||||
* les arcs sont encore VIDE
|
||||
**/
|
||||
public void addVertice(){
|
||||
// Verify that we have enough free space
|
||||
// and that 4*cardV < 3*adjlength <=> cardV < 3/4 * adj.length
|
||||
if ((4*this.cardV) > (3*this.adjacent.length)){
|
||||
int nuvolen=this.adjacent.length * 2;
|
||||
boolean[][] copie = new boolean[nuvolen][nuvolen];
|
||||
for (int i=0; i<this.cardV; i++){
|
||||
// on copie juste les anciennes valeurs
|
||||
// les nouvelles cases etant initialisee a 0
|
||||
for (int j=0; j<this.cardV; j++){
|
||||
copie[i][j]=adjacent[i][j];
|
||||
}
|
||||
}
|
||||
this.adjacent=copie;
|
||||
}
|
||||
this.cardV++;
|
||||
}
|
||||
|
||||
public void removeVerticeAt(int rmIdx)
|
||||
throws OutOfRangeVerticeException{
|
||||
if ((rmIdx<0) || (rmIdx>=this.cardV)){
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
// create a new array (cardV-1) * (cardV-1)
|
||||
boolean[][] neoAdj= new boolean[this.cardV-1][this.cardV-1];
|
||||
|
||||
// fill the new array zith the values of the previous
|
||||
// adjacency matrix
|
||||
int ni=0;
|
||||
int nj=0;
|
||||
|
||||
for (int i=0;i<this.cardV;i++){
|
||||
for (int j=0;j<this.cardV;j++){
|
||||
if ((i!=rmIdx) || (j!=rmIdx)){
|
||||
if (i<rmIdx){ni=i; }
|
||||
if (i>rmIdx){ni=i-1; }
|
||||
if (j<rmIdx){nj=j; }
|
||||
if (j>rmIdx){nj=j-1; }
|
||||
neoAdj[ni][nj]=this.adjacent[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
// associate the new adjacency matrix to the class
|
||||
this.cardV=this.cardV-1;
|
||||
this.adjacent=neoAdj;
|
||||
}
|
||||
|
||||
}
|
BIN
src/chocobar/combi/EdgeModel.class
Normal file
BIN
src/chocobar/combi/EdgeModel.class
Normal file
Binary file not shown.
23
src/chocobar/combi/EdgeModel.java
Normal file
23
src/chocobar/combi/EdgeModel.java
Normal file
|
@ -0,0 +1,23 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.util.Collection; // listes
|
||||
import java.util.Vector;
|
||||
|
||||
import exception.*;
|
||||
|
||||
public interface EdgeModel {
|
||||
public int getCardV();
|
||||
public void addEdge(int srcV,int dstV) throws OutOfRangeVerticeException;
|
||||
public boolean isEdge(int srcV,int dstV);
|
||||
public int setSize(int size);
|
||||
public int withOnlyEdges(int srcV, Vector dstV);
|
||||
public Collection getAdjacent(int srcV);
|
||||
public Collection getIncident(int dstV);
|
||||
public int getSourceVertice(); //racine du graphe
|
||||
public int getFinalVertice(); //sommet final (un seul) du graphe
|
||||
public void clear(); //no edges
|
||||
public void fill(); //edges to everywhere
|
||||
|
||||
public void addVertice(); // add vertice at the end
|
||||
public void removeVerticeAt(int index) throws OutOfRangeVerticeException;
|
||||
}
|
BIN
src/chocobar/combi/Graph.class
Normal file
BIN
src/chocobar/combi/Graph.class
Normal file
Binary file not shown.
313
src/chocobar/combi/Graph.java
Normal file
313
src/chocobar/combi/Graph.java
Normal file
|
@ -0,0 +1,313 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*; // listes
|
||||
import java.text.*; // streamtokenizer
|
||||
|
||||
import exception.*;
|
||||
import graph.GenericGraph;
|
||||
import graph.Vertice;
|
||||
import conf.ChocoConfig;
|
||||
|
||||
public class Graph implements GenericGraph
|
||||
{
|
||||
private EdgeModel edgeModel;
|
||||
private boolean isListModel;
|
||||
private String name;
|
||||
private VerticeSet verticeModel;
|
||||
|
||||
public Graph(){
|
||||
this.edgeModel=null;
|
||||
this.name=null;
|
||||
this.isListModel=false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructeur par defaut
|
||||
**/
|
||||
public Graph(VerticeSet vmodel){
|
||||
this.edgeModel=null;
|
||||
this.name=null;
|
||||
this.isListModel=false;
|
||||
this.verticeModel=vmodel;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructeur d'un graphe non-initialise avec cardV sommets
|
||||
**/
|
||||
public Graph (VerticeSet vmodel,boolean isList, int cardV){
|
||||
this(vmodel);
|
||||
this.isListModel=isList;
|
||||
if (isList){
|
||||
this.edgeModel=new EdgeListModel(cardV);
|
||||
} else {
|
||||
this.edgeModel=new EdgeMatrixModel(cardV);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructeur d'un graphe initialise a partir
|
||||
* du fichier filename
|
||||
**/
|
||||
public Graph(VerticeSet vmodel,boolean isList, String filename)
|
||||
throws ParseException, IOException, FileNotFoundException
|
||||
{
|
||||
this(vmodel,isList,0);
|
||||
this.loadFromFile(filename);
|
||||
}
|
||||
|
||||
/** Initialize the Graph.
|
||||
*/
|
||||
public int setSize(int size)
|
||||
{
|
||||
try {
|
||||
Class cEM = Class.forName("chocobar.combi."+ChocoConfig.edgeModel);
|
||||
this.edgeModel = (EdgeModel) cEM.newInstance();
|
||||
this.edgeModel.setSize(size);
|
||||
} catch (Exception e) {
|
||||
this.edgeModel = null;
|
||||
e.printStackTrace();
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
public void addEdge(int x, int y)
|
||||
{
|
||||
try {
|
||||
this.edgeModel.addEdge(x, y);
|
||||
} catch (OutOfRangeVerticeException e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie l'indice du vertice passe
|
||||
* en parametre dans le vecteur des vertices de ce graphe
|
||||
**/
|
||||
public int indexOfVertice(Vertice e){
|
||||
return this.verticeModel.getIdOf(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction d'initialisation du graphe a partir d'un fichier
|
||||
**/
|
||||
public void loadFromFile(String filename)
|
||||
throws ParseException, IOException, FileNotFoundException
|
||||
{
|
||||
int verticeNb;
|
||||
FileReader fi=new FileReader(filename);
|
||||
StreamTokenizer si=new StreamTokenizer(fi);
|
||||
si.eolIsSignificant(false);
|
||||
si.lowerCaseMode(false);
|
||||
si.parseNumbers();
|
||||
|
||||
/* parse the name of the graph */
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_WORD){
|
||||
this.name=new String(si.sval);
|
||||
} else {
|
||||
throw new ParseException("Bad graph name",0);
|
||||
}
|
||||
|
||||
/* Parse number of vertices */
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||
verticeNb=(int)si.nval;
|
||||
if (this.isListModel){
|
||||
this.edgeModel=new EdgeListModel(verticeNb);
|
||||
} else {
|
||||
this.edgeModel=new EdgeMatrixModel(verticeNb);
|
||||
}
|
||||
} else {
|
||||
throw new ParseException("Bad graph size",0);
|
||||
}
|
||||
|
||||
/* Parse matrix */
|
||||
for (int i=0; i<verticeNb;i++){
|
||||
for (int j=0; j<verticeNb; j++){
|
||||
si.nextToken();
|
||||
if (si.ttype==StreamTokenizer.TT_NUMBER){
|
||||
if (si.nval==0) {
|
||||
// do nothing
|
||||
} else {
|
||||
// add an edge to the graph
|
||||
try {
|
||||
this.edgeModel.addEdge(i,j);
|
||||
} catch (OutOfRangeVerticeException e){
|
||||
throw new ParseException("Unknown vertice used",0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
throw new ParseException("Bad graph matrix",0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui verifie si les sommets adjacents a src sont
|
||||
* uniquement les sommets contenus dans le tableau dst
|
||||
* Si non alors elle renvoie -1 et si oui elle renvoie le premier
|
||||
* sommet dst adjacent a src
|
||||
**/
|
||||
public int withOnlyEdges(int src, Vector dst){
|
||||
return this.edgeModel.withOnlyEdges(src, dst);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of vertices of the Graph
|
||||
**/
|
||||
public int getCardV(){
|
||||
return this.verticeModel.size();
|
||||
}
|
||||
|
||||
public VerticeSet getVerticeModel(){
|
||||
return this.verticeModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the vertice at index vertIdx
|
||||
* range verification is done by verticetab...
|
||||
**/
|
||||
|
||||
public Vertice getVertice(int vertIdx) {
|
||||
return ((Vertice)this.verticeModel.elementAt(vertIdx));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fonction qui verifie l'existence de l'arc
|
||||
* du sommet srcV vers dstV
|
||||
**/
|
||||
public boolean isEdge(int srcV, int dstV){
|
||||
return this.edgeModel.isEdge(srcV, dstV);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie l'indice du vertice racine du graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getInitialState(){
|
||||
return this.edgeModel.getSourceVertice();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie l'indice du vertice final du graphe
|
||||
* ou -1 s'il n'existe pas
|
||||
**/
|
||||
public int getFinalState(){
|
||||
return this.edgeModel.getFinalVertice();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie la liste d'adjacence du sommet srcV
|
||||
**/
|
||||
public Collection getAdjacent(int srcV)
|
||||
throws OutOfRangeVerticeException
|
||||
{
|
||||
if ((srcV<0) || (srcV >= verticeModel.size())){
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
return this.edgeModel.getAdjacent(srcV);
|
||||
}
|
||||
|
||||
public Collection getIncident(int dstV)
|
||||
throws OutOfRangeVerticeException
|
||||
{
|
||||
if ((dstV<0) || (dstV >= verticeModel.size())){
|
||||
throw new OutOfRangeVerticeException();
|
||||
}
|
||||
return this.edgeModel.getIncident(dstV);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie representation (sous forme de String)
|
||||
* du graphe en format .txt
|
||||
**/
|
||||
public String toTxt(){
|
||||
StringBuffer output;
|
||||
if (this.verticeModel != null)
|
||||
output=new StringBuffer(4*this.verticeModel.size());
|
||||
else
|
||||
output=new StringBuffer(80);
|
||||
String endl=System.getProperty("line.separator");
|
||||
if ((this.name) != null){
|
||||
output.append(this.name+endl);
|
||||
} else {
|
||||
output.append("noName"+endl);
|
||||
}
|
||||
if (this.edgeModel==null){
|
||||
output.append("0"+endl);
|
||||
} else {
|
||||
int taille=this.edgeModel.getCardV();
|
||||
output.append(""+taille+endl);
|
||||
for (int i=0;i<taille;i++){
|
||||
for (int j=0; j<taille; j++){
|
||||
if (this.edgeModel.isEdge(i,j)){
|
||||
output.append("1 ");
|
||||
} else {
|
||||
output.append("0 ");
|
||||
}
|
||||
}
|
||||
output.append(endl);
|
||||
}
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction qui renvoie representation (sous forme de String)
|
||||
* du graphe en format .dot
|
||||
**/
|
||||
public String toDot(){
|
||||
StringBuffer output;
|
||||
String tempName;
|
||||
String endl=System.getProperty("line.separator");
|
||||
|
||||
if (this.name==null){
|
||||
tempName="noName";
|
||||
} else {
|
||||
tempName=this.name;
|
||||
}
|
||||
output=new StringBuffer("digraph "+tempName+" {"+endl);
|
||||
if (this.edgeModel==null) {
|
||||
output.append("}"+endl);
|
||||
} else {
|
||||
output=new StringBuffer("digraph "+this.name+" {");
|
||||
output=output.append(endl);
|
||||
|
||||
// Pour l'instant label vaut le sommet d'ou l'arc part
|
||||
int taille=this.edgeModel.getCardV();
|
||||
for (int i=0; i<taille; i++){
|
||||
Collection adj=this.edgeModel.getAdjacent(i);
|
||||
output.append(i);
|
||||
output.append(" [label=");
|
||||
output.append(i);
|
||||
output.append("];");
|
||||
output.append(endl);
|
||||
//output.append(adj);
|
||||
if (adj!=null){
|
||||
Iterator j=adj.iterator();
|
||||
while(j.hasNext()){
|
||||
output.append(" ");
|
||||
output.append(i);
|
||||
output.append(" -> ");
|
||||
output.append((Integer)j.next());
|
||||
output.append(" ;");
|
||||
output.append(endl);
|
||||
}
|
||||
}
|
||||
}
|
||||
output=output.append("}"+endl);
|
||||
}
|
||||
return output.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
BIN
src/chocobar/combi/VerticeSet.class
Normal file
BIN
src/chocobar/combi/VerticeSet.class
Normal file
Binary file not shown.
10
src/chocobar/combi/VerticeSet.java
Normal file
10
src/chocobar/combi/VerticeSet.java
Normal file
|
@ -0,0 +1,10 @@
|
|||
package chocobar.combi;
|
||||
|
||||
import graph.Vertice;
|
||||
|
||||
public interface VerticeSet {
|
||||
public boolean contains(Vertice v);
|
||||
public Vertice elementAt(int idx);
|
||||
public int getIdOf(Vertice v);
|
||||
public int size();
|
||||
}
|
BIN
src/conf/ChocoConfig.class
Normal file
BIN
src/conf/ChocoConfig.class
Normal file
Binary file not shown.
47
src/conf/ChocoConfig.java
Normal file
47
src/conf/ChocoConfig.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
package conf;
|
||||
|
||||
/**
|
||||
* Classe pour la configuration
|
||||
*/
|
||||
|
||||
public final class ChocoConfig
|
||||
{
|
||||
/*
|
||||
* Cannot Instantiate it
|
||||
*/
|
||||
private ChocoConfig() {}
|
||||
|
||||
/**
|
||||
* Définit la taille de la ChocoBar.
|
||||
* On utilise 8 x 6 pour les benchmark
|
||||
*/
|
||||
public static int size;
|
||||
public static int height;
|
||||
|
||||
/**
|
||||
* Définit le style de ChocoBar à utiliser.
|
||||
* Par exemple :
|
||||
* - cbl ( avec une liste de BreakPoints )
|
||||
* - combi ( à base de combinaisons )
|
||||
*/
|
||||
public static String chocoBarStyle = "combi";
|
||||
|
||||
/**
|
||||
* Définit la classe de ChocoBar à utiliser.
|
||||
* Par exemple :
|
||||
* - cbl.ChocoBar
|
||||
* - combi.ChocoBarLong
|
||||
* - combi.ChocoBarBigInt
|
||||
* - combi.ChocoBarArray
|
||||
*/
|
||||
public static String chocoBarModel = "combi.ChocoBarLong";
|
||||
|
||||
/**
|
||||
* Définit la classe de EdgeModel à utiliser.
|
||||
* - EdgeBigIntModel
|
||||
* - EdgeBitSetModel
|
||||
* - EdgeListModel
|
||||
* - EdgeMatrixModel
|
||||
*/
|
||||
public static String edgeModel = "EdgeBigIntModel";
|
||||
}
|
BIN
src/exception/AlreadyBrokenPointException.class
Normal file
BIN
src/exception/AlreadyBrokenPointException.class
Normal file
Binary file not shown.
3
src/exception/AlreadyBrokenPointException.java
Normal file
3
src/exception/AlreadyBrokenPointException.java
Normal file
|
@ -0,0 +1,3 @@
|
|||
package exception;
|
||||
|
||||
public class AlreadyBrokenPointException extends Exception { }
|
BIN
src/exception/OutOfRangeBreakPointException.class
Normal file
BIN
src/exception/OutOfRangeBreakPointException.class
Normal file
Binary file not shown.
3
src/exception/OutOfRangeBreakPointException.java
Normal file
3
src/exception/OutOfRangeBreakPointException.java
Normal file
|
@ -0,0 +1,3 @@
|
|||
package exception;
|
||||
|
||||
public class OutOfRangeBreakPointException extends Exception { }
|
BIN
src/exception/OutOfRangeVerticeException.class
Normal file
BIN
src/exception/OutOfRangeVerticeException.class
Normal file
Binary file not shown.
3
src/exception/OutOfRangeVerticeException.java
Normal file
3
src/exception/OutOfRangeVerticeException.java
Normal file
|
@ -0,0 +1,3 @@
|
|||
package exception;
|
||||
|
||||
public class OutOfRangeVerticeException extends Exception { }
|
103
src/graph.dot
Normal file
103
src/graph.dot
Normal file
|
@ -0,0 +1,103 @@
|
|||
digraph null {
|
||||
0 [label=0];
|
||||
0 -> 2 ;
|
||||
0 -> 13 ;
|
||||
0 -> 4 ;
|
||||
0 -> 19 ;
|
||||
0 -> 1 ;
|
||||
0 -> 18 ;
|
||||
0 -> 14 ;
|
||||
0 -> 3 ;
|
||||
0 -> 5 ;
|
||||
1 [label=1];
|
||||
1 -> 2 ;
|
||||
1 -> 13 ;
|
||||
1 -> 4 ;
|
||||
1 -> 19 ;
|
||||
1 -> 18 ;
|
||||
1 -> 14 ;
|
||||
1 -> 3 ;
|
||||
1 -> 5 ;
|
||||
2 [label=2];
|
||||
2 -> 17 ;
|
||||
2 -> 13 ;
|
||||
2 -> 4 ;
|
||||
2 -> 16 ;
|
||||
2 -> 14 ;
|
||||
2 -> 3 ;
|
||||
2 -> 5 ;
|
||||
3 [label=3];
|
||||
3 -> 4 ;
|
||||
3 -> 9 ;
|
||||
3 -> 8 ;
|
||||
3 -> 11 ;
|
||||
3 -> 12 ;
|
||||
3 -> 5 ;
|
||||
4 [label=4];
|
||||
4 -> 6 ;
|
||||
4 -> 7 ;
|
||||
4 -> 5 ;
|
||||
5 [label=5];
|
||||
6 [label=6];
|
||||
6 -> 5 ;
|
||||
7 [label=7];
|
||||
7 -> 6 ;
|
||||
7 -> 5 ;
|
||||
8 [label=8];
|
||||
8 -> 4 ;
|
||||
8 -> 9 ;
|
||||
8 -> 10 ;
|
||||
8 -> 5 ;
|
||||
9 [label=9];
|
||||
9 -> 6 ;
|
||||
9 -> 5 ;
|
||||
10 [label=10];
|
||||
10 -> 9 ;
|
||||
10 -> 7 ;
|
||||
10 -> 5 ;
|
||||
11 [label=11];
|
||||
11 -> 4 ;
|
||||
11 -> 9 ;
|
||||
11 -> 8 ;
|
||||
11 -> 12 ;
|
||||
12 [label=12];
|
||||
12 -> 9 ;
|
||||
12 -> 10 ;
|
||||
12 -> 7 ;
|
||||
13 [label=13];
|
||||
13 -> 15 ;
|
||||
13 -> 4 ;
|
||||
13 -> 8 ;
|
||||
13 -> 14 ;
|
||||
13 -> 5 ;
|
||||
14 [label=14];
|
||||
14 -> 9 ;
|
||||
14 -> 6 ;
|
||||
14 -> 5 ;
|
||||
15 [label=15];
|
||||
15 -> 14 ;
|
||||
15 -> 7 ;
|
||||
15 -> 10 ;
|
||||
15 -> 5 ;
|
||||
16 [label=16];
|
||||
16 -> 17 ;
|
||||
16 -> 13 ;
|
||||
16 -> 4 ;
|
||||
16 -> 11 ;
|
||||
16 -> 14 ;
|
||||
17 [label=17];
|
||||
17 -> 15 ;
|
||||
17 -> 14 ;
|
||||
17 -> 7 ;
|
||||
17 -> 12 ;
|
||||
18 [label=18];
|
||||
18 -> 13 ;
|
||||
18 -> 19 ;
|
||||
18 -> 16 ;
|
||||
18 -> 14 ;
|
||||
19 [label=19];
|
||||
19 -> 17 ;
|
||||
19 -> 15 ;
|
||||
19 -> 14 ;
|
||||
}
|
||||
|
BIN
src/graph.out
Normal file
BIN
src/graph.out
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
src/graph.png
Normal file
BIN
src/graph.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
src/graph/EdgeModel.class
Normal file
BIN
src/graph/EdgeModel.class
Normal file
Binary file not shown.
21
src/graph/EdgeModel.java
Normal file
21
src/graph/EdgeModel.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package graph;
|
||||
|
||||
import java.util.Collection; // listes
|
||||
|
||||
import exception.*;
|
||||
|
||||
public interface EdgeModel {
|
||||
public int getCardV();
|
||||
public void addEdge(int srcV,int dstV) throws OutOfRangeVerticeException;
|
||||
public boolean isEdge(int srcV,int dstV);
|
||||
public Collection getAdjacent(int srcV);
|
||||
public Collection getIncident(int dstV);
|
||||
public int getSourceVertice(); //racine du graphe
|
||||
public int getFinalVertice(); //sommet final (un seul) du graphe
|
||||
public void clear(); //no edges
|
||||
public void fill(); //edges to everywhere
|
||||
|
||||
public void addVertice(); // add vertice at the end
|
||||
public void removeVerticeAt(int index) throws OutOfRangeVerticeException;
|
||||
}
|
||||
|
BIN
src/graph/GenericGraph.class
Normal file
BIN
src/graph/GenericGraph.class
Normal file
Binary file not shown.
24
src/graph/GenericGraph.java
Normal file
24
src/graph/GenericGraph.java
Normal file
|
@ -0,0 +1,24 @@
|
|||
package graph;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.io.IOException;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.util.Collection;
|
||||
import java.util.Vector;
|
||||
|
||||
import exception.*;
|
||||
|
||||
public interface GenericGraph
|
||||
{
|
||||
public int getInitialState();
|
||||
public int getFinalState();
|
||||
public int getCardV();
|
||||
public int setSize(int size);
|
||||
public Collection getAdjacent(int i) throws OutOfRangeVerticeException;
|
||||
public Collection getIncident(int i) throws OutOfRangeVerticeException;
|
||||
public String toDot();
|
||||
public String toTxt();
|
||||
public int withOnlyEdges(int sommetInt, Vector gagnant);
|
||||
public void loadFromFile(String filename)
|
||||
throws ParseException, IOException, FileNotFoundException;
|
||||
}
|
BIN
src/graph/Vertice.class
Normal file
BIN
src/graph/Vertice.class
Normal file
Binary file not shown.
8
src/graph/Vertice.java
Normal file
8
src/graph/Vertice.java
Normal file
|
@ -0,0 +1,8 @@
|
|||
package graph;
|
||||
|
||||
public interface Vertice {
|
||||
public void setLabel(String l);
|
||||
public String getLabel();
|
||||
public void setColor(int c);
|
||||
public int getColor();
|
||||
}
|
BIN
src/graph/VerticeSet.class
Normal file
BIN
src/graph/VerticeSet.class
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue